设为首页 收藏本站
查看: 988|回复: 0

[经验分享] 2.zookeeper原理解析-数据存储之Snapshot

[复制链接]

尚未签到

发表于 2015-11-21 15:27:30 | 显示全部楼层 |阅读模式
  =====================================斩秋|http://blog.iyunv.com/quhongwei_zhanqiu=======================================
  
  Snapshot是datatree在内存中某一时刻的影像,zookeeper有一定的机制会定时生成datatree的snapshot。FileSnap实现了SnapShot接口负责将数据写入文件中,下面我们来看看snap相关内容。
  2.1 snapshot文件格式
   Snapshot是以二进制形式存在在文件的,我们用ue打开一个新的snapshot文件
DSC0000.jpg

  
  Snapshot文件的中数据大体可以分为两部分header和body。

  
  Header数据格式:
FileHeader{

   int    magic  //魔数   常量ZKSN  代表zookeeper snapshot文件

   int    version  //版本  常量 2

   long   dbid   //dbid  常量 -1

}

这里很奇怪 version和dbid都是常量,那还有什么意思,也许是保留字段为后续版本使用。

  由头部字段可以计算出头部信息占用 4 + 4 + 8 =16bit的固定长度
  5A 4B 53 4E 就是魔术ZKSN
  00 00 00 02 就是dbid号2
FF FF FF FF FF FF FF FF就是十六进制的-1
  

  
  Body数据格式:
  Snapshot文件中头部信息之后,紧接着就是body部分的信息,body数据大小是动态不是固定。
  1) Map<Long, Integer> sessionWithTimeoutbody信息前面部分存储的是内存中活着的session以及session的超时时间
oa.writeInt(sessSnap.size(),&quot;count&quot;);

        for (Entry<Long, Integer> entry :sessSnap.entrySet()) {

           oa.writeLong(entry.getKey().longValue(), &quot;id&quot;);

            oa.writeInt(entry.getValue().intValue(),&quot;timeout&quot;);

        }

  由上面序列到文件代码可以看出先写入一个int类型字段用来存储sessionWithTimeout的个数,然后在遍历集合以一个long一个int的形式写入
  2) 紧接着就是对datatree序列化到文件了
  我们看下datatree的序列化方法
public voidserialize(OutputArchive oa, String tag) throws IOException {

        scount = 0;

        serializeList(longKeyMap, oa);

        serializeNode(oa, newStringBuilder(&quot;&quot;));

        if (root != null) {

            oa.writeString(&quot;/&quot;,&quot;path&quot;);

        }

    }

2.1)序列化longKeyMap是存储在datatree中的acl权限集合

  readInt(&quot;map&quot;) //acl的映射个数?
  while (map > 0) {
  readLong(&quot;long&quot;) //这个long&#20540;longKeyMap的key,作用?是这一组acl的key
  readInt(&quot;acls&quot;)
  while (acls) {
  readInt(&quot;perms&quot;)
  readString(&quot;scheme&quot;)  
  readString(&quot;id&quot;)
  }
  }

2.2)存储datatree中数据节点

        readString(&quot;path&quot;)//第一个datanode &quot;&quot;

    while(!path.equals(&quot;/&quot;)) {   //  &quot;/&quot;代表路径结束      

           readRecord(node, &quot;node&quot;)包括:

           readBuffer(&quot;data&quot;)

           readLong(&quot;acl&quot;)

           deserialize(archive,&quot;statpersisted&quot;) 状态存储包括:

                          readLong(&quot;czxid&quot;)  //createNode时事务号

                            readLong(&quot;mzxid&quot;)  //createNode时与Czxid同,setData时的事务号

                            readLong(&quot;ctime&quot;)  // 创建节点时间

                            readLong(&quot;mtime&quot;)  //createNode时与ctime相同,setData时间

                            readInt(&quot;version&quot;)  //createNode版本为0,setData的数据版本号

                            readInt(&quot;cversion&quot;) //createNode版本为0,增加/删除子节点时父节点&#43;1

                            readInt(&quot;aversion&quot;) //createNode版本为0,setACL时节点的版本号

                            readLong(&quot;ephemeralOwner&quot;) // 临时节点表示sessionid,非临时节点这个&#20540;为0

                            readLong(&quot;pzxid&quot;)  //createNode时与Czxid同,增加/删除子节点时为子节点事务号


        readString(&quot;path&quot;) //读取下一个路径

  }

3)  文件尾部校验数据

00 00 00 01 2F  snapshot文件结尾5位数据用来校验snapshot文件是否有效

   00 00 00 01一个int的数&#20540;就是数字1,代表后面1一个字符数据

   2F 就是snapshot的结束符/


4)Snapshot序列化
DSC0001.jpg
  

  5)Snapshot反序列化
   DSC0002.jpg

  

  =====================================斩秋|http://blog.iyunv.com/quhongwei_zhanqiu=======================================

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-141908-1-1.html 上篇帖子: zookeeper 协调服务-更新server地址列表 下篇帖子: Spring整合Dubbo,使用zookeeper作为注册中心,进行远程调用及负载均衡、自动失效转移(何志雄)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表