ZooKeeper集羣解析。sql
這篇文章中來介紹一下 ZooKeeper 相關的集羣角色,還有 ZAB協議,集羣的安裝在 ZooKeeper入門 中有介紹。服務器
server.0=192.168.182.130:2888:3888:Observer
。ZAB協議的實現借鑑於 Paxos,是爲了解決分佈式系統的數據一致性問題。markdown
zookeeper 就是根據 zab 協議創建了主備模型完成集羣的數據同步(保證數據的一致性),前面介紹了集羣的各類角色,這說所說的主備架構模型指的是,在 zookeeper 集羣中,只有一臺 leader(主節點)負責處理外部客戶端的事務請求(寫操做),leader 節點負責將客戶端的寫操做數據同步到全部的 follower 節點中,大概流程以下:網絡
爲何要有限比較ZXID呢?架構
由於ZXID爲事務id,值越大,證實它的數據最新。分佈式
在這個選舉過程當中每一個 Server 有三種狀態:oop
狀況一的出現場景:post
當 leader 收到合法數量 follower 的 ACK 後,就向各個 follower 廣播 commit 命令,同時也會在本地執行 commit 並向鏈接的客戶端返回 成功,可是若是在各個 follower 在收到 commit 命令前 leader 就掛了,致使剩下的服務器並無執行都這條消息。spa
那麼這種狀況要怎麼處理呢?日誌
一、選舉 ZXID 最大的節點做爲新的 leader:因爲全部提案被 commit 以前必須有合法數量的 follower ACK,即必須有合法數量的服務器的事務日誌上有該 proposal,所以,ZXID 最大也就是數據最新的節點保存了全部被 commit 消息的 proposal 狀態。 二、新的 leader 將本身事務日誌中 proposal 但未 COMMIT 的消息處理。 三、新的 leader 與 follower 創建先進先出的隊列, 先將自身有而 follower 沒有的 proposal 發送給 follower,再將這些 proposal 的 COMMIT 命令發送給 follower,以保證全部的 follower 都保存了全部的 proposal、全部的 follower 都處理了全部的消息,經過以上策略,能保證已經被處理的消息不會丟。
狀況二的出現場景
當 leader 接收到消息請求生成 proposal 後就掛了,其餘 follower 並無收到此 proposal,所以通過恢復模式從新選了 leader 後,這條消息是被跳過的,此時,以前掛了的 leader 從新啓動並註冊成了 follower,他保留了被跳過消息的 proposal 狀態,與整個系統的狀態是不一致的,因此須要將其刪除。
在 zookeeper 集羣中數據副本的傳遞策略就是採用的廣播模式,Zab 協議中的 leader 等待 follower 的 ack 反饋,只要半數以上的 follower 成功反饋就好,不須要收到所有的 follower 反饋。
具體步驟以下:
都讀到這裏了,來個 點贊、評論、關注、收藏 吧!
文章做者:IT王小二
首發地址:www.itwxe.com/posts/2c8e1…
版權聲明:文章內容遵循 署名-非商業性使用-禁止演繹 4.0 國際 進行許可,轉載請在文章頁面明顯位置給出做者與原文連接。