zookeeper 存储之文件格式分析

zookeeper主要存放了两类文件,一个是snapshot和log,前者是内存数的快照,后者类似mysql的binlog,将所有与修改数据相关的操作记录在log中,

两类文件的目录可在配置文件中指定

下面通过几个典型的场景来分析两种文件的存储格式

snapshot文件格式

详见ZooKeeperServer.takeSnapshot,

列举1个简单的场景说明问题

场景 刚刚装了zookeeper,服务启动后会产生snapshot文件

00000000  5a 4b 53 4e 00 00 00 02  ff ff ff ff ff ff ff ff  |ZKSN............|

00000010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 00000020 ff ff ff ff ff ff ff ff 00 00 00 00 00 00 00 00 |................| 00000030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| * 00000060 00 00 00 00 00 00 00 0a 2f 7a 6f 6f 6b 65 65 70 |......../zookeep| 00000070 65 72 00 00 00 00 ff ff ff ff ff ff ff ff 00 00 |er..............| 00000080 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| * 000000b0 00 00 00 00 00 00 00 00 00 00 00 00 00 10 2f 7a |............../z| 000000c0 6f 6f 6b 65 65 70 65 72 2f 71 75 6f 74 61 00 00 |ookeeper/quota..| 000000d0 00 00 ff ff ff ff ff ff ff ff 00 00 00 00 00 00 |................| 000000e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| * 00000110 00 00 00 00 00 00 00 00 00 01 2f 00 00 00 00 ab |........../.....| 00000120 10 2b d2 00 00 00 01 2f |.+...../| 00000128


分成4个部分

a)header

  • magic:4个字节,“ZKSN”的int值  对应 0x 5a 4b 53 4e   【对应偏移地址0x 00000000---0x 00000003

  • version:4个字节,默认为2  对应 0x 00 00 00 02 【对应偏移地址0x 00000004---0x 00000007】

  • dbid:8个字节,默认为-1 对应 0x ff ff ff ff ff ff ff ff 【对应偏移地址0x 00000008---0x 0000000f】

