继《从Paxos到ZooKeeper》第七章总结九-1:ZooKeeper技术内幕之数据
9.4 初始化
含义:
9.4.1 初始化流程
FileTxnSnapLog:
PlayBackListener:
9.5 数据同步
集群完成Leader选举之后,Learner会向Leader服务器进行注册,注册完成之后,就进入数据同步环节,即Leader服务器将那些没有在Learner服务器上提交过的事务请求同步给Learner服务器
流程:
9.5.1 获取Learner状态
9.5.2 数据同步初始化
从内存数据库中提取出事务请求对应的提议缓存队列:proposals,同时进行对以下三个ZXID值的初始化:
9.5.3 直接差异化同步
场景:peerLastZxid介于minCommittedLog和maxCommittedLog之间
过程:
例子:
Leader与Learner之间的数据通信:
9.5.4 先回滚再差异化同步(TRUNC+DIFF同步)
场景:Leader挂了
过程:
9.5.5 仅回滚同步(TRUNC同步)
场景:peerLastZxid大于maxCommittedLog
过程:Leader会要求Learner回滚到ZXID值为maxCommitedLog对应的事务操作
9.5.6 全量同步(SNAP同步)
场景:peerLastZxid小于minCommittedLog;Leader服务器上没有提议缓存队列,peerLastZxid不等于lastProcessedZxid(Leader服务器数据恢复后得到的最大ZXID);
这两种场景下Leader服务器都无法直接使用提议缓存队列和Learner进行数据同步,因此只能进行全量同步
过程:
总结:
Leader的LeaderZxid如果大于Learner的maxCommitedLogZxid,说明Learner可以执行Leader的所有操作,因为maxCommitedLog之前的已经执行过了,所以Learner回滚到maxCommitedLog这里,执行之后的操作即可,即仅回滚同步
Leader的LeaderZxid如果介于于Learner的maxCommitedLogZxid和minCommitedLogZxid,说明Learner可以执行Leader的zxid之后的操作,因为minCommitedLogZxid和LeaderZxid之间的的说明已经执行过了,所以执行maxCommitedLogZxid和LeaderZxid之间的即可,即直接差异化同步,可以改进为先回滚再差异化同步(即紧接着LeaderZxid依次执行)
Leader的LeaderZxid如果小于Learner的minCommitedLogZxid,说明Learner可以执行Leader的所有操作,因为minCommitedLogZxid之前的操作的说明都没有执行过,即LeaderZxid的操作,所以执行Leader的所有操作,即全量同步