ZooKeeper的叢集模式下,多個Zookeeper伺服器在工作前會選舉出一個Leader,在接下來的工作中這個被選舉出來的Leader死了,而剩下的Zookeeper伺服器會知道這個Leader死掉了,在活着的Zookeeper叢集中會繼續選出一個Leader,選舉出Leader的目的是為了可以在分布式的環境中保證資料的一緻性。
确認叢集伺服器的數量
由于ZooKeeper叢集中,會有一個Leader負責管理和協調其他叢集伺服器,是以伺服器的數量通常都是單數,例如3,5,7...等,這樣2n+1的數量的伺服器就可以允許最多n台伺服器的失效。
eg、該案例使用三台伺服器模拟搭建部署ZooKeeper叢集,叢集機器IP如下:
192.168.1.100
192.168.1.101
192.168.1.102
單機ZooKeeper安裝與配置點選此處。
編寫配置檔案
配置檔案需要在每台伺服器中都要編寫,以下是一個配置檔案的樣本:
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秒)。
注意:
1、Leader/Follower:上司者/追随者
2、這裡所說的用戶端不是使用者連接配接Zookeeper伺服器的用戶端,而是Zookeeper伺服器叢集中連接配接到Leader的Follower伺服器
syncLimit:這個配置項辨別Leader與Follower之間發送消息,請求和應答時間長度,最長不能超過多少個tickTime的時間長度,總的時間長度就是2*2000=4秒
server.A=B:C:D配置項
A:這是一個數字,表示這是第幾号伺服器
B:A伺服器的IP位址
C:通訊端口,即A伺服器與叢集中的 Leader 伺服器交換資訊的端口
D:選舉通訊端口,表示的是萬一叢集中的 Leader 伺服器挂了,需要一個端口來重新進行選舉,選出一個新的 Leader,而這個端口就是用來執行選舉時伺服器互相通信的端口。如果是僞叢集的配置方式,由于 B 都是一樣,是以不同的 Zookeeper 執行個體通信端口号不能一樣,是以要給它們配置設定不同的端口号。
建立myid檔案
除了修改 zoo.cfg 配置檔案,叢集模式下還要配置一個檔案 myid,這個檔案在 dataDir 目錄下,這個檔案裡面就隻有一個資料就是 A 的值,Zookeeper 啟動時會讀取這個檔案,拿到裡面的資料與 zoo.cfg 裡面的配置資訊比較進而判斷到底是那個server。
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檢視三者狀态: