ZooKeeper源码解析(5)-Snapshot文件的格式

Posted by AlstonWilliams on February 17, 2019

在ZooKeeper的Snapshot文件中,存储了当时ZooKeeper的状态和数据.

那么ZooKeeper中到底存储了什么内容呢?官方文档中没有明确说明,所以我们只好通过读源码来获取.

我是在读完相关的部分的源码之后,总结出来的这样一个结构.我是通过源码中相关类的serialize()方法和deserialize()方法来总结的.

下面我们将会详细解释其中每一部分的作用.

File Header

其实每种文件的十六进制的表示中,开头的部分都是Header,ZooKeeper的Snapshot的Header的结构如下:

我们可以看到,在每个格子中,上面都是一个名称,下面是这个字段所占用的字节数.后面的图片中,我们都将采用这种方式来表示字段.

其中第一部分很好理解,就是一个固定的字符串-"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

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

第一个字段是map,其实ACL Caches的结构就是一个**Map<Long, List>**.这个Map中,key是一个分组的id,value是ACL列表.**map**字段表示的是Map的大小.

后面的就很容易解释了,long表示的是分组的id,acls表示的是这个分组内更有多少个ACL.perms是表示的权限,在ZooKeeper中,提供了下面的几种权限:

scheme前的len表示的是scheme的长度,因为scheme是String类型的,我们需要用它来指明它的长度.id前面的len同样也是表明id的长度表明的是id的长度,同样也是因为id是String类型的.

ZooKeeper都支持下面几种Scheme:

Nodes

Node指的是ZooKeeper中的ZNode.每个Znode都由几部分组成:路径,数据,元数据.每个字段的含义在ZooKeeper文档中有,这里我直接贴出来:

根目录"/"有特殊的形式,它只存储“1/”,表示其长度为1,路径是”/”,在ZooKeeper的Snapshot中,就是用header中的magic以及这个根目录来判断文件是否是Snapshot的.