b)data

  • count:session个数,4个字节 此时为0,如果不为0,会存放session的id和timeout,对应 0x 00 00 00 00 【对应偏移地址0x 00000010---0x 00000013】

  • 内存树: 

    • map: acl 映射的个数 4个字节,此时为0 对应0x 00 00 00 00 【对应偏移地址0x 00000013---0x 00000017

    • 开始递归写node

      • 第一个node路径为""也即根节点

        • path

          • len: 4个字节 ,此时为0 对应 0x 00 00 00 00 【对应偏移地址0x 00000017---0x 0000001b

        • node

          • data

            • len: 4个字节,此时为0 ,对应 0x 00 00 00 00 【对应偏移地址0x 0000001c---0x 0000001f

          • acl: 8个字节,此时-1,对应 0x ff ff ff ff ff ff ff ff 【对应偏移地址0x 00000020---0x 00000027】

          • statpersisted: 状态存储

            • czxid : 8个字节,此时为0 ,对应 0x 00 00 00 00 00 00 00 00 【对应偏移地址0x 00000028---0x 0000002f

            • mzxid : 8个字节,此时为0 ,对应 0x 00 00 00 00 00 00 00 00 【对应偏移地址0x 00000030---0x 00000037】

            • ctime : 8个字节,此时为0 ,对应 0x 00 00 00 00 00 00 00 00 【对应偏移地址0x 00000038---0x 0000003f】

            • mtime : 8个字节,此时为0 ,对应 0x 00 00 00 00 00 00 00 00 【对应偏移地址0x 00000040---0x 00000047】

            • version : 4个字节,此时为0 ,对应 0x 00 00 00 【对应偏移地址0x 00000048---0x 0000004b】

            • cversion : 4个字节,此时为0 ,对应 0x 00 00 00  【对应偏移地址0x 0000004c---0x 0000004f】

            • aversion : 4个字节,此时为0 ,对应 0x 00 00 00 【对应偏移地址0x 00000050---0x 00000053】

            • ephemeralOwner : 8个字节,此时为0 ,对应 0x 00 00 00 00 00 00 00 00 【对应偏移地址0x 00000054---0x 0000005b】

            • pzxid : 8个字节,此时为0 ,对应 0x 00 00 00 00 00 00 00 00 【对应偏移地址0x 0000005c---0x 00000063】

      • 开始序列化第2个节点,即根节点的子节点(/zookeeper)

          • path

            • len: 4个字节 ,此时为/zookeeper的长度10对应 0x 00 00 00 0a 【对应偏移地址0x 00000064---0x 00000067

            • 内容: 10个字节 此时为“/zookeeper”的ascii表示 0x 2f 7a 6f 6f 6b 65 65 70 65 72  【对应偏移地址0x 00000068---0x 00000071


          • node: 此时和节点一样,下面的字节和根节点一样

            • data

              • len: 4个字节,此时为0 ,对应 0x 00 00 00 00 【对应偏移地址0x 00000072---0x 00000075

            • acl: 8个字节,此时-1,对应 0x ff ff ff ff ff ff ff ff 【对应偏移地址0x 00000076---0x 0000007d】

            • statpersisted: 状态存储

              • czxid : 8个字节,此时为0 ,对应 0x 00 00 00 00 00 00 00 00 【对应偏移地址0x 0000007e---0x 00000085

              • mzxid : 8个字节,此时为0 ,对应 0x 00 00 00 00 00 00 00 00 【对应偏移地址0x 00000086---0x 0000008d】

              • ctime : 8个字节,此时为0 ,对应 0x 00 00 00 00 00 00 00 00 【对应偏移地址0x 0000008e---0x 00000095】

              • mtime : 8个字节,此时为0 ,对应 0x 00 00 00 00 00 00 00 00 【对应偏移地址0x 00000096---0x 0000009d】

              • version : 4个字节,此时为0 ,对应 0x 00 00 00 【对应偏移地址0x 0000009e---0x 000000a1】

              • cversion : 4个字节,此时为0 ,对应 0x 00 00 00  【对应偏移地址0x 000000a2---0x 000000a5】

              • aversion : 4个字节,此时为0 ,对应 0x 00 00 00 【对应偏移地址0x 000000a6---0x 000000a9】

              • ephemeralOwner : 8个字节,此时为0 ,对应 0x 00 00 00 00 00 00 00 00 【对应偏移地址0x 000000aa---0x 000000b1】

              • pzxid : 8个字节,此时为0 ,对应 0x 00 00 00 00 00 00 00 00 【对应偏移地址0x 000000b2---0x 000000b9】

        • 开始序列化第3个节点(/zookeeper的子节点/zookeeper/quota

          • path

            • len: 16个字节 ,此时为/zookeeper/quota“的长度16, 对应 0x 00 00 00 10 【对应偏移地址0x 000000ba---0x 000000bd

            • 内容: 10个字节 此时为”/zookeeper/quota“的ascii表示0x 2f 7a 6f 6f 6b 65 65 70 65 72  2f 71 75 6f 74 61

               【对应偏移地址0x 000000be---0x 000000cd


          • node: 此时和根节点一样,下面的字节和根节点一样

            • data

              • len: 4个字节,此时为0 ,对应 0x 00 00 00 00 【对应偏移地址0x 000000ce---0x 000000d1

            • acl: 8个字节,此时-1,对应 0x ff ff ff ff ff ff ff ff 【对应偏移地址0x 000000d2---0x 000000d9】

            • statpersisted: 状态存储

              • czxid : 8个字节,此时为0 ,对应 0x 00 00 00 00 00 00 00 00 【对应偏移地址0x 000000da---0x 000000e1

              • mzxid : 8个字节,此时为0 ,对应 0x 00 00 00 00 00 00 00 00 【对应偏移地址0x 000000e2---0x 000000e9】

              • ctime : 8个字节,此时为0 ,对应 0x 00 00 00 00 00 00 00 00 【对应偏移地址0x 000000ea---0x 000000f1】

              • mtime : 8个字节,此时为0 ,对应 0x 00 00 00 00 00 00 00 00 【对应偏移地址0x 000000f2---0x 000000f9】

              • version : 4个字节,此时为0 ,对应 0x 00 00 00 【对应偏移地址0x 000000fa---0x 000000fd】

              • cversion : 4个字节,此时为0 ,对应 0x 00 00 00  【对应偏移地址0x 000000fe---0x 00000101】

              • aversion : 4个字节,此时为0 ,对应 0x 00 00 00 【对应偏移地址0x 00000102---0x 00000105】

              • ephemeralOwner : 8个字节,此时为0 ,对应 0x 00 00 00 00 00 00 00 00 【对应偏移地址0x 00000106---0x 0000010d】

              • pzxid : 8个字节,此时为0 ,对应 0x 00 00 00 00 00 00 00 00 【对应偏移地址0x 0000010e---0x 00000115】

    • 树的结尾以"/"结束

      • 共5个字节,前4个表示长度为1,后面是"/"的ascii码0x 2f ,总共是0x 00 00  00 01 2f 【对应偏移地址0x 00000116---0x 0000011a

c) 校验码

