Raft 配置变更 Configuration changes 拾遗

背景

仔细思考了 Raft 关于配置变更的内容,发现论文中的搞法用代码根本无法实现.......然后开始了 search 的阶段,翻到知乎一篇文章和作者的博士论文,感觉用这个可以实现配置变更。

在这里稍微记录一下。

新的发现

知乎作者 孙建良 的一篇 《Raft 一致性协议》 专栏里,提到了 Raft 作者的长达 240 页的博士论文里,关于配置变更的详细实现。

首先,要解决的问题:分布式集群机器的增减。

新的发现是什么呢?

答:每次只向集群添加一个节点。

Raft phd 34 页:

首先解释一下这幅图:蓝色方框里显示 old 配置的大多数,红色方框里显示 new 配置的大多数。我们以 b 为例,b 中,向原本 3 个节点的集群添加一个节点变成 4 个节点(暂时不考虑 2n + 1 问题),那么,如果 leader 崩溃,无论是新的配置,还是旧的配置,肯定存在节点交集。在 b 中,old 配置想赢得选举,必须有 2 个节点支持,new 配置要想赢的选举,必须有 3 个节点支持(新配置是 4 个节点),那么他们必然就有一个相交的节点。

这将带来什么影响?

任何一方想赢得选举,都必须争取这个节点的选票。换句话说,同一时刻,有且只有一个 leader 产生。无论是新的,还是旧的。这样就解决了之前那篇文章提到的“出现 2 个 leader 的问题”。

然后我们再假设一下:

我们有一个集群,现在有 3 个节点,然后我们添加一个节点,并更新了 leader 的配置为 4 节点,然后把复制到其他 2 个节点,这时,leader 出现了崩溃,重新选举。

这个时候,会有 2 个结果:

  1. 新配置复制到了集群的大多数(大多数的值在这里必须大于 2 (包括 leaer 自身))。
    • 如果新配置复制到了大多数集群,那么新 leader 肯定使用的是新的配置。
  2. 新配置没有复制到集群的大多数。
    • 如果新配置没有复制到大多数集群,那么新 leader 肯定使用的是老的配置。

代码如何实现?

通过上面的分析,实现起来就比较简单了。

思路:

  1. 每次只增加一个节点,如果要增加 2 个节点,必须等上次那个节点添加成功,才能继续添加。否则会出现双 leader 的情况。
  2. 添加节点时,新节点使用的自然是新的配置。
  3. 添加的第一步,是否应该是将新节点的日志和 leader 进行同步?如果同步,那么新节点将有可能成为 leader,如果不同步,新节点只能是 follower。
  4. 第二步,leader 将新的配置把自身先更新,然后并行的发送到其他 follower。等待反馈,如果大部分节点复制成功,那么,leader ,新的配置就成功了。

意外:

如果 leader 复制的过程中出现了崩溃,那么就重新开始选举,此时,一共有 4 个节点,可以确定的是:leader + 新节点都是 new 配置,而,另外两个的配置不一定。关键就在于这两个节点的配置,如果有一个是新的配置,那么选举出来的,肯定是 new 配置的 leader。反之,肯定是 old 配置的 leader。

如果选举出来的是 new 配置节点,那么需要将这个集群的配置刷新,即在此将配置重新发送到所有 follower。

如果选举出来的是 old 配置节点,那么,old 集群 leader 也照样并行的刷新他所在的 3 个节点(包括自己)。 新的节点直接忽略。

在客户端,如果添加节点失败,则进行重试。

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

推荐阅读更多精彩内容