几个问题,引发思考:
2 个小问题:
ZK 集群中,服务器节点,有 3 中角色:
3.3.0+
版本开始引入,提升 ZK 集群的非事务处理能力,主要职责:特别说明:Observer 跟 Follower 的唯一区别:
疑问:节点成为 Follower 还是 Observer 是 配置文件中设定的?
2 个小问题:
下面任何一种情况,都会触发 Leader 选举:
服务器的状态流转:
Leader 选举过程,本质就是广播优先级消息
的过程,选出数据最新的服务节点,选出优先级最高的服务节点,基本步骤:
(sid,zxid)
(sid,zxid)
,并广播变更后的结果法定数量
(quorum),则,升级为 Leader,并广播结果。疑问:法定数量
(quorum),一般设置为集群规模大小的半数以上,quorum 在哪配置的?
特别说明:
(sid,zxid)
zxid
(事务 ID),其次比较sid
(服务器ID)sid
(服务器 ID) 是节点配置文件中设定的zxid
是什么时候设定的?是在 Leader 执行事务过程中,向当前服务器同步的?如何活的当前服务器上的 zxid
?具体选举过程:
补充说明:
200 ms
Push 方式
广播消息,称为 快速 Leader 选举
,因为之前的 Leader 选举,采用 Pull 方式
,每隔 1s
拉取一次。疑问:
服务器节点,等待
200ms
的起始时间点是什么?是收到一轮新投票消息,开始计时? RE:
事件触发
,广播出去的;法定数量
(quorum),则,仍然等待 200ms
,确认是否有更优的投票。真正的投票信息:
属性 | 说明 |
---|---|
id | 被推举 Leader 的 sid |
zxid | 被推举 Leader 的事务ID |
electionEpoch | 投票的轮数,约束:同一轮投票,计数有效 |
peerEpoch | 被推举 Leader 的 epoch |
state | 当前服务器的状态 |
一次 Leader 选举过程,属于同一个 electionEpoch
,结束时,会选出新的 Leader;服务器节点,在比较 (sid,zxid)
之前,会先比较选举轮次 electionEpoch
,只有同一轮次的 Leader 投票信息才是有效的:
(sid,zxid)
疑问:Leader 负责执行所有的事务操作,一次事务操作,
Leader 上执行的事务状态,通过 Zab
状态更新的广播协议,更新到 Follower 和 Observer。
脑裂(split brain):服务器集群的 2 个子集,能够同时独立选举 Leader,并正常运行,形成 2 个集群。
解决办法:Leader 选举的法定数量
(quorum),超过正常集群的半数。
Leader 选举的必要条件:节点数量 > 法定数量
。
来源 | https://urlify.cn/yqqmum