通过Adler32校验算法,对前面的字节得出的一个校验码,占8个字节  

0x 00 00 00 00 ab 10 2b d2 【对应偏移地址0x 0000011b---0x 00000122


d)结束符

和内存树一样以"/"为结束符

共5个字节,前4个表示长度为1,后面是"/"的ascii码0x 2f ,总共是0x 00 00 00 01 2f 【对应偏移地址0x 00000123---0x 00000127】


log文件格式

详见FileTxnLog.append

场景1) 启动一个客户端

此时会跟据当前事务的id,此时为1,产生log.1的文件

1) fileheader

  • magic:4个字节,“ZKLG”的int值  对应 0x 5a 4b 4c 47   【对应偏移地址0x 00000000---0x 00000003

  • version:4个字节,默认为2  对应 0x 00 00 00 02 【对应偏移地址0x 00000004---0x 00000007

  • dbid:8个字节,默认为0 对应 0x 00 00 00 00 00 00 00 00 【对应偏移地址0x 00000008---0x 0000000f

2)请求内容

  • txnEntryCRC(校验码,对于下面的txEntry

    • 采用和snapshot同样的算法Adler32得到的长整数8个字节 0x 00 00 00 00 59 27 08 06【对应偏移地址0x 00000010---0x 00000017

  • txEntry

    • 内容长度:4个字节  0x 00 00 00 24 【对应偏移地址0x 00000018---0x 000001b

    • hdr

    • clientId:长整数8个字节 0x 01 3a 69 4e 19 1a 00 00 【对应偏移地址0x 0000001c---0x 00000023

    • cxid:此时为整数0,4个字节  0x 00 00 00 00 【对应偏移地址0x 00000024---0x 00000027

    • zxid:此时为整数1,8个字节 0x 00 00 00 00 00 00 00 01 【对应偏移地址0x 00000028---0x 0000002f

    • time:整数8个字节 , 00 00 01 3a 69 4e ab af 【对应偏移地址0x 00000030---0x 00000037

    • type:操作码(码表见org.apache.zookeeper.ZooDefs.OpCode)此时为整数-10,4个字节  0x ff ff ff f6 【对应偏移地址0x 00000038---0x 0000003b

    • txn

      • timeOut:此时整数400000,4个字节  0x 00 06 1a 80【对应偏移地址0x 0000003c---0x 0000003f

  • EOR

    • 写入一个固定的字节作为结尾:0x 42 【对应偏移地址0x 00000040

      


此时为

1
2
3
4
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值