面試題:談談什麼是Zab協議?

咖啡牧羊人發表於2019-04-11
原創: 咖啡牧羊人 咖啡牧羊人
今天

面試官:看到你簡歷說熟悉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,這樣避免資料丟失。

面試官:你什麼時候能來上班?

歡迎關注

面試題:談談什麼是Zab協議?


相關文章