ZooKeeper學習(一)Zookeeper簡單介紹
分散式系統:是若干獨立計算機的集合,這計算機對使用者來說就像單個相關係統。
(1)提升效能和併發,操作被分發到不同的分片,相互獨立
(2)提升系統的可用性,即使部分分片不能用,其他分片不會受到影響
(3)提升系統的擴充套件性。
Zookeeper:一種用於分散式應用程式的高效能協調服務(維護配置資訊,命名,提供分散式同步和提供組服務)。並且是開源的分散式的,為分散式應用提供協調服務的Apache專案
從設計模式分析:一個基於觀察者模式設計
Zookeeper工作機制:
Zookeeper=檔案系統+通知機制
Zookeeper結構特點:
- Zookeeper:一個領導者(leader),多個跟隨者(follower)組成的叢集。
- Leader負責進行投票的發起和決議,更新系統狀態
- Follower用於接收客戶請求並向客戶端返回結果
- 叢集中只要有半數以上節點存活,Zookeeper叢集就能正常服務。建議叢集數量為奇數
- 全域性資料一致:每個server儲存一份相同的資料副本,client無論連線到哪個server,資料都是一致的。同步資料
- 更新請求順序進行,來自同一個client的更新請求按其傳送順序依次執行。
- 資料更新原子性,一次資料更新要麼成功,要麼失敗。
- 實時性,在一定時間範圍內,client能讀到最新資料。
Zookeeper資料模型:
ZooKeeper資料模型的結構與Unix檔案系統很類似,整體上可以看作是一棵樹,每個節點稱做一個ZNode
ZooKeeper樹中的節點特點:
1.ZooKeeper中每一個節點Zonde通過路徑引用,該路徑必須是絕對的,必須由斜槓字元來開頭,並且必須是唯一的,同時路徑由Unicode字串組成,並且有一些限制。字串"/zookeeper"用以儲存管理資訊,比如關鍵配額資訊。另外,
-
空字元(\ u0000)不能是路徑名的一部分。(這會導致C綁定出現問題。)
-
無法使用以下字元,因為它們無法正常顯示或以令人困惑的方式呈現:\ u0001 - \ u001F和\ u007F - \ u009F。
-
不允許使用以下字元:\ ud800 - uF8FF,\ uFFF0 - uFFFF。
2. ZooKeeper中每一個節點Zonde由三部分組成:stat:此為狀態資訊, 描述該Znode的版本(每次znode的資料更改時,版本號都會增加), 許可權(acl)等資訊;data:與該Znode關聯的資料;children:該Znode下的子節點。其用來管理協調資料,比如分散式應用中的配置檔案資訊、狀態資訊、彙集位置等等。這些資料的共同特性就是它們都是很小的資料,通常以KB為大小單位。
3.每一個節點還存在監控(watch),watch監控節點狀態,當其發生改變時(Znode的增、刪、改)將會觸發watch所對應的操作。當watch被觸發時,ZooKeeper將會向客戶端傳送且僅傳送一條通知,因為watch只能被觸發一次,這樣可以減少網路流量。
4.儲存在名稱空間中每個znode的資料以原子方式讀取和寫入。讀取獲取與znode關聯的所有資料位元組,寫入替換所有資料。每個節點都有一個訪問控制列表(ACL),限制誰可以做什麼。
5.Znode有兩種型別:短暫/持久
短暫(ephemeral):客戶端和伺服器端斷開連線後,建立的節點自動刪除
持久(persistent):客戶端和伺服器端斷開連線後,建立的節點不刪除
6. Znode上可以新增順序標識,形成順序節點,新增方式是在路徑結尾新增一個遞增的計數。這個計數對於此節點的父節點來說是唯一的,它的格式為"%10d"(10位數字,沒有數值的數位用0補充,例如"0000000001")。當計數值大於232-1時,計數器將溢位。
ZooKeeper的API:
操作 | 描述 |
create | 船艦Zonde(父節點必須存在) |
delete | 刪除節點(節點沒有子節點) |
exists | 驗證節點是否存在,並候取它的元資料 |
getACL/setACL | 獲取/設定節點許可權 |
getChildren | 獲取節點所有子節點的列表 |
getData/setData | 獲取/設定節點相關資料 |
sync | 是客戶端的節點檢視與zookeeper同步 |
- update操作是有限制的。delete或setData必須明確要更新的Znode的版本號,可以呼叫exists找到。如果版本號不匹配,更新將會失敗。
- update操作是非阻塞式的。因此客戶端如果失去了一個更新(由於另一個程序在同時更新這個Znode),他可以在不阻塞其他程序執行的情況下,選擇重新嘗試或進行其他操作。
- 檔案非常的小置使整體讀寫的,所以不需要開啟、關閉或是查詢的操作。