在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 logs.sessions是ZooKeeper Server和Client中维护的一个连接,datatree是ZNode的形成的一棵树,这个很容易理解嘛.committed logs指的是已经提交的日志,这个是Zab中的一个概念.
Other server's information
count字段指的是更有多个ZooKeeper Server.
接下来是count个server information了,每个server information都包括id和timeout两部分.
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表示的是分组的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的.