zookeepe r伺服器端執行有兩種模式:單機模式(standalone)、仲裁模式(quorum),單機模式就是字面意思:由一個單獨的伺服器提供服務。仲裁模式則有一組 zookeeper 伺服器,它們之間可以進行資料的複製,並同時服務於客戶端。標題所說的 zookeeper 叢集就是執行仲裁模式,這也是生產中實際會使用的方式。
在叢集中,為了使任何一個節點掛掉都不會影響整個叢集的資料一致性,叢集中節點的數量公式為 2n+1 臺,除非掛掉大於 n 臺(這裡的節點就是一個 zookeeper 伺服器的意思,也就是執行一個 zookeeper 的服務端程式)。為了演示這個例子,將跑3個 zookeeper 服務端程式。
安裝
在官網下載zookeeper的壓縮包,一般是 tar 的壓縮包,下載完之後用 tar -xvf 解壓縮,解壓之後的 bin 目錄下即執行 zookeeper 命令的 shell 指令碼:
配置
為了執行3個 zookeeper 服務端程式,新建存放這3個程式執行和配置資料的目錄,比如叫 z1、z2、z3 。在這3個目錄下都建一個 data 目錄用於存放程式執行時的資料,接著在這3個目錄都新建一個叫 myid 的檔案,內容分別為1、2、3(即 z1 下 myid 的內容是1、z2 下 myid 的內容是2、z3 下 myid 的內容是3),最後在這3個目錄下都建一個 .cfg 結尾的配置檔案。
z1 目錄下的配置檔案叫 z1.cfg,內容如下:
tickTime=2000
initLimit=10
syncLimit=5
dataDir=$(z1所在目錄的全路徑)/data
clientPort=2981
server.1=127.0.0.1:2222:2223
server.2=127.0.0.1:3333:3334
server.3=127.0.0.1:4444:4445
複製程式碼
z2 目錄下的配置檔案叫 z2.cfg,內容如下:
tickTime=2000
initLimit=10
syncLimit=5
dataDir=$(z2所在目錄的全路徑)/data
clientPort=2982
server.1=127.0.0.1:2222:2223
server.2=127.0.0.1:3333:3334
server.3=127.0.0.1:4444:4445
複製程式碼
z3 目錄下的配置檔案叫 z3.cfg,內容如下:
tickTime=2000
initLimit=10
syncLimit=5
dataDir=$(z3所在目錄的全路徑)/data
clientPort=2983
server.1=127.0.0.1:2222:2223
server.2=127.0.0.1:3333:3334
server.3=127.0.0.1:4444:4445
複製程式碼
tickTime:伺服器之間或客戶端與伺服器之間維持心跳的時間間隔,也就是每隔 tickTime 時間就會傳送一個心跳,以毫秒為單位。也是 zookeeper 中的時間單元,zookeeper 中所有時間都是以這個時間單元為基礎,進行整數倍配置的。例如,session 的最小超時時間是 2*tickTime 。
initLimit 和 syncLimit:都是表示連線的心跳數,具體含義暫時可以不用管。
dataDir:zookeeper 儲存資料的目錄,預設情況下 zookeeper 寫資料的日誌檔案也儲存在這個目錄裡。
clientPort:客戶端連線伺服器的埠,zookeeper 會監聽這個埠,接受客戶端的訪問請求。
server.N:XXXX:P1:P2 。其中 N 表示伺服器編號,XXXX 表示該伺服器的 IP 地址,P1 和 P2 是兩個 TCP 埠號,分別用於仲裁和 Learder 選舉。伺服器編號也對應著上面配置的 myid 檔案的內容,比如上面 z1 目錄下的 myid 內容是 1 ,也就是這裡的 server.1 。
啟動
分別啟動3個 zookeeper 程式,啟動時使用上面新建的配置檔案
啟動 z1 :
sh $(zookeeper壓縮包解壓後的全路徑)/bin/zkServer.sh start $(z1所在目錄的全路徑)/z1.cfg
複製程式碼
啟動 z2 :
sh $(zookeeper壓縮包解壓後的全路徑)/bin/zkServer.sh start $(z2所在目錄的全路徑)/z2.cfg
複製程式碼
啟動 z3 :
sh $(zookeeper壓縮包解壓後的全路徑)/bin/zkServer.sh start $(z3所在目錄的全路徑)/z3.cfg
複製程式碼
當看到如下資訊表示 zookeeper 的程式啟動好了
上面是用 zkServer.sh start 命令啟動伺服器,可以用 zkServer.sh status 命令檢視伺服器的狀態,比如
sh $(zookeeper壓縮包解壓後的全路徑)/bin/zkServer.sh status $(z2所在目錄的全路徑)/z2.cfg
複製程式碼
會看到結果:
或者以我本機為例可以看到這三個程式實際是一個 leader 兩個 follower
客戶端連線
用 zkCli.sh 連線 zookeeper ,
sh $(zookeeper壓縮包解壓後的全路徑)/bin/zkCli.sh -server 127.0.0.1:2981,127.0.0.1:2982,127.0.0.1:2983
複製程式碼
2981等埠號就是上面所說的 .cfg 配置檔案中的 clientPort 的值 看到控制檯輸出 CONNECTED 表示連線成功:
之後可以在控制檯中用 ls create delete 等命令操作了。