ZooKeeper的集羣模式下,多個Zookeeper服務器在工做前會選舉出一個Leader,在接下來的工做中這個被選舉出來的Leader死了,而剩下的Zookeeper服務器會知道這個Leader死掉了,在活着的Zookeeper集羣中會繼續選出一個Leader,選舉出Leader的目的是爲了能夠在分佈式的環境中保證數據的一致性。html
確認集羣服務器的數量
因爲ZooKeeper集羣中,會有一個Leader負責管理和協調其餘集羣服務器,所以服務器的數量一般都是單數,例如3,5,7...等,這樣2n+1的數量的服務器就能夠容許最多n臺服務器的失效。服務器
eg、該案例使用三臺服務器模擬搭建部署ZooKeeper集羣,集羣機器IP以下:分佈式
192.168.1.100 192.168.1.101 192.168.1.102
編寫配置文件
配置文件須要在每臺服務器中都要編寫,如下是一個配置文件的樣本:3d
dataDir=/home/jqlin/dev/zookeeper-3.4.6/data tickTime=2000 initLimit=5 syncLimit=2 clientPort=2181 server.0=192.168.1.100:2888:3888 server.1=192.168.1.101:2888:3888 server.2=192.168.1.102:2888:3888
配置參數說明
initLimit:這個配置項是用來配置Zookeeper接受客戶端初始化鏈接時最長能忍受多少個心跳時間間隔數。當已經超過10個心跳的時間長度後Zookeeper服務器尚未收到客戶端的返回信息,那麼代表這個客戶端鏈接失敗。總的時間長度就是5*2000=10秒(即tickTime*initLimit=10秒)。
注意:
一、Leader/Follower:領導者/追隨者
二、這裏所說的客戶端不是用戶鏈接Zookeeper服務器的客戶端,而是Zookeeper服務器集羣中鏈接到Leader的Follower服務器code
syncLimit:這個配置項標識Leader與Follower之間發送消息,請求和應答時間長度,最長不能超過多少個tickTime的時間長度,總的時間長度就是2*2000=4秒server
server.A=B:C:D配置項
A:這是一個數字,表示這是第幾號服務器
B:A服務器的IP地址
C:通信端口,即A服務器與集羣中的 Leader 服務器交換信息的端口
D:選舉通信端口,表示的是萬一集羣中的 Leader 服務器掛了,須要一個端口來從新進行選舉,選出一個新的 Leader,而這個端口就是用來執行選舉時服務器相互通訊的端口。若是是僞集羣的配置方式,因爲 B 都是同樣,因此不一樣的 Zookeeper 實例通訊端口號不能同樣,因此要給它們分配不一樣的端口號。htm
建立myid文件
除了修改 zoo.cfg 配置文件,集羣模式下還要配置一個文件 myid,這個文件在 dataDir 目錄下,這個文件裏面就只有一個數據就是 A 的值,Zookeeper 啓動時會讀取這個文件,拿到裏面的數據與 zoo.cfg 裏面的配置信息比較從而判斷究竟是那個server。blog
eg、
192.168.1.100對應myid文件內容:部署
192.168.1.101對應myid文件內容:
192.168.1.102對應myid文件內容:
注意:myid文件要本身建立,在dataDir目錄下
執行運行腳本
和單機模式下的運行方式基本相同,值得注意的地方就是要分別在不一樣服務器上執行一次,例如分別在100,101,102上運行:
jqlin@jqlin-VirtualBox:~/dev/zookeeper-3.4.6/bin$ ./zkServer.sh start
這樣才能使得整個集羣啓動起來。
查看三者狀態
使用bin/zkServer.sh status查看三者狀態: