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
編寫配置文件
配置文件需要在每台服務器中都要編寫,以下是一個配置文件的樣本:
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查看三者狀態: