1. 程式人生 > >ZooKeeper原始碼分析-目錄

ZooKeeper原始碼分析-目錄

背景

ZooKeeper是一款開源的分散式應用的分散式協調服務。它包含一個簡單的原語集,分散式應用程式可以基於它實現同步服務,配置維護和命名服務等。

其特點如下:

  1. 雖然是記憶體資料庫,但提供持久化功能,通過快照事務日誌將資料持久化到磁碟,即使伺服器關閉,依然可以恢復本地資料
  2. ZooKeeper提供的資料型別單一,且每個ZNode最多存放1MB資料,但提供了順序結點臨時結點
  3. ZooKeeper提供了強大的監聽功能,客戶端可以作為觀察者獲取資料更改的通知
  4. ZooKeeper是一個分散式的產品,在少於半數的伺服器宕機的情況下依然可以對外提供服務,並且在保持高可用性的同時通過leader選舉
    ,資料同步原子廣播保證了強一致性
  5. ZooKeeper中只有leader可以處理寫操作,保證了客戶端的寫請求順序執行
  6. 可以根據ZooKeeper提供的功能進行擴充套件,完成如分散式鎖,分散式佇列,leader選舉等功能(如叢集中每個伺服器在同一路徑下建立一個臨時順序子結點,建立的最小順序的結點成為leader,同時在最小結點上註冊監聽事件,則可實現leader選舉,並且舊leader宕機時可重新選舉新leader).詳見curator官網Recipes

目錄

思考

個人覺得如果單單將某個類的原始碼單獨拿出來分析,對於讀者而言,雖然可以較為清楚的瞭解該功能是如何實現的,但不知何時回撥用該方法,也即不知道各個類之間是如何協調工作的.而且由於我功夫未到,在輸出知識的過程中,恐怕連將功能的實現介紹清楚都很困難;但是如果深度優先介紹的話(即跟著函式呼叫棧學習執行流程),則很難把握重點.這次寫ZooKeeper的部落格也是我第一次嘗試寫一系列的部落格,介紹一個比較大的功能,我平時學習的風格是深度優先學習,但是這次就行不通了,因為ZooKeeper各個元件之間互動太複雜,由於最初沒有將ZooKeeper各個元件分離開來,在剛開始寫作此類部落格時,實在是太痛苦了,往往寫著寫著發現這個功能不知道怎麼實現的,還要繼續去看原始碼,邊看編寫.
還是在看介紹rocketmq的一篇部落格時給了我啟發,那篇部落格中將rocketmq的技術難點做了思維導圖,於是我也將ZooKeeper主要功能做了思維導圖,先梳理出大概的層級關係,再寫部落格,雖然思維導圖也會更改,但是比直接寫部落格思維更清晰一些.
另外,”寫著寫著發現這個功能不知道怎麼實現的”這個問題我覺得是沒法避免的,看原始碼一遍就是隻能知道個大概,只有在寫部落格完成知識輸出的過程中才能知道哪些地方是沒有掌握的,再去重複看原始碼,輸出知識.這是個只能花時間去解決的事情,因此要堅持多看幾遍程式碼,勉勵自己!

總結

我fork了一份apache/zookeeper的原始碼,在學習的過程中填加了很多註釋,供大家參考pfjia/zookeeper

參考

  • 從Paxos到Zookeeper:分散式一致性原理與實踐 (書中介紹Paxos演算法的部分是根據Paxos的論文直接翻譯而來,且有些術語翻譯不準確,如將proposal和value都翻譯為”提案”,導致我第一次看該書無法理解Paxos演算法,也沒有堅持下去.後來第二次再看該書時,由於看了Paxos演算法的論文,對Paxos有了大致瞭解,最後將該書全部看完,書中後面部分介紹的非常清楚,如Zookeeper技術內幕.建議看該書時一定要參考Paxos演算法的論文)