Zookeeper底层实现数据一致性

本文介绍了Zookeeper如何通过事务日志和数据快照实现数据的持久化存储。事务日志记录每次操作并以zxid命名,便于追踪;数据快照则在一定次数操作后生成,反映Zookeeper当前的全量数据状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

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

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

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

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

转载于:https://my.oschina.net/134596/blog/1647862

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值