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

[经验分享] ZooKeeper启动数据初始化分析

[复制链接]

尚未签到

发表于 2019-1-8 12:17:54 | 显示全部楼层 |阅读模式
在ZooKeeper服务器启动期间,首先会进行数据初始化工作,用于将存储在磁盘上的数据文件加载到ZooKeeper服务器内存中。
DSC0000.jpg

初始化流程
数据初始化工作其实就是从磁盘中加载数据的过程,主要包括了从快照文件中加载快照数据的根据事务日志进行数据订正两个过程。
1.初始化FileTxnSnapLog
FileTxnSnapLog是ZooKeeper事务日志和快照数据访问层,用于衔接上层业务与底层数据存储。底层数据包括了事务日志和快照两部分,因此FileTxnSnapLog内部氛围FileTxnLog和FileSnap的初始化,分别代表事务日志管理器和快照数据管理器的初始化。
2.初始化ZKDatabase
接下来就开始构建内存数据库ZKDatabase了。在初始化过程中,首先会构建一个初始化的DataTree,同时将步骤1中初始化的FileTxnSnapLog交给ZKDatabase,以便于内存数据库能够对事务日志和快照数据进行访问。
DataTree是ZooKeeper内存模型的核心模型,简而言之就是一棵树,保存了ZooKeeper上的所有节点信息,在每个ZooKeeper服务器内部都是单例。在ZKDatabase初始化的时候,DataTree也会进行相应的初始化工作——创建一些ZooKeeper的默认节点,包括/、/zookeeper、/zookeeper/quota三个节点的创建。
除了ZooKeeper的数据节点,在ZKDatabase的初始化阶段还会创建一个用于保存所有客户端会话超时时间的记录器:sessionsWithTimeouts——会话超时时间记录器。
3.创建PlayBackListener监听器
PlayBackListener监听器主要用来接收事务应用过程中的回调。在后面读者会看到,在ZooKeeper数据恢复后期,会有一个事务订正过程,在这个过程中会回调PlayBackListener监听器来进行对应的数据订正。
4.处理快照文件
完成内存数据库的初始化之后,ZooKeeper就开始从磁盘中恢复数据了。在上文中我们已经提到,每一个快照数据文件中都保存了ZooKeeper服务器近似全量的数据,因此首先从这些快照文件开始加载。
5.获取最新的100个快照文件
ZooKeeper服务器运行一段时间之后,磁盘上会保留许多快照文件。另外由于每次数据快照过程中,ZooKeeper都会将全量数据Dump到磁盘快照文件中,因此往往更新时间最晚的那个文件包含了最新的全量数据。那么是否我们只需要这个罪行的快照文件就可以了呢?在ZooKeeper的实现中,会获取最新的之多100个快照文件。
6.解析快照文件
获取到这之多100个文件之后,ZooKeeper会“逐个”进行解析每个快照文件都是内存数据序列化到磁盘的二进制文件,因此在这里需要对其进行反序列化,生成DataTree对象和sessionsWithTimeouts集合。同时在这个过程中,还会进行文件的checkSum校验以确认快照文件的正确性。
在“逐个”解析的过程中,如果正确性校验通过的话,呢么通常只会解析最新的那个快照文件。换句话说,只有当最新的快照文件不可用的时候,才会逐个进行解析,知道将这100个文件全部解析完成。如果将步骤4中获取的所有快照文件都解析完成后还是无法完成恢复一个完整的DataTree和sessionWithTimeouts,则认为无法从磁盘中加载数据,服务器启动失败。
7.获取罪行的ZXID
完成6之后,就已经基于开招文件构建了一个完整的DataTree实例和sessionsWithTimeouts集合了。此时根据这个快照文件的文件名就可以解析出一个最新的ZXID:zxid_for_snap,它代表了ZooKeeper开始进行数据快照的时刻。
8.处理事务日志
在经过前面7处理后,此时ZooKeeper服务器内存中已经有了一份近似全量的数据了,开始就要通过事务日志来更新增量数据了。
9.获取所有zxid_for_snap之后提交的事务
到这里,我们已经获取到了快照数据的最新ZXID。ZooKeeper中数据的快照机制决定了快照文件中并非包含了所有的事务操作。蛋是未被包含在快照中的那部分事务操作是可以我替你故宫 数据订正来实现的。因此这里我们只需要从事务日志中获取所有ZXID比步骤7中得到的zxid_for_snap大的事务操作。
10.事务应用
获取到所有ZXID大于zxid_for_snap的事务后,将其逐个应用到之前基于快照数据文件恢复出来的DataTree和sessionsWithTimeouts中去。在事务应用的过程中,还有一个细节需要我们注意,每当有一个事务被应用到内存数据库中,ZooKeeper同时会回调PlayBackListener监听器,将这一事务操作记录转换成Proposal,保存到ZKDatabase.committedLog中,以便Follower进行快速同步。
11.获取最新ZXID
待所有事务都被完整地应用到内存数据库中,基本上就完成了数据的初始化过程,此时再次获取一个ZXID,用来标识上次服务器正常运行时提交的最大事务ID。
12.校验epoch
epoch是ZooKeeper中一个非常特别的变量,其字面意思是“时代”,在ZooKeeper中,epoch标识了当前Leader周期。每次选举产生一个新的Leader服务器之后,就会生成一个新的cpoch。在运行期间集群中机器互相通信的过程中,都会带上这个epoch一确保彼此在同一个Leader周期内。
在完成数据加载后,ZooKeeper会从步骤11中确定的ZXID中解析出事务处理的Leader周期:epochOfZxid。同时会从磁盘的currentEpoch和acceptedEpoch文件中对去出上次记录的最新的epoch值,进行校验。
以上就是ZooKeeper服务器启动时期的数据初始化的全过程。
更多精彩内容,欢迎关注微信公众号:Java小笔记(ijavanote)
  





运维网声明 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-660760-1-1.html 上篇帖子: Zookeeper深入浅出之快速入门实例 下篇帖子: zookeeper单机部署及集群(单机伪集群)部署
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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