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

[经验分享] Zookeeper详解(八):Zookeeper数据存储

[复制链接]

尚未签到

发表于 2019-1-7 14:22:08 | 显示全部楼层 |阅读模式
  zookeeper日志有三类:快照(虽然不是日志但是它是数据)、事务日志(记录每次操作)、zookeeper自己系统日志。第三个不属于数据类所以这里不做说明。

  

  快照数据
  Zookeeper在运行时会在内存中维护一个完整的数据,就像内存数据库一样。ZKDatabase就是Zookeeper的内存数据库,负载管理Zookeeper的会话、存储和事务日志。它会定期dump一份数据快照到硬盘上,在Zookeeper启动时根据这个快照数据和事务日志来加载一份完整的数据到内存。这一点跟Redis很像,其实很多时候思路都是一样。
  通过在配置文件中设置dataDir来指定快照保存位置。将内存数据库写入快照文件其实是一个序列化的过程。快照文件保存只是每个节点的元数据而非数据本身
  那么每次快照间隔多久呢?
  其实可以通过snapCount来进行配置,这个值得含义是每次快照之间的事务数量。也就是说执行多少次事务操作后进行一次快照。
  


  •   每完成一次事务操作Zookeeper都会检查是否达到snapCount设置也就是来判断是否需要进行快照操作,因为快照本身对机器性能有影响,要避免集群中所有节点都进行快照
  •   如果要进行快照操作,首先就需要对事务日志进行截断然后切换,所以事务日志写满不是以64M为标准而是以事务条数为标准的。
  •   创建异步线程来执行快照操作(这一点又和Redis的bgsave一样)
  •   从ZKDatabase中获取全量数据和会话,因为要保存内存所有数据节点信息和会话信息
  •   生成快照名称,会根据已提交的最大ZXID来生成快照名称
  •   数据序列化,首先会序列化文件头信息(魔数、版本、dbid信息),然后对会话信息和DataTree(Zookeeper内存数据的核心一个树形数据结构,代表内存完整数据)分别序列化,同时生成一个校验和,然后一起写入数据文件中。

  

  事务日志
  在配置文件中通过dataLogDir来配置事务日志路径,如果不配置默认保存在dataDir指定的路径下面。

  
  这些文件都是65M,其实是64M。而且都是以log.开头后面是一个十六进制数字作为后缀。这个后缀是一个ZXID它是写入该日志的第一个事务的事务ID,这样可以达到快速定位某一事务的效果。
  

  日志写入过程:

  •   当需要写入事务日志的时候Zookeeper会判断它是否和一个可写入的事务日志相关联,如果关联就写入,如果没有则用该事务的事务ID来创建一个事务日志,同时将这个事务日志对应的文件流放入到一个集合中(streamsToFlush),这个集合中记录的是当前需要强刷数据到磁盘的文件流(因为操作系统通常有延迟写入机制,对于Linux系统强刷等于调用fsync)。
  •   事务日志文件采用预先分配空间策略,这样为了保证单一事务日志文件所占用的磁盘块是连续的,这也是为了提高性能。当Zookeeper发现当前正在写入的事务日志文件空间不足4KB时,就会启动预先分配空间策略进行扩容。第一次使用事务日志或者事务日志达到切割条数(snapCount参数触发快照)会启动预先分配策略;其他时候只要发现当前使用的事务日志空余不足4KB就进行扩容,扩容时使用0进行填充。
  •   确保日志文件空间够之后就需要对进行事务序列化操作,最终产生一个字节数组。主要对事务头(TxnHeader)和事务体(Record)进行序列化。
  •   根据序列化后的字节数据计算一个校验和
  •   将字节数组和校验写入到文件流中。
  •   由于该事务日志的文件流在集合中,这时候就会从集合里面取出文件流强刷落盘。
  初始化
  Zookeeper启动期间要完成数据初始化也就是将完整的数据加载到内存。它会根据快照和事务日志来完成加载过程。快照保存的是数据的元数据(不包括节点数据)而事务日志记录的操作和数据,那么使用快照+事务日志的方式可以还原完整的数据。它会先解析快照文件用于恢复出一个DataTree,此时就可以解析出个最新的ZXID,然后再根据ZXID来通过事务日志进行数据填充。另外还需要获取大于ZXID之后的事务日志进行应用。当完成数据恢复以后就可以获得一个最新的ZXID,这ZXID就是上次最后一个提交的事务ID。
  

  完成初始化之后并且如果在集群环境中,Leader和其他服务器还会有一个数据同步过程。
  Leader服务器会提取三个值:peerLastZxid(其他角色服务器最后处理的ZXID)、minCommittedLog(Leader服务器当前最小的ZXID)、maxCommittedLog(Leader服务器当前最大的ZXID)。

  •   差异同步:如果其他角色服务器的peerLastZxid介于minCommittedLog、maxCommittedLog那么就使用差异化同步,这时候Leader就知道他和对端服务器差多少,然后把这个差异进行发送再提交就是Zookeeper的两阶段提交。
  •   先回滚在差异同步:另外一种情况是在上一种情况下发生了意外原来的Leader要发送但是此时该Leader挂了,那么其余的会进行Leader选举,新的Leader产生后原来的Leader恢复了,那么显然他俩的ZXID有可能不同,新的Leader的ZXID小,但是要保证Leader的权威所以其他ZXID比它大的都要回滚到和现有Leader一样的状态或者小于Leader的ZXID的状态,然后在进行差异同步。
  •   仅回滚:也就是Leader让其他服务器都回滚到和自己一样的最大ZXID上
  •   全量同步:peerLastZxid小于Leader上的minCommittedLog,其实就是Leader将全部内存数据给Learner。这种情况通常用于在现有集群中又增加了一台Zookeeper服务器。




运维网声明 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-660411-1-1.html 上篇帖子: zookeeper全局唯一id生成 下篇帖子: Zookeeper详解(十):Python连接和操作Zookeeper
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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