TiDB 5.0 跨中心部署能力初探 | Joint Consensus 助力 TiDB 5.0 无畏调度
TiDB 5.0 已于上周正式发布,在这个大版本更新中提升 TiDB 集群的跨中心部署能力是一个重要的着力点,在共识算法这一层,最激动人心莫过于 Joint Consensus 支持了。这个特性帮助 TiDB 5.0 在跨 AZ 的调度中完全容忍少数派数目的 AZ 不可用。本文会先谈成员变更在 TiDB 历史,然后介绍新特性的设计,最后说下我们在实现过程中遇到的问题和解决方案。
成员变更
Joint Consensus
其实 Raft 论文里早已提供了 100% 可用的成员变更算法:Joint Consensus。我们用 C(a, b, c) 表示一个分别拥有 a、b、c 三个副本的 Raft group。当要从 C(a, b, c) 变更成 C(a, b, d),引入一个中间状态 joint C(a, b, c) & C(a, b, d)。当 group 处于 joint 状态时,日志只有在两个成员列表里都复制到 quorum 才能算 commit。要进行变更时,先从 C(a, b, c) 变更成 C(a, b, c) & C(a, b, d)。每个节点收到这个命令时,立刻将本地成员变更成 joint 状态。当这个命令被 commit 以后,再提交一个新的命令退出 joint 状态,从 C(a, b, c) & C(a, b, d) 变成 C(a, b, d)。关于这个算法的正确性证明已经超出了本文的范畴,感兴趣的可以参阅 Raft 论文。
由于 quorum 是基于两个 3 副本的成员列表来计算的,中间 joint 状态和上文提到的多次单步变更一样,可以容忍任意单节点宕机。和多次单步操作相比,joint 还能实现 100% 可用。例如图中 4 副本状态,AZ 2 不可用会导致 2 个节点不可用,但是对于两个 3 副本成员列表来说都只是单节点不可用,所以 joint 状态下还是可以保持可用。
落地
上文我们提到,Etcd 的 Raft 算法实现和 Diego Ongaro 在论文里提到单步变更的不一样。其实 Etcd 算法实现在博士论文之前就开始做了,主要区别在于成员变更日志只有被 commit 以后才会被真正执行。而论文里的做法是收到就立刻执行。我们从 3.0 便开始调研 joint consensus 的可行性。我们最开始的做法是与论文完全保持一致,但是带来的兼容性问题和调整实在太多了。与此同时,CockroachDB 也开始给 Etcd 添加了早期的 Joint Consensus 支持。我们最终决定拥抱社区,和 Etcd 保持一致,一起进行优化和测试。
Etcd 的 Joint Consensus 实现并不完全和论文一致,而是继续延续了上面提到的做法,commit 才执行。这样的好处是成员变更日志和普通日志处理逻辑没有区别,可以使用统一的流程。由于 commit 以后的日志不会被复写,所以也不需要像收到即执行那样做特殊的变更回退,实现起来更简单。但是由于 commit 信息只有 leader 才有,所以特殊场景下由于信息同步不及时会出现可用性的 bug。感兴趣的同学可以去 Etcd 项目查看我们提交的相关 issue [1] [2]。这里只举一个其中简单的例子。假设某个 joint 状态 C(a, b, c) & C(a, b, d),a 是 leader。如果退出 joint 的命令被复制到 a、b、c 以后,a 可以认为命令已经被 commit,并将 commit index 同步给 c 以后就 crash 了。所以 c 会执行 commit log,认为 joint 已经退出,从而把自己删除;b、d 并不知道 joint 退出命令已经被 commit,当发起选举时会依然会寻求两个 quorum 的投票。但是 a 已经 crash、c 已经自毁了,所以 b、d 无法从 (a, b, c) 中获得 quorum 投票,从而不可用。
这些问题最终导致和原始论文比,commit 才执行的 Joint Consensus 实现添加了两个限制:
1. Voter 被移除之前需要先降级成 Learner。
2. 选举时加入同步 commit index 机制。
再来看上文举的例子,由于 voter 不会被直接删除,所以 c 不会把自己删除,而是成为一个 learner。当 b 向 c 寻求投票时,会获知最新的 commit index,得知 joint 状态已经退出,从而只会尝试从 C(a, b, d) 中寻找 quorum,最终成功选举。
总结
在 5.0 我们添加了 Joint Consensus 支持,实现了跨 AZ 调度过程中能完全容忍少数派数目的 AZ 不可用。Raft 算法本身比较清晰简单,但是落地在工程上会有不同的调整和取舍。如果你对于解决分布式系统中类似的问题非常感兴趣,欢迎参与我们的项目 TiKV、raft-rs,或简历发送至 jay@pingcap.com 直接加入我们。
荣誉体验官,TiDB 5.0 在等你
随着 TiDB 5.0 版本的发布,PingCAP 将继续在分布式云原生数据库的赛道上前进,迈向企业级核心场景,以开源之力引领变革,探索分布式云的未来。
PingCAP 面向现有的 TiDB 核心用户群体,开放少量优先试用名额,您将有机会抢先体验 5.0 新功能,发现属于您的惊喜。与此同时,希望您反馈和分享实际场景下的试用体验,参与 TiDB 5.0 荣誉体验官的评选,还有多项激励等你来拿!扫描下方二维码立即预约,将有专属技术顾问提供全程支持。

了解更多详情:荣誉体验官,TiDB 5.0 在等你!
关注公众号:拾黑(shiheibook)了解更多
[广告]赞助链接:
四季很好,只要有你,文娱排行榜:https://www.yaopaiming.com/
让资讯触达的更精准有趣:https://www.0xu.cn/

随时掌握互联网精彩
- 1 习近平同法国总统马克龙通电话 7904621
- 2 算承认恋情吗 赵丽颖三个字回应 7808757
- 3 51岁曹颖自曝患胃癌 7713216
- 4 美国“芯”机算尽 难阻中国 7616943
- 5 武大回应校门被淹1米深:每年都这样 7522744
- 6 小米汽车首款SUV小米YU7发布 7426423
- 7 国乒男双全部出局 王皓黑脸 7333077
- 8 曹颖胃癌手术8天后就直播带货 7233633
- 9 小米YU7隐藏式门把手靠近自动内翻 7136170
- 10 孙颖莎三次防住对方男选手倒地爆冲 7043220