天天看點

ZooKeeper叢集搭建

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檔案内容:

ZooKeeper叢集搭建

192.168.1.101對應myid檔案内容:

ZooKeeper叢集搭建

192.168.1.102對應myid檔案内容:

ZooKeeper叢集搭建

注意:myid檔案要自己建立,在dataDir目錄下

執行運作腳本

和單機模式下的運作方式基本相同,值得注意的地方就是要分别在不同伺服器上執行一次,例如分别在100,101,102上運作:

jqlin@jqlin-VirtualBox:~/dev/zookeeper-3.4.6/bin$ ./zkServer.sh start

這樣才能使得整個叢集啟動起來。

檢視三者狀态

使用bin/zkServer.sh status檢視三者狀态: