Leader选举的通用模式

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

术语

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

自定义术语

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

  • 等价选举:Candidate完全等价,没有优劣之分。比如Redis Sentinel
  • 择优选举:Candidate根据不同的状态,存在不同优先级。比如ZooKeeper

Leader通用算法

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


Leader选举通用算法框架

进入选举状态

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

  • Follower: Follower节点如果与Leader断开超过设定值则会进入Candidate;
  • Leader: 如果没有超过半数的Follower与Leader保持连接,Leader也会进入Candidate;
  • 新节点:自动进入Candidate。

投票

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

  • 投票周期加1
  • Candidate选举自己,并要求所有其他节点都选举自己
  • 选举节点首先对比选举周期(logical clock/term/epoch),首先拒绝选举周期比较小的Candidate。在最大的选举周期中再按照规则选择(这里的玄机就比较多了,后面有投票规则的简单列举)

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

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

选票统计

  • 如果某一个Candidate得票超过半数,则选举为Leader。
  • 如果没有则再次进入投票阶段

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

修改服务器状态

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

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


等价选举vs择优选举

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

投票PK

  • 等价选举,一般按照先来先得,而且在同一个投票周期内不再修改;择优选举,会进行选票PK,最终得到规则下优先级最高的选票。
  • 在一轮周期内选举失败,等价选举中各个节点会等待一个随机时间,减少选举冲突,提高选举成功率;择优选举不需要等待随机时间。

投票方式

  • 等价选举:一般使用的是询问式,Candidate直接向其他节点索要选票,根据最后拿到的选票判断是否被选举为Leader。

  • 择优选举:使用广播选票的方式,Candidate选择自己,并向所有其他节点广播自己的投票。 如果收到Candidate广播过来的选票,节点需要PK后,择优选择,如果发生变更则广播新的投票。因为可能存在同一个目标节点对多个投票请求都回复“同意”。


常见疑问

  • 为什么需要引入选举周期(logical clock/term/epoch)?
    等价选举:先到先得选举,在一轮投票汇中可能不会产生多数派结果,所以需要重新进入一轮新的选举,也就是选举周期。
    择优选举:这一点我也有疑问,因为择优选举中,各个节点可以一直PK,直到Leader选举成功,这是可以收敛的。所以我认为也可以不引入选举周期。(搜索了很多资料、书籍、百度、谷歌、谷歌英文等都没有找到引入选举周期的答案,也有人跟我有相同的疑惑http://zookeeper-user.578899.n2.nabble.com/FastLeaderElection-td2616674.html
    PS:如果您有好的解释,还请指教,不胜感激!

  • 如何在网络较差的情况下,所有节点对选举结果达成一致?是否存在可能,一个节点确认了多数投票结果,但是其它节点还没有确认?

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

改进点

  • 设置只有部分节点才可以成为Leader(比如ZooKeeper中的observer节点就不可以)

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

参考

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,864评论 6 494
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,175评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,401评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,170评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,276评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,364评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,401评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,179评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,604评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,902评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,070评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,751评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,380评论 3 319
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,077评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,312评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,924评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,957评论 2 351

推荐阅读更多精彩内容