The Zookeeper data modelhtml
Zookeeper有一個樹形的namespace,就像分佈式文件系統同樣,惟一區別就是這個namespace包括其子節點能夠有關聯的數據。就像文件系統容許有文件或者文件夾同樣。節點的路徑一般用絕對的,帶/分隔的字符串表示。任何字符串均可以被使用除了下面所列舉的內容:node
·The null character (\u0000) cannot be part of a path name. (This causes problems with the C binding.)git
·The following characters can't be used because they don't display well, or render in confusing ways: \u0001 - \u0019 and \u007F - \u009F.數據庫
·The following characters are not allowed: \ud800 -uF8FFF, \uFFF0-uFFFF, \uXFFFE - \uXFFFF (where X is a digit 1 - E), \uF0000 - \uFFFFF.apache
·The "." character can be used as part of another name, but "." and ".." cannot alone be used to indicate a node along a path, because ZooKeeper doesn't use relative paths. The following would be invalid: "/a/b/./c" or "/a/b/../c".編程
·The token "zookeeper" is reserved.緩存
Zookeeper中全部的node都是指znode,znode維護了一個狀態結構,包括data change,acl change,時間戳,version,version對應的時間戳,幫助zookeeper驗證緩存,協助更新。Znode的data發生change,version增長。當客戶端查找data也會同時接收到data的version。當客戶端更新或者刪除某一version的data時,也必須提供data的version。當data和version不匹配,則這次操做失敗(失敗後的處理可被重寫)安全
Znodes是主要的編程入口,下面是幾個有價值的內容:網絡
Watchessession
客戶端能夠在znodes上設置watches,改變znode的觸發watch的機制和清楚watch。當一個watch觸發,zookeeper會發送一個消息給客戶端。相關鏈接爲
http://zookeeper.apache.org/doc/r3.4.6/zookeeperProgrammers.html#ch_zkWatches
Data Access
在每一個znode的namespace下,數據被自動的讀和寫。讀操做能夠獲取znode全部相關的data bytes,寫操做會替換全部的data。每一個node都有一個access contril list(ACL)來制約誰有使用權。
Zookeeper不是被設計成一個通用的數據庫或者很大的對象存儲。推薦用作管理協調性的data。Data的來源能夠是in the form of configuration,status information,rendezvous,etc.由於這些東西比較小,以kb計量。Zookeeper的client和server確保znodes的data小於1M,而且data平均應該小於1M。大量數據會在網絡和存儲上消耗時間,從而影響性能。大量數據應該被存在hdfs上,zookeeper上存的是數據的路徑等配置。
Ephemeral Node
Zookeeper也有臨時node的概念,這些znodes只會在session活着的時候存在。所以ephemeral node也不容許有子節點。
Sequence Nodes – Unique Naming
當你create一個node同時你能夠要求zookeeper在path後面增長一個單調增長的計數,這個計數是惟一的。計數是10位數大小。超過2147483647會溢出
Zxid
每一個對zookeeper state的change都會有一個印記,zxid(zookeeper transaction id),zxid說明了zookeeper全部版本的change,zxid越小,發生的越早
Version number
每一個對node的change都會對node的一個version number增長。
有三個version,分別是version(number of changes to the data of a znode),cversion(number of changes to the children of a znode),aversion(number of changes to the ACL of a znode)
Ticks
當使用多servers的zookeeper,servers用ticks定義關於時間的事件,例如status uploads,session timeout,connection timeout between peers.
Real time
Zookeeper不適用實時時間或者時鐘,而是在stat structure里加時間戳。
Stat structure由如下組成
cxid
形成zxid變化的znode建立
mzxid
在這個znode中最後被修改的zxid
ctime
這個znode被建立的毫秒級時間戳
mtime
這個znode最後被修改的時間
version
這個node的change次數
cversion
這個znode的子節點的change次數
aversion
這個znode的ACL的change次數
ephemeralOwner
若是這個znode是Ephemeral node,則爲session id,不然就是0
dataLength
這個znode的data fields的長度
numChildren
這個znode的子節點數量
一個zookeeper的client經過用語言綁定create handle創建一個和zookeeper service相連的session。一旦建立,handle開始是connection狀態,客戶端的庫嘗試鏈接zookeeper servers的其中一個,直到狀態切換成connected。通常的操做只有connection和connected兩個狀態。如何有一格不可被恢復的錯誤發生,好比session到期或者權限校驗失敗,或者application 已經關閉了handle,handle會把狀態卻換成closed。下圖說明了zookeeper的client的狀態轉換。
Zookeeper的client會在設置的servers中任意挑選一個鏈接,若是鏈接失敗了,client會嘗試用另外一個servers去鏈接,直到鏈接創建。
當client從zookeeper service中得到handle,zookeeper會建立一個zookeeper session,用一個64位數表示,並分配給client。當client鏈接到不一樣的zookeeper servers,在鏈接握手中會帶入session id。在有安全措施的狀況下,server會爲session id建立一個全部zookeeper server都承認的password。這個password在client創建session的過程當中會和session id一塊兒發送給client。當client從新和新的servers創建鏈接的時候,須要把session id和password一塊兒發送servers。
全部的讀操做,例如getData(),getChildren(),exits(),都有一個設置watch的選項。Zookeeper的watch的定義是,one-time trigger,當dataq發生change發送給設置watch的client,下面是三個關鍵點:
One-time trigger
當client設置了watch,例如getData(「/znode」,true),以後這個data被change了,那watch會接收到一次事件,若是這個data再次被change,則watch不會再接收到事件,除非client再設置getData(「/znode」,true)
Sent to the client
Change事件會發送給client,可是不必定在修改或者初始化change返回成功代碼以前到達。Watches都是被異步發送給watcher。Zookeeper提供了一個順序保證:client不會知道一個watch的change直到client第一次知道watch事件。保證了不一樣client看到的東西的順序都是一致性的
The data for which the watch was set
Zookeeper維護了兩種watches,data watches和child watches。getData(),exists()是用來設置data watches,getChildren()是用來設置child watches。
只有一種狀況下,watch會丟失:一個還沒存在的znode在disconnected狀態下的建立和刪除。
參考資料:
//官網的介紹
http://zookeeper.apache.org/doc/r3.4.6/zookeeperProgrammers.html#ch_zkSessions
PS
下方是我我的訂閱號,會一直更新各種技術文章,歡迎關注 :)