本文主要是介绍zookeeper源码解析--观察者,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
概述
观察者不参与选举,观察者身份是在集群配置文件中指定的自身角色。
主干逻辑–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:
这篇关于zookeeper源码解析--观察者的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!