天天看点

Zookeeper - zookeeper 底层实现数据一致性

zookeeper 主要应用事务日志和数据快照来实现底层数据一致性;

事务日志

事务日志是记录zookeeper 事务操作的日志文件。以ZXID 为事务日志文件名的后缀,可以快速的定位到查询的事务。采用“磁盘空间预分配”策略,未使用部分用0 补位,避免每次追加数据都需要磁盘IO 为文件开辟新空间(节省磁盘Seek)。每个日志文件大小固定为64M。

数据快照

数据快照记录某一时刻zookeeper 全部内存数据内容,并将其写入到磁盘当中。同样适用ZXID 作为文件名的后缀。没有采用“磁盘空间预分配”策略,因此数据快照一定程度上能反映当前zookeeper 内存中全量数据的大小。

过程

针对客户端每一次的事务操作,zookeeper 都会将他们记录到事务日志中,同时,zookeeper 也会将数据变更应用到内存数据库中。当zookeeper 进行snapCount 次操作之后,会将内存中的全部数据dump 到本地文件(数据快照)。

[数据快照过程]

zookeeper 为了避免所有节点同时进行数据快照,zookeeper 采用了“过半随机”的策略(logCount> snapCount/2 + random)。开始快照时,首先关闭当前日志文件,重新创建一个新的日志文件(切换事务日志文件)。从内存中获取全部数据和校验信息,序列化,写入磁盘文件。zookeeper 会根据当前已提交的最大ZXID 来生成数据快照文件名。

数据恢复