Zookeeper入门之七-ZK的数据同步
ZK的数据存储、集群间通信及数据同步
zk中所有数据都是放在内存中的,当然也有snapshot、事务日志。
snapshot:
用于记录zk服务器上某一时刻的全量内存数据内容。snapshot.2c021384ce,后缀也是一个zxid,表示本次数据快照开始时刻的服务器最新zxid。没有预分配机制,所有内容都是有效的。
事务日志:
每次事务操作都会有一条记录保存在事务日志文件中,文件大小都是64M(包含填充,也就是预分配,主要为了提高事务日志的写入效率,不需要重新分配磁盘空间),日志后缀是一条zxid,也就是写入该事务文件的第一条事务记录的zxid
数据同步
数据的同步都是由leader发起,简单来说,learner启动时都会向leader建立连接,由leader分别对followe和observer进行数据同步,有全量同步、仅回滚同步、先回滚再差异化同步、直接差异化同步四种同步指令。
leader发送给learner的差异化数据同步指令(proposal),如果learner同意就会返回ack,如果leader收到ack,就会同时进入过半策略的等待阶段—leader会和其他learner服务器进行上述同样的数据同步流程,知道集群中有过半的learner机器响应了leader的这个ack消息。
一旦满足过半策略后,leader服务器就会向所有已经完成数据同步的learner机器发送一个uptodate指令,用来通知learner已经完成了数据同步,同时集群中已经有过半机器完成了数据同步,集群已经具备了对外服务的能力了。
learner在接收到这个uptodate指令后,会终止数据同步流程,然后向leader再反馈一个ack消息。
请求
如果集群中的follewer接收到来自客户端的写请求,follower会将消息通过REQUEST请求给到leader,统一交给leader来处理,leader处理结束之后,会再次广播数据。