1. 程式人生 > >Zookeeper_閱讀原始碼第一步_在 IDE 裡啟動 zkServer(叢集版)

Zookeeper_閱讀原始碼第一步_在 IDE 裡啟動 zkServer(叢集版)

 

上篇文章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:\soft\zookeeper-3.4.13\conf\zk1.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:\zookeeper\data1\myid 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:\soft\zookeeper-3.4.13\conf\zk1.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 到這裡結束了,下一篇開始分析選舉演算法原始碼。