概述
观察者不参与选举,观察者身份是在集群配置文件中指定的自身角色。
主干逻辑–observerleader
1.设置自身Zab状态为disCOVERY
2.寻找主节点
集群配置里,配置了观察者监听端口下。
集群每个投票成员,有义务在此监听端口开启监听。
供观察者与其连接,并作为主节点,与观察者进行交互。
3.与主节点建立连接。
4.向主节点注册。
注册包:
类型--OBSERVERINFO
zxid-高32位为epoch,低32为为计数。默认acceptedEpoch,计数为0。
LearnerInfo:
自己在集群的id
版本:0x10000
集群配置版本
5.读取主节点回复
情况1:类型为leaderINFO回复包:
类型:leaderINFO
zxid-得到回复zxid中epoch。
版本:
采用回复中epoch作为自己的acceptedEpoch。
向主节点发回回复包。
回复包类型:leader.ACKEPOCH,
zxid:lastLoggedZxid【自身数据实体的最后zxid】
epoch:epochBytes【自身currentEpoch信息】
返回zxid,由主节点回复中的epoch&序号0组合而成。
情况2:类型为NEWleader
采用回复中epoch作为自己的acceptedEpoch。
返回回复包中zxid
6.设置Zab状态为SYNCHRONIZATION
7.与主节点同步。
读取包
情况1:读取包的类型为DIFF
设置同步模式为DIFF
视情况设置快照是否需要标志
情况2:读取包的类型为SNAP
设置同步模式为SNAP
从输入流进行反向序列化从而完成快照同步
实体数据的集群配置信息设置为自己可见版本
设置数据实体的最后zxid【最后zxid来自包】
设置同步快照标志为true
情况3:读取包的类型为Trunc
设置同步模式为Trunc
对数据实体按数据包的zxid进行日志截断
设置数据实体的最后zxid【最后zxid来自包】
情况4:
记录日志
退出
以自身可见集群配置信息设置数据实体配置信息
创建会话追踪
循环迭代:
读取包
情况1:包的类型为leader.PROPOSAL
情况2:包的类型为leader.COMMIT
情况3:包的类型为leader.INFORM
情况4:包的类型为leader.UPTODATE
情况5:包的类型为leader.NEWleader
情况4:
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。