事务日志
类型
命名
- log.XX(十六进制的数字-高32位代表epoch、低32位代表操作序号)
内容
01:07:41 session 0x144699552020000 cxid 0x0 zxid 0x300000002 createSession 30000
01:08:40 session 0x144699552020000 cxid 0x2 zxid 0x300000003 create
/test_log,#7631,v{s{31 ,s{/w orld,'anyone}}},F,2
FileTxnLog
Snapshot数据快照
概念
命名
FileSnap类
数据的初始化
FileTxnSnapLog类
-
流程
- 1.事物日志操作类--FileTxnSnapLog和快照管理类--FileSnap的初始化
- 2.初始化一些节点,例如/zookeeper、/zookeeper/quota.,创建PlayBackListener监听器,用于数据修正时候的回调
- 3.先读取100个快照文件,按照zxid的顺序从大开始读取,校验checkNum校验完整性,如果校验失败则放弃这个快照文件继续读取下一个。如果100个都检验失败了则直接启动失败
- 4.当全量数据恢复完成后,这个时候有DataTree实例和sessionsWithTimeOuts集合了,能够从快照中得到当前的zxid,再找到比该zxid大的事务日志(也就是还未存入快照的事务)。每一条事务日志恢复后同通过PlayBackListener回调生成proposal提议同步到follower
- 5.事务日志恢复完成后,得到最大的zxid并解析出epoch,同时在磁盘的currentEpoch和acceptedEpoch文件读取上次记录的epoch进行校验,至此数据初始化流程完成
数据同步
开始阶段
- 当zookeeper初始化完成后,集群选举后,Learner服务器会向Leader完成注册以后,就会触发数据同步环节
概念
- leader将没有在learner服务器上同步过的数据同步给learner服务器
流程
-
获得learn状态
- 1.learner服务器初始化完成后,learner服务器发送ACKEPOCH数据包给leader服务器,leader服务器从中获得learner服务器的currentEpoch和lastZxid
-
数据同步初始化
-
数据化同步
-
流程
- 首先leader节点会优先使用全量同步的方式进行数据同步,然后根据leader与learner之间的差异决定同步方式
-
同步方式
-
直接差异化同步(DIFF 同步)
-
场景(触发条件)
- peerlastZxid介于minCommittedLog和maxCommittedLog之间
- leader再第一阶段提交的proposal还没有commit给follower,然后该leader就挂了,然后某个接收到这个proposal的节点选举为master,然后重新数据初始化,再进行数据同步时,其他节点的lastZxid则会触发DIFF同步,因为他们只是将上个leader的proposal写入了日志文件但是没有接受到commit指令同步到内存
-
同步流程
-
leader首先发送一个DIFF指令,通知learner进入数据差异化同步阶段,即将推送proposal给learner
- 实际推送是推送两个包,proposal内容数据包和commit指令数据包
-
数据包推送完成后,leader会将learner放入forwardingFollowers或observingLearners队列,并发送一个newleader指令通知learner数据已同步
-
learner接收到newleader指令之后发送ack消息表示接收到了同步的数据包
-
leader接收到ack包之后进入“过半”策略的等待,即接收到过半的leader发送的ack包,此时再发送uptodata数据包给所有已完成数据同步的learner
-
learner接收到uptodata指令之后会结束数据同步流程并再次发送ack包给leader
-
先回滚再差异化同步(TRUNC+DIFF 同步)
-
场景
- 是Leader服务器在已经将事务记录到了本地事务日志中,但是没有成功发起Proposal流程的时候就挂了
-
同步流程
-
仅回滚同步(TRUNC 同步)
-
场景
- peerLastZxid>maxCommittedLog
-
同步流程
- leader服务器要求learner同步回滚到maxCommitteLog
-
全量同步(SNAP同步)
-
场景
-
同步流程
- leader先向learner发送SNAP全量同步指令
- Leader会从内存数据库中获取到全量的数据节点和会话超时时间记录器,将它们序列化后传输给Learner