ZooKeeper原始碼解析(5)-Snapshot檔案的格式

weixin_34236497發表於2017-09-16

在ZooKeeper的Snapshot檔案中,儲存了當時ZooKeeper的狀態和資料.

那麼ZooKeeper中到底儲存了什麼內容呢?官方文件中沒有明確說明,所以我們只好通過讀原始碼來獲取.

我是在讀完相關的部分的原始碼之後,總結出來的這樣一個結構.我是通過原始碼中相關類的serialize()方法和deserialize()方法來總結的.

4108852-0b1eeae4b64ed47f.jpg

下面我們將會詳細解釋其中每一部分的作用.

File Header

其實每種檔案的十六進位制的表示中,開頭的部分都是Header,ZooKeeper的Snapshot的Header的結構如下:

4108852-c31bddc262c6b2ad.jpg

我們可以看到,在每個格子中,上面都是一個名稱,下面是這個欄位所佔用的位元組數.後面的圖片中,我們都將採用這種方式來表示欄位.

其中第一部分很好理解,就是一個固定的字串-"ZKSN",只有當Snapshot的magic欄位是這個字串以及以特定的方式結尾,那麼這個Snapshot才是有效的.

第二個欄位是version,它代表的是版本號.

第三個欄位是dbid.那麼什麼是db呢?在ZooKeeper中,抽象出來一種資料型別-"ZkDatabase",它在記憶體中維護著ZooKeeper Server的各種狀態,比如sessions,datatree以及committed logssessions是ZooKeeper Server和Client中維護的一個連線,datatree是ZNode的形成的一棵樹,這個很容易理解嘛.committed logs指的是已經提交的日誌,這個是Zab中的一個概念.

Other server's information

4108852-0c4f2c1107a6b284.jpg

count欄位指的是更有多個ZooKeeper Server.

接下來是countserver information了,每個server information都包括idtimeout兩部分.

id是ZooKeeper Server的id,ZooKeeper在Cluster模式下啟動時,我們需要在datadir下面建立一個名為myid的檔案,其中的數字就是ZooKeeper Server的id.

timeout是這臺ZooKeeper Server和id為id的那臺ZooKeeper Server之間的超時的時間,當超過了這個時間,就認為那臺ZooKeeper Server不可用了.

ACL Caches

4108852-2999b26afb2c193d.jpg

第一個欄位是map,其實ACL Caches的結構就是一個Map<Long, List<ACL>>.這個Map中,key是一個分組的id,value是ACL列表.map欄位表示的是Map的大小.

後面的就很容易解釋了,long表示的是分組的id,acls表示的是這個分組內更有多少個ACL.perms是表示的許可權,在ZooKeeper中,提供了下面的幾種許可權:

4108852-5300184718f61157.png

scheme前的len表示的是scheme的長度,因為scheme是String型別的,我們需要用它來指明它的長度.id前面的len同樣也是表明id的長度表明的是id的長度,同樣也是因為id是String型別的.

ZooKeeper都支援下面幾種Scheme:

4108852-77b474d7d2c590c4.png

Nodes

4108852-59f3bc00cce8df44.jpg

Node指的是ZooKeeper中的ZNode.每個Znode都由幾部分組成:路徑,資料,後設資料.每個欄位的含義在ZooKeeper文件中有,這裡我直接貼出來:

4108852-71ab4dd5367af6e0.png

根目錄"/"有特殊的形式,它只儲存"1/",表示其長度為1,路徑是"/",在ZooKeeper的Snapshot中,就是用header中的magic以及這個根目錄來判斷檔案是否是Snapshot的.

相關文章