zookeeper底层实现数据一致性

主要通过事务日志以及数据快照来实现。
事务日志:记录了对zookeeper的操作,以axid命名,可以快速的定位到查询的事务。同时采用磁盘预分配策略,未使用的部分写为0,避免每次追加数据都需要磁盘IO为文件开辟新空间,其每个日志文件大小固定为64M。
数据快照:用来记录某一时刻zookeeper全部内存数据内容,将其写入到指定的磁盘文件中。也是使用zxid作为文件后缀名,并没有采用磁盘预分配的策略,因此数据快照文件在一定程度上反应了当前zookeeper的全量数据大小。
对于每一次的客户端操作都写入日志文件,同时更新zookeeper的内存数据。当zookeeper进行了若干次(snapcount)操作后,会将内存中的全量数据dump到本地文件,即数据快照。
为了避免zookeeper中所有节点同时进行数据快照,zookeeper采用过半随机的策略。开始快照时,首先关闭当前日志文件,重新创建一个新的日志文件。从内存中获取zookeeper的全量数据和校验信息,并序列化写入到本地磁盘文件,以本次写入的第一个事务的ZXID为后缀。
数据恢复时会加载最近100个快照文件,之所以是100个,是因为可能最近的那个快照文件无法通过校验,则向前继续解析,直到第一个可以正确校验的快照文件。然后执行事务日志中的操作,此时即使不是最近一个快照文件,我们可以从快照文件中找到ZXID,便可以定位到具体事务文件从哪一个开始。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一、前言 前面分析了Zookeeper对请求的处理,本篇博文接着分析Zookeeper中如何对底层数据进行存储,数...
    达微阅读 214评论 0 0
  • 在Zookeeper中,数据存储分为两部分:内存数据存储和磁盘数据存储。本文主要分析服务器启动时内存数据库的初始化...
    Monica2333阅读 2,381评论 0 2
  • 我们知道Zookeeper是将全量数据存储在内存中,但他是怎样进行容错的呢?当节点崩溃后或重新初始化时,是怎么会发...
    先生zeng阅读 746评论 0 1
  • ORA-00001: 违反唯一约束条件 (.) 错误说明:当在唯一索引所对应的列上键入重复值时,会触发此异常。 O...
    我想起个好名字阅读 5,484评论 0 9
  • 数据分类 整体分为 3 类: 内存数据 磁盘数据: 磁盘数据又分为 1. 快照 2. 事务日志 在zk启动...
    tracy_668阅读 3,963评论 0 2