Zookeeper底层实现数据一致性

主要通过事务日志以及数据快照来实现的。

事务日志记录了对Zookeeper的操作。以zxid命名,可以快速的定位到查询的事务。它还采用了磁盘预分配策略,未使用的部分写为0,避免每次追加数据都需要磁盘IO为文件开辟新空间。其每个日志文件大小固定为64M。

数据快照:是Zookeeper数据存储的另一个非常重要的机制。用来记录某一时刻Zookeeper全部内存数据内容,将其写入到指定的磁盘文件中,也是使用zxid作为文件后缀名,但是它没有采用磁盘预分配的策略。因此数据快照文件在一定程度上反应了当前Zookeeper的全量数据大小。

对于每一次的客户端操作都写入日志文件,同时更新Zookeeper的内存数据。当Zookeeper进行了若干次(snapcount)操作之后,会将内存中的全量数据dump也就导入到本地文件,这就叫数据快照。

为了避免Zookeeper中所有节点同时进行数据快照,Zookeeper采用过半随机的策略。开始快照时,首先关闭当前日志文件。重新创建一个新的日志文件。从内存中获取Zookeeper的全量数据和校验信息,并序列化写入到本地磁盘文件,以本次写入的第一个事务的ZXID为后缀。

数据恢复时会加载最近100个快照文件。之所以是100个事可能最近按个快照文件不能通过校验。则向前继续解析,直到第一个可以正确校验的快照文件截止。然后执行事务日志中的操作,此时即使不是最近一个快照文件,我们可以从快照文件中找到ZXID,便可以定位到具体事务文件从哪一个开始。

猜你喜欢

转载自my.oschina.net/134596/blog/1647862