zookeeper

Leader选举的通用模式

2019-01-06  本文已影响42人  十毛tenmao

分布式系统或组件一般都包含Leader选举的过程,比如ZooKeeper的Leader节点选举,Redis Sentinel的领头节点选举,Redis Cluster中主节点的选举等。

术语

节点状态:所有节点具有3种状态:Leader, Follower, Candidate

自定义术语

Leader选举根据是否按照节点状态/数据选举,分成等价选举择优选举


Leader通用算法

对比多个分布式组件,发现他们都存在一个通用的算法模式(本质上是Raft算法):


Leader选举通用算法框架

进入选举状态

当系统进入选举状态时,节点本身的状态是Candidate。

投票

不同的组件的选举算法中,最大的差别就体现在投票这个环节

投票规则
先到先得:这个是最简单的规则,适合等价选举。比如Redis Sentinel, Redis Cluster。
ZooKeeper:对比事务ID和服务器ID的组合(zxid, sid),选择值最大的组合。简单地说,通常哪台服务器上的数据越新,那么越有可能成为Leader,也就能够保证数据的恢复。

注意:虽然Redis Cluster中从节点是有数据的,但是选择主节点并不考虑从节点的数据,所以这里是Redis Cluster数据不一致的原因之一。

选票统计

有的算法会让各个节点随机等待一段时间后再进入投票阶段,比如Redis Sentinel选举领头的算法

修改服务器状态

Leader选举完成后,各个节点会更新自己的状态,Leader选举完成。

注意点:ZooKeeper Leader选举算法会在Leader选举后还会等待一小段时间(默认200ms),以防会有更优的Leader产生


等价选举vs择优选举

两者在投票过程中存在部分差异

投票PK

投票方式


常见疑问

这个问题不存在,因为Leader选举完成,并不是形成多数节点选举结果就结束。还需要最后各个节点之间完成确认和状态切换,比如准Leader必须跟大多数节点建立心跳,而且这些节点也要进入Follower状态。

改进点

欢迎讨论,本人承诺非假日期间两小时内回复

参考

上一篇 下一篇

猜你喜欢

热点阅读