1. 程式人生 > 其它 >4.ZK叢集搭建&選舉機制&資料同步機制

4.ZK叢集搭建&選舉機制&資料同步機制

目錄

叢集

叢集角色

  • 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最大的

資料同步機制

  1. 客戶端向節點寫資料
  2. 如果客戶端連線的是Follower節點,Follower會將資料轉交給Leader去操作
  3. Leader把資料寫到自己的資料檔案中,並給自己返回一個ACK
  4. Leader把資料傳送給Follower
  5. Follower將資料寫到本地資料檔案,並給Leader返回ACK
  6. Leader收到過半的Follower的ACK後,自己執行Commit,將資料檔案中資料寫入到記憶體,並向Follower廣播發送Commit命令
  7. Follower收到後執行Commit,將資料檔案中資料寫入到記憶體
  8. Commit後,其他客戶端就可以訪問到此資料