Zookeeper_閱讀原始碼第一步_在 IDE 裡啟動 zkServer(叢集版)
上篇文章Zookeeper_閱讀原始碼第一步_在 IDE 裡啟動 zkServer(單機版)講了在 idea 裡以單機的方式啟動zookeeper,這篇介紹一下以叢集的方式啟動。
叢集方式啟動,才會真正的用到 Zookeeper 的快速選舉演算法,單機版不涉及選舉。這裡我準備啟動三個zkServer例項。
修改配置檔案
首先要準備三個配置檔案,具體配置及配置項解釋如下:
# 傳送心跳的間隔時間,單位:毫秒
tickTime=2000
# 這個配置項是用來配置 Zookeeper 接受客戶端(這裡所說的客戶端不是使用者連線 Zookeeper 伺服器的客戶端,
# 而是 Zookeeper 伺服器叢集中連線到 Leader 的Follower 伺服器)初始化連線時最長能忍受多少個心跳時間間隔數。
# 總的時間長度就是 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 都是一樣,
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 moredata1、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 到這裡結束了,下一篇開始分析選舉演算法原始碼。