编程语言
首页 > 编程语言> > zookeeper源码解析--观察者

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:

标签:zxid,--,zookeeper,Leader,epoch,源码,设置,类型,节点
来源: https://blog.csdn.net/x13262608581/article/details/122483450