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 等命令操作了。