天天看點

zooKeeper學習總結——大資料zooKeeper常見面試題

Zookeeper是什麼架構

分布式的、開源的分布式應用程式協調服務,原本是Hadoop、HBase的一個重要元件。它為分布式應用提供一緻性服務的軟體,包括:配置維護、域名服務、分布式同步、組服務等。

應用場景

Zookeeper的功能很強大,應用場景很多,結合我實際工作中使用Dubbo架構的情況,Zookeeper主要是做注冊中心用。基于Dubbo架構開發的提供者、消費者都向Zookeeper注冊自己的URL,消費者還能拿到并訂閱提供者的注冊URL,以便在後續程式的執行中去調用提供者。而提供者發生了變動,也會通過Zookeeper向訂閱的消費者發送通知。

Zookeeper有哪些特點

zooKeeper學習總結——大資料zooKeeper常見面試題

Paxos算法& Zookeeper使用協定

Paxos算法是分布式選舉算法,Zookeeper使用的 ZAB協定(Zookeeper原子廣播),二者有相同的地方,比如都有一個Leader,用來協調N個Follower的運作;Leader要等待超半數的Follower做出正确回報之後才進行提案;二者都有一個值來代表Leader的周期。

不同的地方在于:

ZAB用來建構高可用的分布式資料主備系統(Zookeeper),Paxos是用來建構分布式一緻性狀态機系統。

Paxos算法、ZAB協定要想講清楚可不是一時半會的事兒,自1990年萊斯利•蘭伯特提出Paxos算法以來,因為晦澀難懂并沒有受到重視。後續幾年,蘭伯特通過好幾篇論文對其進行更進一步地解釋,也直到06年谷歌發表了三篇論文,選擇Paxos作為chubby cell的一緻性算法,Paxos才真正流行起來。

對于普通開發者來說,尤其是學習使用Zookeeper的開發者明确一點就好:分布式Zookeeper選舉Leader伺服器的算法與Paxos有很深的關系。

選舉算法和流程

FastLeaderElection是zookeeper預設提供的選舉算法

選舉流程

目前有5台伺服器,每台伺服器均沒有資料,它們的編号分别是1,2,3,4,5,按編号依次啟動,它們的選擇舉過程如下:

  1. 伺服器1啟動,給自己投票,然後發投票資訊,由于其它機器還沒有啟動是以它收不到回報資訊,伺服器1的狀态一直屬于Looking。
  2. 伺服器2啟動,給自己投票,同時與之前啟動的伺服器1交換結果,由于伺服器2的編号大是以伺服器2勝出,但此時投票數沒有大于半數,是以兩個伺服器的狀态依然是LOOKING。
  3. 伺服器3啟動,給自己投票,同時與之前啟動的伺服器1,2交換資訊,由于伺服器3的編号最大是以伺服器3勝出,此時投票數正好大于半數,是以伺服器3成為leader,伺服器1,2成為follower。
  4. 伺服器4啟動,給自己投票,同時與之前啟動的伺服器1,2,3交換資訊,盡管伺服器4的編号大,但之前伺服器3已經勝出,是以伺服器4隻能成為follower。
  5. 伺服器5啟動,後面的邏輯同伺服器4成為follower。

Zookeeper對節點的watch監聽通知是永久的嗎?

不是。官方聲明:一個Watch事件是一個一次性的觸發器,當被設定了Watch的資料發生了改變的時候,則伺服器将這個改變發送給設定了Watch的用戶端,以便通知它們。

為什麼不是永久的,舉個例子,如果服務端變動頻繁,而監聽的用戶端很多情況下,每次變動都要通知到所有的用戶端,這太消耗性能了。

一般是用戶端執行getData(“/節點A”,true),如果節點A發生了變更或删除,用戶端會得到它的watch事件,但是在之後節點A又發生了變更,而用戶端又沒有設定watch事件,就不再給用戶端發送。

在實際應用中,很多情況下,我們的用戶端不需要知道服務端的每一次變動,我隻要最新的資料即可。

部署方式?叢集中的機器角色都有哪些?叢集最少要幾台機器

單機,叢集。Leader、Follower。叢集最低3(2N+1)台,保證奇數,主要是為了選舉算法。

叢集如果有3台機器,挂掉一台叢集還能工作嗎?挂掉兩台呢?

記住一個原則:過半存活即可用。

叢集支援動态添加機器嗎?

其實就是水準擴容了,Zookeeper在這方面不太好。兩種方式:

全部重新開機:關閉所有Zookeeper服務,修改配置之後啟動。不影響之前用戶端的會話。

逐個重新開機:顧名思義。這是比較常用的方式。

繼續閱讀