zookeeper底层实现数据一致性

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

你可能感兴趣的:(zookeeper底层实现数据一致性)