用了好久zk了,只會用,也沒系統總結一下
Apache ZooKeeper致力於開發和維護開源服務器,實現高度可靠的分佈式協調。
前段時間總結過CAP,感興趣的大家可以過去看看:https://blog.csdn.net/Soinice/article/details/96784994
什麼是ZooKeeper?
ZooKeeper 簡稱zk,中文名:動物園管理者
ZooKeeper是一種集中式服務,用於維護配置信息,命名,提供分佈式同步和提供組服務。所有這些類型的服務都以分佈式應用程序的某種形式使用。每次實施它們都需要做很多工作來修復不可避免的錯誤和競爭條件。由於難以實現這些類型的服務,應用程序最初通常會吝嗇它們,這使得它們在變化的情況下變得脆弱並且難以管理。即使正確完成,這些服務的不同實現也會在部署應用程序時導致管理複雜性。所以,這時候就產生了ZK。
它是一個分佈式服務框架,是Apache Hadoop的一個子項目,它主要是用來解決分佈式應用中經常遇到的一些數據管理問題,如:統一命名服務,集羣管理,分佈式應用配置項的管理等。
ZooKeeper:分佈式應用程序的分佈式協調服務
ZooKeeper是一種用於分佈式應用程序的分佈式開源協調服務。它公開了一組簡單的原語,分佈式應用程序可以構建這些原語,以實現更高級別的服務,以實現同步,配置維護以及組和命名。它被設計爲易於編程,並使用在熟悉的文件系統目錄樹結構之後設計的數據模型。它在Java中運行,並且具有Java和C的綁定。
衆所周知,協調服務很難做到。他們特別容易出現比賽條件和死鎖等錯誤。ZooKeeper背後的動機是減輕分佈式應用程序從頭開始實施協調服務的責任。
設計目標
簡單的
ZooKeeper允許分佈式進程通過共享的分層命名空間相互協調,該命名空間的組織方式與標準文件系統類似。名稱空間由數據寄存器組成 - 在ZooKeeper用語中稱爲znodes - 這些與文件和目錄類似。與專爲存儲而設計的典型文件系統不同,ZooKeeper數據保存在內存中,這意味着ZooKeeper可以實現高吞吐量和低延遲數量。
ZooKeeper實現非常重視高性能,高可用性,嚴格有序的訪問。ZooKeeper的性能方面意味着它可以在大型分佈式系統中使用。可靠性方面使其不會成爲單點故障。嚴格的排序意味着可以在客戶端實現複雜的同步原語。
可複製
與它協調的分佈式進程一樣,ZooKeeper本身也可以在稱爲集合的一組主機上進行復制。
組成ZooKeeper服務的服務器必須彼此瞭解。它們維護內存中的狀態圖像,以及持久性存儲中的事務日誌和快照。只要大多數服務器可用,ZooKeeper服務就可用。
客戶端連接到單個ZooKeeper服務器。客戶端維護TCP連接,通過該連接發送請求,獲取響應,獲取監視事件以及發送心跳。如果與服務器的TCP連接中斷,則客戶端將連接到其他服務器。
有序的
ZooKeeper使用反映所有ZooKeeper事務順序的數字標記每個更新。後續操作可以使用該順序來實現更高級別的抽象,例如同步原語。
快速的
它在“讀取主導”工作負載中特別快。
ZooKeeper應用程序在數千臺計算機上運行,並且在讀取比寫入更常見的情況下表現最佳,比率大約爲10:1。
總之,ZK是數據庫
ZooKeeper 是一個數據庫
啓動服務端
ZKServer.sh start
啓動客戶端
zkCli.sh
默認連接任意一臺服務器 localhost:2181
創建節點
create /soinice 666
查詢節點值
get /soinice
666
簡單的API
ZooKeeper的設計目標之一是提供一個非常簡單的編程接口。因此,它僅支持以下操作:
-
create:在樹中的某個位置創建一個節點
-
delete:刪除節點
-
exists:測試某個位置是否存在節點
-
get data:從節點讀取數據
-
set data:將數據寫入節點
-
get children:檢索節點的子節點列表
-
sync:等待傳播數據
ZooKeeper是一個擁有文件系統特點的數據庫
數據模型和分層命名空間
ZooKeeper提供的名稱空間非常類似於標準文件系統。名稱是由斜槓(/)分隔的路徑元素序列。ZooKeeper名稱空間中的每個節點都由路徑標識。
ZooKeeper的分層命名空間
創建節點必須 / 開始,和文件目錄很相像。
節點和臨時節點
與標準文件系統不同,ZooKeeper命名空間中的每個節點都可以包含與之關聯的數據以及子項。這就像擁有一個允許文件也是目錄的文件系統。(ZooKeeper旨在存儲協調數據:狀態信息,配置,位置信息等,因此存儲在每個節點的數據通常很小,在字節到千字節範圍內。)我們使用術語znode來說明我們正在談論ZooKeeper數據節點。
Znodes維護一個stat結構,其中包括數據更改,ACL(訪問數據列表)更改和時間戳的版本號,以允許緩存驗證和協調更新。每次znode的數據更改時,版本號都會增加。例如,每當客戶端檢索數據時,它也接收數據的版本。
存儲在命名空間中每個znode的數據以原子方式讀取和寫入。讀取獲取與znode關聯的所有數據字節,寫入替換所有數據。每個節點都有一個訪問控制列表(ACL),限制誰可以做什麼。
ZooKeeper也有臨時節點的概念。只要創建znode的會話處於活動狀態,就會存在這些znode。會話結束時,znode將被刪除。當您想要實現[tbd]時,臨時節點很有用。
ZooKeeper是一個解決了一致性問題的分佈式數據庫
數據同步,數據一致性。
ZooKeeper是一個具有發佈和訂閱功能的分佈式數據庫(watch)
有條件的更新和手錶
ZooKeeper支持手錶的概念。
客戶端可以在znode上設置監視。當znode更改時,將觸發並刪除手錶。觸發監視時,客戶端會收到一個數據包,指出znode已更改。如果客戶端與其中一個ZooKeeper服務器之間的連接中斷,則客戶端將收到本地通知。這些可以用於[tbd]。
總之,zk是數據庫,是一個具有發佈和訂閱功能的,解決了數據一致性問題的,擁有文件系統特點的分佈式數據庫。
ZooKeeper特點
ZooKeeper非常快速而且非常簡單。但是,由於其目標是構建更復雜的服務(如同步)的基礎,因此它提供了一系列保證。這些是:
- 順序一致性 - 客戶端的更新將按發送順序應用。
- 原子性 - 更新成功或失敗。沒有部分結果。
- 單系統映像 - 無論服務器連接到哪個服務器,客戶端都將看到相同的服務視圖。
- 可靠性 - 一旦應用了更新,它將從那時起持續到客戶端覆蓋更新。
- 及時性 - 系統的客戶視圖保證在特定時間範圍內是最新的。
文章大多數翻譯自:http://zookeeper.apache.org/doc/current/zookeeperOver.html