===> Zookeeper 是什麼?
=> ZooKeeper是一個分布式的,開放源碼的分布式應用程式協調服務,是Google的Chubby一個開源的實作,是Hadoop和Hbase的重要元件。
=> ZooKeeper包含一個簡單的原語集,提供Java和C的接口。
=> ZooKeeper代碼版本中,提供了分布式獨享鎖、選舉、隊列的接口,代碼在zookeeper-3.4.3\src\recipes。其中分布鎖和隊列有Java和C兩個版本,選舉隻有Java版本
===> Zookeeper應用場景(功能):
=> 它是一個為分布式應用提供一緻性服務的軟體,提供的功能包括:
配置維護、域名服務、分布式同步、組服務等。
=> ZooKeeper的目标就是封裝好複雜易出錯的關鍵服務,将簡單易用的接口和性能高效、功能穩定的系統提供給使用者。
===> Zookeeper體系結構
===> Zookeeper 工作原理:
=> Zookeeper 的核心是原子廣播,這個機制保證了各個Server之間的同步。實作這個機制的協定叫做Zab協定。
=> Zab協定有兩種模式: 恢複模式(選主)和廣播模式(同步)。
當服務啟動或者在上司者崩潰後,Zab就進入了恢複模式,當上司者被選舉出來,且大多數Server完成了和 leader的狀态同步以後,恢複模式就結束了。
()狀态同步保證了leader和Server具有相同的系統狀态。
=> 為了保證事務的順序一緻性,zookeeper采用了遞增的事務id号(zxid)來辨別事務。所有的提議(proposal)都在被提出的時候加上了zxid。
實作中zxid是一個64位的數字,它高32位是epoch用來辨別leader關系是否改變,每次一個leader被選出來,它都會有一個新的epoch,辨別目前屬于那個leader的統治時期。
低32位用于遞增計數。
()對于用戶端來說,ZooKeeper是一個整體(ensemble),連接配接到ZooKeeper叢集實際上感覺在獨享整個叢集的服務,so,你可以在任何一個結點上建立到服務叢集的連接配接
===> Zookeeper 安裝
=>搭建ZooKeeper的叢集環境
1、三台:bigdata12 bigdata13 bigdata14
時間同步
2、在bigdata12上進行安裝
(*) 解壓 tar -zxvf zookeeper-3.4.10.tar.gz -C ~/training/
(*) 設定環境變量:每台機器上
ZOOKEEPER_HOME=/root/training/zookeeper-3.4.10
export ZOOKEEPER_HOME
PATH=$ZOOKEEPER_HOME/bin:$PATH
export PATH
(*)核心的配置檔案: conf/zoo.cfg
mkdir /root/training/zookeeper-3.4.10/tmp
編輯 zoo.cfg
dataDir=/root/training/zookeeper-3.4.10/tmp
server.1=bigdata12:2888:3888
server.2=bigdata13:2888:3888
server.3=bigdata14:2888:3888
在/root/training/zookeeper-3.4.10/tmp目錄建立檔案: myid
輸入 1
3、把bigdata12的ZK複制到其他的節點
scp -r zookeeper-3.4.10/ root@bigdata13:/root/training
scp -r zookeeper-3.4.10/ root@bigdata14:/root/training
4、修改bigdata13和bigdata14上的myid檔案
5、在每台機器上,啟動ZK: zkServer.sh start
===> 配置檔案
=> zookeeper-3.3.3/conf檔案夾下面(可以把預設的zoosample.cfg複制一份到zoo.cfg),配置檔案zoo.cfg需要在每台伺服器中都要編寫,以下是一個配置檔案的樣本:
# Filename zoo.cfg
tickTime=2000
dataDir=/home/zookeeper/data
clientPort=2181
initLimit=5
syncLimit=2
server.1=202.115.36.251:2888:3888
server.2=202.115.36.241:2888:3888
server.3=202.115.36.242:2888:3888
initLimit:這個配置項是用來配置 Zookeeper 接受用戶端(這裡所說的用戶端不是使用者連接配接 Zookeeper 伺服器的用戶端,而是 Zookeeper 伺服器叢集中連接配接到 Leader 的 Follower 伺服器)初始化連接配接時最長能忍受多少個心跳時間間隔數。當已經超過 10 個心跳的時間(也就是 tickTime)長度後 Zookeeper 伺服器還沒有收到用戶端的傳回資訊,
那麼表明這個用戶端連接配接失敗。總的時間長度就是 5*2000=10 秒。
syncLimit:這個配置項辨別 Leader 與 Follower 之間發送消息,請求和應答時間長度,最長不能超過多少個 tickTime 的時間長度,總的時間長度就是 2*2000=4 秒
server.A=B:C:D
A 是一個數字,表示這個是第幾号伺服器;
B 是這個伺服器的 ip 位址;
C 表示的是這個伺服器與叢集中的 Leader 伺服器交換資訊的端口;
D 表示的是萬一叢集中的 Leader 伺服器挂了,需要一個端口來重新進行選舉,選出一個新的 Leader,而這個端口就是用來執行選舉時伺服器互相通信的端口。
如果是僞叢集的配置方式,由于 B 都是一樣,是以不同的 Zookeeper 執行個體通信端口号不能一樣,是以要給它們配置設定不同的端口号。
=> 建立myid檔案
除了修改 zoo.cfg 配置檔案,叢集模式下還要配置一個檔案 myid,這個檔案在 dataDir 目錄下,這個檔案裡面就隻有一個資料就是 A 的值,Zookeeper 啟動時會讀取這個文
件,拿到裡面的資料與 zoo.cfg 裡面的配置資訊比較進而判斷到底是那個 server。這個myid的值要和配置檔案中的server.x=ip:port:port中的x一緻。
echo 1 > myid
===> Zookeeper 操作
=> 檢視zookeeper 的狀态: zkServer.sh status
=> 通過 zookeeper 用戶端連接配接:
zkCli.sh -server 192.168.10.221:2181
=> 檢視znode節點:
ls /
=> 建立znode節點(資料):
create /test "hello"
=> 擷取znode節點資料:
get /test
=> 修改znode節點資料:
set /test "word"
=> 删除znode 節點:
delete /test
===> 清除zk狀态
當在zk上已經做了很多事情,配置已經比較雜亂,現在想重新初始化一下,也就是把所有狀态删除,步驟是:
=> 關閉所有zk節點,用zkServer.sh status檢視是否關閉
=> 删除zoo.cfg定義的資料檔案夾下的所有檔案,除了myid檔案外
=> 啟動zk節點
現在配置就重置了
===> 常見問題
在用zkCli.sh啟動用戶端時,Will not attempt to authenticate using SASL (無法定位登入配置)
這是由于沒有啟用使用者驗證導緻的,不影響使用,但影響安全性。SASL 即:Simple Authentication and Security Layer
本文轉自 菜鳥的征程 51CTO部落格,原文連結:http://blog.51cto.com/songqinglong/2062909