4.ZK叢集搭建&選舉機制&資料同步機制
阿新 • • 發佈:2022-03-31
目錄
叢集
叢集角色
- Leader:處理叢集的所有事務請求,叢集中只有一個Leader
- Follower:只能處理讀請求,參與Leader選舉
- Observer:只能處理讀請求,提升叢集讀的效能,不能參與Leader選舉
叢集搭建
停止單機zk
建立四個資料夾(四個節點,實際應該是多臺伺服器)
/usr/local/zookeeperDataDir/zk2181
/usr/local/zookeeperDataDir/zk2182
/usr/local/zookeeperDataDir/zk2183
/usr/local/zookeeperDataDir/zk2184
建立myid檔案
每個資料夾建立一個myid檔案,裡面只有一個數字,不可重複,要和下方server.*配置一致
建立四個zoo.cfg
在conf資料夾下建立 zoo2181.cfg zoo2182.cfg zoo2183.cfg zoo2184.cfg
每個cfg配置內容
公共配置
tickTime=2000 initLimit=10 syncLimit=5 extendedTypesEnabled=true server.0=192.168.0.104:2281:2381 server.1=192.168.0.104:2282:2382 server.2=192.168.0.104:2283:2383 server.3=192.168.0.104:2284:2384:Observer
不同配置
dataDir=/usr/local/zookeeperDataDir/zk2181
dataLogDir=/usr/local/zookeeperDataDir/zk2181/log
clientPort=2181
#修改dataDir和dataLogDirzk218*以及clientPort
說明
-
2181埠是給客戶端使用的
-
server.myid=伺服器ip:zk間資料通訊埠:選舉埠:Observer (可選)
Observer為觀察者節點,可選配
檢視
status檢視每個節點的模式
./zkServer.sh status ../conf/zoo218*.cfg #可知道哪些Leader、Follower、Observer 分別是哪些
連線叢集
shell命令連線
./zkCli.sh -server 192.168.0.104:2181,192.168.0.104:2182,192.168.0.104:2183,192.168.0.104:2184
選舉策略
myid:每個節點配置的唯一序號
zXid:每個節點的事務id,每次進行增刪改都會加
叢集初始化選舉流程
前提
- 初始化選舉,沒有任何資料,zXid必然都是0;
- zookeeper通過zoo.cfg檔案中service.*配置數量來確定一共有幾個參與投票節點(Observer節點除外)
假設
有三個節點 A,B,C ,對應三個myid為 1,2,3
- A節點啟動,發現在已經執行的zookeeper中myid自己最大,A投票給A
- 判斷當前自己的投票數是否過半(此時一共三個節點參與選舉,A才得一票,未過半,繼續)
- B節點啟動,發現已經執行的zookeeper中myid自己最大(B和A比較),B投票給B,並且A也投票給B
- 判斷當前自己的投票數是否過半(此時一共三個節點參與選舉,B得兩票,已過半,Leader已選出)
- C節點啟動,發現已經有Leader了,自己變為Follower
Leader崩潰選舉策略
選舉觸發機制
Leader定期通過socket向Follower傳送ping命令(沒有內容的socket),Follower會定期去socket中查詢ping命令,如果Leader崩潰,Follower則無法檢測到,此時Follower將由“Follower”->"Looking"狀態,進行選舉
策略
邏輯和初始化選舉流程一致,只不過在對比時,多了一個比較zXid,zXid越大的,說明資料越完整
zXid 最大的>myId最大的
資料同步機制
- 客戶端向節點寫資料
- 如果客戶端連線的是Follower節點,Follower會將資料轉交給Leader去操作
- Leader把資料寫到自己的資料檔案中,並給自己返回一個ACK
- Leader把資料傳送給Follower
- Follower將資料寫到本地資料檔案,並給Leader返回ACK
- Leader收到過半的Follower的ACK後,自己執行Commit,將資料檔案中資料寫入到記憶體,並向Follower廣播發送Commit命令
- Follower收到後執行Commit,將資料檔案中資料寫入到記憶體
- Commit後,其他客戶端就可以訪問到此資料