Zookeeper_閱讀源碼第一步_在 IDE 里啟動 zkServer(集群版)

  • 2019 年 10 月 3 日
  • 筆記

 

上篇文章Zookeeper_閱讀源碼第一步_在 IDE 里啟動 zkServer(單機版)講了在 idea 里以單機的方式啟動zookeeper,這篇介紹一下以集群的方式啟動。

集群方式啟動,才會真正的用到 Zookeeper 的快速選舉演算法,單機版不涉及選舉。這裡我準備啟動三個zkServer實例。

修改配置文件

首先要準備三個配置文件,具體配置及配置項解釋如下:

# 發送心跳的間隔時間,單位:毫秒
tickTime=2000

# 這個配置項是用來配置 Zookeeper 接受客戶端(這裡所說的客戶端不是用戶連接 Zookeeper 伺服器的客戶端,
# 而是 Zookeeper 伺服器集群中連接到 Leader 的Follower 伺服器)初始化連接時最長能忍受多少個心跳時間間隔數。
# 當已經超過 10 個心跳的時間(也就是 tickTime)長度後 Zookeeper 伺服器還沒有收到客戶端的返回資訊,那麼表明這個客戶端連接失敗。
# 總的時間長度就是 10*2000=20 秒
initLimit=10

# 這個配置項標識 Leader 與 Follower 之間發送消息,請求和應答時間長度,最長不能超過多少個 tickTime 的時間長度,
# 總的時間長度就是 5*2000=10 秒
syncLimit=5

# zookeeper用於存儲快照文件(zookeeper 節點數據)的目錄,無默認值
dataDir=D:/zookeeper/data1

# 用於配置伺服器存儲事務日誌文件的目錄,有默認值dataDir,但是建議將兩個目錄分別配置,
# 防止磁碟的並發讀寫,影響伺服器性能。可將其配置在一個單獨的磁碟上。
dataLogDir=D:/zookeeper/log1

# 客戶端連接 Zookeeper 伺服器的埠,Zookeeper 會監聽這個埠,接受客戶端的訪問請求
clientPort=2181

# server.A=B:C:D 其 中
# A 是一個數字,表示這個是第幾號伺服器,叫做myid或sid;
# B 是這個伺服器的 ip地址;
# C 表示的是這個伺服器與集群中的 Leader 伺服器交換資訊的埠;
# D 表示的是萬一集群中的 Leader 伺服器掛了,需要一個埠來重新進行選舉,選出一個新的 Leader,
# 而這個埠就是用來執行選舉時伺服器相互通訊的埠。如果是偽集群的配置方式,由於 B 都是一樣,
# 所以不同的 Zookeeper 實例通訊埠號不能一樣,所以要給它們分配不同的埠號。
server.1=localhost:2184:3181
server.2=localhost:2185:3182
server.3=localhost:2186:3183

我們只需再複製兩份配置文件,分別明白為 zk1.cfg、zk2.cfg 和 zk3.cfg,並把 clientPort 配置項設置為2181、2182和 2183 即可。

配置多實例

配置文件改好之後,我們只需要創建三個 Application 啟動項即可,把各自的 Program argument 改為對應的配置文件地址即可。

 

 依次啟動1、2、3實例即可。

錯誤處理

錯誤一

啟動會報錯,首先報非法參數異常,原因是找不到文件myid

解決辦法:創建data1目錄,並在其下創建文件myid,另外兩台類似,創建各自的data和log目錄。

Invalid config, exiting abnormally  Disconnected from the target VM, address: '127.0.0.1:58070', transport: 'socket'  2019-08-15 10:37:41,957 [myid:] - ERROR [main:QuorumPeerMain@88] - Invalid config, exiting abnormally  org.apache.zookeeper.server.quorum.QuorumPeerConfig$ConfigException: Error processing D:softzookeeper-3.4.13confzk1.cfg  at org.apache.zookeeper.server.quorum.QuorumPeerConfig.parse(QuorumPeerConfig.java:156)  at org.apache.zookeeper.server.quorum.QuorumPeerMain.initializeAndRun(QuorumPeerMain.java:104)  at org.apache.zookeeper.server.quorum.QuorumPeerMain.main(QuorumPeerMain.java:81)  Caused by: java.lang.IllegalArgumentException: D:zookeeperdata1myid file is missing  at org.apache.zookeeper.server.quorum.QuorumPeerConfig.parseProperties(QuorumPeerConfig.java:408)  at org.apache.zookeeper.server.quorum.QuorumPeerConfig.parse(QuorumPeerConfig.java:152)  ... 2 more

 
 data1、data2、data3分別創建myid對應文件內容1、2、3
 
錯誤二
解決完錯誤一後,重新啟動,又報錯,同樣是非法參數,serverid不是數字。
解決辦法:在剛才創建的myid文件里,增加serverid,只增加一個數字即可,切記要和配置文件里配置的server.X的X一一對應。
Invalid config, exiting abnormally  org.apache.zookeeper.server.quorum.QuorumPeerConfig$ConfigException: Error processing D:softzookeeper-3.4.13confzk1.cfg  at org.apache.zookeeper.server.quorum.QuorumPeerConfig.parse(QuorumPeerConfig.java:156)  at org.apache.zookeeper.server.quorum.QuorumPeerMain.initializeAndRun(QuorumPeerMain.java:104)  at org.apache.zookeeper.server.quorum.QuorumPeerMain.main(QuorumPeerMain.java:81)  Caused by: java.lang.IllegalArgumentException: serverid null is not a number  at org.apache.zookeeper.server.quorum.QuorumPeerConfig.parseProperties(QuorumPeerConfig.java:422)  at org.apache.zookeeper.server.quorum.QuorumPeerConfig.parse(QuorumPeerConfig.java:152)  Disconnected from the target VM, address: '127.0.0.1:58318', transport: 'socket'  ... 2 more

啟動成功

先啟動1和2,可以看到已經選舉出 leader了,就是2。因為集群中已經選舉出 leader,3再啟動就被告知2已經是 leader。

實例1

 

 實例2

 實例3

 

 在 IDE 里以集群的方式啟動zookeeper 到這裡結束了,下一篇開始分析選舉演算法源碼。