Zookeeper學習筆記(概要)

原文鏈接:http://zookeeper.apache.org/doc/current/zookeeperOver.html

1.Zookeeper是什麼?

ZooKeeper是一種用於分佈式應用程序的分佈式開源協調服務。意思就是,比如幾個人想要協商一件事情,就需要一個協商平臺來幫助他們完成,比如投票選舉leader,那得有個選舉桌吧,每個人得發幾張選舉票吧,Zookeeper就是把“基礎設施”的活兒給幹了,讓開發者的精力只放在“協調”上。

2.設計目標

ZooKeeper很簡單。(可以理解爲輕量級文件目錄服務)
ZooKeeper允許分佈式進程通過共享的分層命名空間相互協調,該命名空間的組織方式與標準文件系統類似。名稱空間由數據寄存器組成 - 在ZooKeeper用語中稱爲znodes - 這些與文件和目錄類似。與專爲存儲而設計的典型文件系統不同,ZooKeeper數據保存在內存中,這意味着ZooKeeper可以實現高吞吐量和低延遲數量。
高性能
ZooKeeper實現非常重視高性能,高可用性,嚴格有序的訪問。ZooKeeper的性能方面意味着它可以在大型分佈式系統中使用。可靠性方面使其不會成爲單點故障。嚴格的排序意味着可以在客戶端實現複雜的同步原語。
數據同步
與它協調的分佈式進程一樣,ZooKeeper本身也可以在稱爲集合的一組主機上進行數據同步。
在這裏插入圖片描述
組成ZooKeeper服務的服務器必須彼此瞭解。它們維護內存中的狀態圖像,以及持久化存儲中的事務日誌和快照。只要大多數服務器可用,ZooKeeper服務就可用。
客戶端連接到單個ZooKeeper服務器。客戶端維護TCP連接,通過該連接發送請求,獲取響應,獲取監視事件以及發送心跳。如果與服務器的TCP連接中斷,則客戶端將連接到其他服務器。
有序
ZooKeeper使用反映所有ZooKeeper事務順序的數字標記每個更新。後續操作可以使用該順序來實現更高級別的抽象,例如同步原語。

它在“讀取主導”工作負載中特別快。ZooKeeper應用程序在數千臺計算機上運行,​​並且在讀取比寫入更常見的情況下表現最佳,比率大約爲10:1。

3.數據模型和分層命名空間

ZooKeeper提供的名稱空間非常類似於標準文件系統。名稱是由斜槓(/)分隔的路徑元素序列。ZooKeeper名稱空間中的每個節點都由路徑標識。
在這裏插入圖片描述

4.節點和臨時節點

與標準文件系統不同,ZooKeeper命名空間中的每個節點都可以包含與之關聯的數據以及子項。這就像擁有一個允許文件也是目錄的文件系統。(ZooKeeper旨在存儲協調數據:狀態信息,配置,位置信息等,因此存儲在每個節點的數據通常很小,在字節到千字節範圍內。)我們使用術語znode來說明我們正在談論ZooKeeper數據節點。具體意思下圖可以解釋,這裏也通過命令解釋一下,比如,set /week 123,意思就是我在目錄/week上存放了123,當我get /week的時候,就可以取到123。在這個基礎之上,我還可以 set /week/temp 456,然後get /week/temp 也可以得到456,就是一個節點即是目錄,也是Map的一個Key。自己實現的話也很簡單,樹+HashMap。
在這裏插入圖片描述
Znodes維護一個stat結構,其中包括數據更改,ACL更改和時間戳的版本號,以允許緩存驗證和協調更新。每次znode的數據更改時,版本號都會增加。而每當客戶端檢索數據時,它也接收數據的版本,從而返回相對應的信息。自己去設計實現的話,就是搞一個線程安全的隊列。
存儲在命名空間中每個znode的數據以原子方式讀取和寫入。讀取獲取與znode關聯的所有數據字節,寫入替換所有數據。每個節點都有一個訪問控制列表(ACL),限制誰可以做什麼。
ZooKeeper也有臨時節點的概念。只要創建znode的會話處於活動狀態,就會存在這些znode。會話結束時,znode將被刪除。

5.有條件的更新和watch機制

ZooKeeper支持watch的概念。客戶端可以在znode上設置watch監視。當znode更改時,將觸發並刪除watch(注意這裏是觸發並刪除,也就說watch的監聽只會生效一次,要實現永久監聽,要實現反覆註冊,這個業務很多開源的java客戶端都有封裝)。觸發監視時,客戶端會收到一個數據包,指出znode已更改。如果客戶端與其中一個ZooKeeper服務器之間的連接中斷,則客戶端將收到本地通知。

6.擔保

ZooKeeper非常快速而且非常簡單。但是,由於其目標是構建更復雜的服務(如同步)的基礎,因此它提供了一系列保證。這些是:

  • 順序一致性 - 客戶端的更新將按發送順序應用。
  • 原子性 - 更新成功或失敗。沒有部分結果。
  • 單系統映像 -無論服務器連接到哪個服務器,客戶端都將看到相同的服務視圖。
  • 可靠性 - 一旦應用了更新,它將從那時起持續到客戶端覆蓋更新。
  • 及時性 -系統的客戶視圖保證在特定時間範圍內是最新的。

7.簡單的原始API

ZooKeeper的設計目標之一是提供一個非常簡單的編程接口。因此,它僅支持以下操作:

  • create:在樹中的某個位置創建一個節點
  • delete:刪除節點
  • exists:測試某個位置是否存在節點
  • get data:從節點讀取數據
  • set data:將數據寫入節點
  • get children:檢索節點的子節點列表
  • sync:等待傳播數據

8.應用

除請求處理器外,構成ZooKeeper服務的每個服務器都複製其自己的每個組件的副本。
在這裏插入圖片描述
複製數據庫是包含整個數據樹的內存數據庫。更新將記錄到磁盤以獲得可恢復性,並且寫入在應用於內存數據庫之前會序列化到磁盤。
每個ZooKeeper服務器都爲客戶端提供服務。客戶端只連接到一臺服務器以提交請求。讀取請求由每個服務器數據庫的本地副本提供服務。更改服務狀態,寫請求的請求由協議協議處理。
作爲協議協議的一部分,來自客戶端的所有寫入請求都被轉發到稱爲leader的單個服務器。其餘的ZooKeeper服務器(稱爲follower)接收來自leader的消息提議並同意消息傳遞。消息傳遞層負責替換失敗的leader並將follower與leader同步。
ZooKeeper使用自定義原子消息傳遞協議。由於消息傳遞層是原子的,因此ZooKeeper可以保證本地副本永遠不會發散。當leader收到寫入請求時,它會計算應用寫入時系統的狀態,並將其轉換爲捕獲此新狀態的事務。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章