面試官:看到你簡歷說熟悉zookeeper,那請你詳細談談什麼是zab協議?
小巨集:我公司的dubbo用到zoopkeeper作為註冊中心,zab協議不太瞭解。
面試官:沒事,你先回家等通知吧。
小明:zab協議是zookeeper專門設計的支援崩潰恢復的原子廣播協議。目的是實現分散式zoopkeeper各個節點資料一致性。
面試官:那你繼續說說zab怎麼實現分散式資料一致性的?
小明:zab協議約定zk節點有兩種角色leader和follower,zk客戶端會隨機的連結到 zookeeper 叢集中的一個節點,如果是讀請求,就直接從當前節點中讀取資料;如果是寫請求,那麼節點就會向 Leader 提交事務,Leader 接收到事務提交,會廣播該事務,只要超過半數節點寫入成功,該事務就會被提交。另外,Zookeeper是一個樹形結構,具有順序性很多操作都要先檢查才能確定是否可以執行,比如P1的事務t1可能是建立節點"/a",t2可能是建立節點"/a/b",只有先建立了父節點"/a",才能建立子節點"/a/b"。
為了實現這一點,Zab協議要保證同一個Leader發起的事務要按順序被執行,同時還要保證只有先前Leader的事務被執行之後,新選舉出來的Leader才能再次發起事務
面試官:好的,非常好,剛剛你說的leader是不是隻有一個。
小明:是的,只有一個,其餘zk節點為follower
面試官:那這個leader節點突然當機了,怎麼辦呢?
小明:如果leader當機了會重新選舉出一個新的zk節點作為leader
面試官:那選舉新leader的演算法是什麼?
小明:那我舉個例子來說明吧,假如當前有zk1,zk2,zk3,三個節點組成一個叢集,現在zk3節點掛了。
1、首先zk1和zk2都會將自己作為Leader伺服器來進行投票,每次投票會包含所推舉的伺服器的myid和ZXID,使用(myid, ZXID)來表示,假設此時ZK1的投票為(1, 1),ZK2的投票為(2, 1),然後各自將這個投票發給叢集中其他機器
2、各伺服器接收到投票之後會進行進行檢查,如檢查是否是本輪投票、是否來自LOOKING狀態的伺服器
3、開始處理投票,伺服器都需要將別人的投票和自己的myid和zxid進行比較,規則是優先檢查ZXID。ZXID比較大的伺服器優先作為Leader。 如果ZXID相同,那麼就比較myid。myid較大的伺服器作為Leader伺服器,在例子很明顯zk2,會成為新的leader。
面試官:好的,那重新投票選舉leader怎麼保證資料不會丟失。
小明:我們都知道,zk是cp的,不一定保證可用性,在選舉的過程中,不能對外提供服務。但在選舉的過程中,首先選zxid(zk的事務ID)最大的為leader,zxid最大,表示資料是最新的,然後廣播給folower,這樣避免資料丟失。
面試官:你什麼時候能來上班?
歡迎關注