ZooKeeper學習筆記

ZooKeeper是一個分佈式的,開放源碼的分佈式應用程序協調服務,是Google的Chubby一個開源的實現,是Hadoop和Hbase的重要組件。它是一個為分佈式應用提供一致性服務的軟件,提供的功能包括:配置維護、域名服務、分佈式同步、組服務等。

ZooKeeper的目標就是封裝好複雜易出錯的關鍵服務,將簡單易用的接口和性能高效、功能穩定的系統提供給用戶。

ZooKeeper包含一個簡單的原語集,提供Java和C的接口。

ZooKeeper代碼版本中,提供了分佈式獨享鎖、選舉、隊列的接口,代碼在zookeeper-3.4.3\src\recipes。其中分佈鎖和隊列有Java和C兩個版本,選舉只有Java版本。

ZooKeeper是以Fast Paxos算法為基礎的,Paxos 算法存在活鎖的問題,即當有多個proposer交錯提交時,有可能互相排斥導致沒有一個proposer能提交成功,而Fast Paxos作了一些優化,通過選舉產生一個leader (領導者),只有leader才能提交proposer,具體算法可見Fast Paxos。因此,要想弄懂ZooKeeper首先得對Fast Paxos有所瞭解。

ZooKeeper的基本運轉流程:

1、選舉Leader。

2、同步數據。

3、選舉Leader過程中算法有很多,但要達到的選舉標準是一致的。

4、Leader要具有最高的執行ID,類似root權限。

5、集群中大多數的機器得到響應並接受選出的Leader。

zookeeper的用途:

1、數據發佈與訂閱(配置中心)

2、負載均衡

3、命名服務(Naming Service)

4、分佈式通知/協調

5、集群管理與Master選舉

6、分佈式鎖

7、分佈式隊列

zookeeper分佈式鎖的思路:

進程需要訪問共享數據時, 就在"/locks"節點下創建一個sequence類型的子節點, 稱為thisPath。當thisPath在所有子節點中最小時, 說明該進程獲得了鎖。進程獲得鎖之後, 就可以訪問共享資源了。訪問完成後, 需要將thisPath刪除。鎖由新的最小的子節點獲得。

大致流程圖:

Zookeeper隊列管理:

1、同步隊列:當一個隊列的成員都聚齊時,這個隊列才可用,否則一直等待所有成員到達。在約定目錄下創建臨時目錄節點,監聽節點數目是否是我們要求的數目。

2、隊列按照FIFO方式進行入隊和出隊操作,和分佈式鎖服務中的控制時序場景基本原理一致,入列有編號,出列按編號。

分佈式與數據複製:

Zookeeper作為一個集群提供一致的數據服務,自然,它要在所有機器間做數據複製。

數據複製的好處:

1、容錯:一個節點出錯,不致於讓整個系統停止工作,別的節點可以接管它的工作;

2、提高系統的擴展能力 :把負載分佈到多個節點上,或者增加節點來提高系統的負載能力;

3、提高性能:讓客戶端本地訪問就近的節點,提高用戶訪問速度。

從客戶端讀寫訪問的透明度來看,數據複製集群系統分下面兩種:

1、寫主(WriteMaster) :對數據的修改提交給指定的節點。讀無此限制,可以讀取任何一個節點。這種情況下客戶端需要對讀與寫進行區別,俗稱讀寫分離;

2、寫任意(Write Any):對數據的修改可提交給任意的節點,跟讀一樣。這種情況下,客戶端對集群節點的角色與變化透明。

對zookeeper來說,它採用的方式是寫任意。通過增加機器,它的讀吞吐能力和響應能力擴展性非常好,而寫,隨著機器的增多吞吐能力肯定下降(這也是它建立observer的原因),而響應能力則取決於具體實現方式,是延遲複製保持最終一致性,還是立即複製快速響應。


分享到:


相關文章: