Zookeeper 總結與面試題彙總

1.zookeeper的用處

從工作機制上來說,Zk = 文件系統 + 通知機制
想個哨兵一樣,它負責存儲和管理大家都關心的數據,然後接收觀察者的註冊,一旦這些數據的狀態發生變化,Zk 就通知已經在Zookeeper 已經註冊的觀察者做出相應的反應。

2.zookeeper的數據結構(樹)? 講一下基於它實現的分佈式鎖?基於它實現的Master選舉?基於它的集羣管理?zookeeper的註冊(watch)機制和輪詢機制的使用場景?

1. Zk 的數據結構是樹,同樣數據結構的還有 linux 文件系統和 hdfs 文件系統。
2. 基於 Zookeeper 實現分佈式鎖

基於 zookeeper 實現分佈式鎖的方案,由於zookeeper 有以下特點:

  • 1.維護了一個有層次的數據節點,類似文件系統(因爲Zookeeper本身是樹結構)。
  • 2.有以下數據節點:臨時節點、永久節點、臨時有序節點(分佈式鎖是基於該類型節點)、持久有序節點。
  • 3.Zookeeper 可以和 client 通過心跳的機制保持長連接,如果客戶端連接zookeeper 創建了一個臨時節點,那麼這個客戶端與斷開連接後會自動刪除(心跳機制創建的節點都是臨時節點)。
  • 4.zookeeper 的節點上可以註冊用戶事件(監聽事件),如果節點數據刪除或者更新都可以觸發自定義的監聽事件。
  • 5.zookeeper 保持數據的全局一致性,也叫統一視圖,各服務對於狀態信息獲取滿足一致性。
    在每一個節點下面創建節點時,可以選擇創建類型時有序(ephemeral_sequential \ persisitent_sequential),那麼在新節點的後面就會加上一個次序編號,這個次序編號,是上一個生成的次序編號加 1.

在這裏插入圖片描述
問題來了:講一下如何用 zookeeper 實現分佈式鎖?

三個步驟:加鎖 -》 獲取鎖-》 釋放鎖

  • 大致思想:每個客戶端對某個方法加鎖時,在 zookeeper 上對該方法對應的指定節點目錄下,生成一個臨時有序節點。判斷是否獲取到鎖的方式很簡單,只需要判斷有序節點中序號最小的一個。當釋放鎖的時候,只需要將這個臨時節點刪除即可。同時,其可以避免服務宕機導致的鎖無法釋放,而產生的死鎖問題。
    Zookeeper 分佈式鎖參考資料

3. 展開講下 ZK 的 leader 選舉機制

(1) 主要基於半數機制:集羣中半數以上的機器存活,就認爲集羣可用,所以 Zk 適合裝在奇數臺機器上,Zk選舉最少需要三臺機器,最少需要兩臺運行良好的機器,這樣三臺哪怕掛掉一臺機器,也能選出leader。

(2)哪些情況下需要進行選舉?並描述選舉過程
<1> 服務器初始化啓動時,需要選取 leader
<2> 服務器運行期間無法和leader 保持連接
對於情況一:這裏以一個簡單的例子說明整個選舉流程,假設五臺服務器組成 Zk 集羣,他們的 id 爲 1 ~ 5 ,它們都是最新啓動的,沒有什麼歷史數據,假設這些服務器依次啓動:
開始:

a. 服務器 1 啓動,發起一次選舉,投自己一票,此時服務器 1 票數 爲1,不夠半數 3 以上,選舉無法完成,服務器 1 保持 爲Looking (它的票可以在接下來的輪次中可以投給別人)

b. 服務器 2 啓動,再發起一次選舉, 服務器 1 投自己, 服務器 2 投自己,二者交換投票選票信息,此時服務器 1 發現 服務器 2 的 id 比自己大,所以改投給服務器 2 ,此時 服務器1爲 0 票,服務器 2 爲 2 票,但是不大於半數,所以,leader 沒被選出來, 服務器 1 , 2 保持爲 Looking 狀態

c. 服務器 3 啓動,發起一輪投票,此時 服務器 1 ,2 都改投服務器 3 ,服務器 3 爲 3票,超過 半數,所以 服務器3 成爲leader ,服務器 1,2 的狀態更改爲 Folowing, 服務器 3 更改爲 Leading .

d.服務器 4 啓動,發起投票,此時 1 2 3 已經不在時 Looking 狀態,不會更改投票信息,交換投票信息後,服務器少數服從多數,改投 3 ,並更改狀態爲 Following

e. 服務器 5 啓動,和 4 一樣,少數服從多數。
leader 的選舉保證了集羣全局數據一致性。
(3)基於它的集羣管理?zookeeper的註冊(watch)機制和輪詢機制的使用場景?
描述一下 Zk 的 註冊(watch)機制:基於 Zk 上創建的節點,可以對這些節點綁定監聽事件,比如監聽節點的數據變更、節點刪除、子節點狀態變更等事件,通過這個事件機制,可以基於Zookeeper 實現分佈式鎖、集羣管理如 集羣節點的動態上下線檢測、統一命名服務、統一配置管理、轉負載均衡。

這裏以服務器的動態上下線爲例:

在這裏插入圖片描述

  1. zk 的監聽原理(畫圖解釋)
    在這裏插入圖片描述
    <1>首先得有一個 main() 線程.
    <2>創建一個Zookeeper 客戶端,這個客戶端對象就會創建兩個線程,一個負責網絡通信(connect),一個負責監聽(listener).
    <3>通過 connect 將註冊的監聽事件發送給 Zookeeper.
    <4> 在 Zookeeper 的監聽器列表中將註冊的監聽事件添加到列表中。
    <5>Zookeeper 監聽到了有數據或者路徑發生變化,就會將這個消息發送給listener.
    <6> listener 線程內部就會調用 process() 方法。
    擴展:常見的監聽有兩種,一種是數據的變化,一種是節點增減的變化。

8. ZK 的部署方式有哪幾種?集羣中的角色有哪些?集羣中最少需要幾臺機器

<1> 部署方式有兩種:單機模式,集羣模式
<2>角色: follower 和 leader
<3>最少需要三臺機器,至少兩臺正常工作

10. Zk 的常用命令

ls、ls2、create、delete、get、set

11. 目錄結構

在這裏插入圖片描述
主要有 bin 目錄:存放可執行文件、conf:存放配置文件、contrib:存放擴展包、lib:存放 jar 包,src:存放源碼

12.數據存儲在什麼地方

數據存儲可分爲:1.內存存儲 2.磁盤存儲
Zk 的數據模型是樹結構,在內存數據庫中,存儲了整棵樹的內容,包括 所有的節點路徑、節點數據、ACL(權限信息)、Zookeeper 會定時把這個數據存儲在從磁盤上。

13.Zookeeper的同步過程,寫操作流程,讀操作流程

  • 數據同步過程:
    1. 數據同步是發生在整個集羣 leader 選舉之後的進行的,此時leader 是集羣中數據最完整最新的節點。
    1. 由於所有的 znode 節點變更都要經過leader,leader 會爲所有的follower 和 observer 創建 learnhandler 線程用於接收數據同步的請求。
    1. 當follower 和 observer 接收到 leader 發送的消息後,比較 zxid 的大小,如果zxid 小於 leader 的zxid ,則把節點最大的 zxid 發送給 leader, leader 會將大於該 zxid 的所有數據都同步到 follower ,完成同步後,通知該 follower 進入 update狀態,follower 接收到 update 的信息後,就可接收 client 的請求了。
  • 寫數據流程
    在這裏插入圖片描述
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章