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的原因),而響應能力則取決於具體實現方式,是延遲複製保持最終一致性,還是立即複製快速響應。
閱讀更多 熱血萌寵 的文章