ZooKeeper有一個分層的命名空間,類似分散式檔案系統。它們唯一的差異就在於在命名空間中每個節點可以有資料關聯作為它們的子節點。這就像有一個檔案系統允許檔案也作為檔案目錄。節點路徑通常表示為規範的、斜線分隔的絕對路徑。它們沒有相對路徑。任何包含在路徑當中的unicode字元都必須遵循以下約束:
1)空字元不能作為路徑名稱;
2)以下字串不能作為使用,這是優越它們顯示不夠友好,或容易引起混淆(\u0001 - \u001F and \u007F - \u009F)
3)以下字串是不允許的。 ( \ud800 - uF8FF, \uFFF0 - uFFFF)
4)"."字元可以作為名稱的一部分,但是"."和".."不能單獨存在用於表示一個節點的路徑,因為ZooKeeper沒有使用相對路徑。下述例子是無效的"/a/b/./c" or "/a/b/../c"
5)"zookeeper"關鍵字保留
ZNodes
在ZooKeeper樹狀結構中的每個節點都可以稱為znode。 Znodes維護一個狀態資料結構,包含資料變更版本號、ACL變更、時間戳記。版本號碼加上時間戳記可以允許ZooKeeper去進行快取換證和協調更新。每當一個znode的資料變更,版本號碼就會往上加。例如每當客戶端接收資料時,它也會接收到這個資料的版本。同時當客戶端執行更新或刪除操作時,它必須提供正在變更的znode節點的資料版本。如果znode提供的版本號不符合目前資料的實際版本號,更新將會失敗。
注意:
在一個分散式應用程式工程中,單字node可以認為是單一主機、一個伺服器、一個整體的其中某個成員,一個客戶端處理器等等。在ZooKeeper文件中,znodes被認為是資料節點。 Servers被認為是組成ZooKeeper服務的主機。 quorum peers被認為是組成一個整體的服務端,clients被認為是正在使用ZooKeeper服務的一個主機或是一個程序。
Znodes是程式設計師存取的主要實體。它們有許多功能值得我們了解的:
Watches(監聽器)
客戶端可以在znodes進行監聽。 znode的變化會觸發這個監聽器然後清除它。當一個監聽器被觸發的時候,ZooKeeper會給客戶端發送一個通知。
Data Access(資料存取)
在命名空間當中儲存在znode當中的資料是原子讀或寫的。讀取操作將會讀取znode關聯的所有資料字節,寫入操作將會取代所有資料。每個節點有Access Control List (ACL)資料存取清單用於限制誰可以做什麼。
ZooKeeper不是設計用於作為資料庫或大物件儲存的,相反的他是用來管理協調資料的。資料的來源形式可以是配置資訊、狀態資訊、地區資訊等等。不同形式的協調資料的通用屬性是他們都相對比較小,控制在KB位元組。 ZooKeeper客戶端和服務端都有合理性檢查以保證znodes小於1M數據,但是數據可以遠小於這個平均值。在相對比較大的資料進行操作將會導致操作花費的時間較長,從而影響到其他操作的延遲,因為這額外的時間需要透過網路或儲存媒體進行資料的遷移。如果大數據的儲存是必須的,通常處理這種資料的方式是保持在大儲存系統中,例如NFS或HDFS,然後在ZooKeeper中儲存指向資料儲存位置的指標。
ZooKeeper有臨時節點的概念。只要建立節點的會話還處於活躍狀態,那麼這些節點還是存在的,當會話關閉時,這些節點也會被刪除。因為這個行為所以臨時節點不允許有子節點。
當創建節點的時候你可以請求ZooKeeper在路徑末尾增加一個單調遞增的計數器。這個計數器對這個父節點是唯一的。計數器的格式是%010d (10進位用0填滿),格式化以便用於簡單排序。例如"
以上是ZooKeeper資料模型的詳細內容。更多資訊請關注PHP中文網其他相關文章!