知识卡片
时钟误差驱动的变种选主协议:用硬件精度换协议简化,及其适用边界
内容
阿里团队基于Paxos设计了一个更简化的选主协议,最大的特点是完全不需要持久化任何数据——它引入”选主窗口”的概念,规定选主窗口只能在当前时间对固定周期T取余为0的时间点开启(如第0、T、2T……N*T时刻),这样集群内所有机器能几乎同时发起选主请求,选主分为预投票、投票、上任三个阶段,每个阶段依据”时钟误差最大值Tdiff”和”网络单程最长耗时Tst”推算出各消息应当被收到的时间区间,最终能推算出整个选主过程最坏情况下的耗时(Tdiff×6+Tst×3)以及无主时间的上界(Lease时间+选主耗时+选主窗口间隔)。这个方案相比标准Paxos和Raft更简单,但它把”不需要持久化数据”这个优势建立在了一个新的、更强的假设之上——所有参与选举的机器必须对”当前时间”有足够精确、误差可控的共识,一旦时钟误差过大,就可能出现投票分裂(无法选出Leader)甚至更危险的双主问题(虽然任何依赖Lease机制的选主协议本质上都或多或少依赖时钟,但这个方案对时钟精度的敏感度明显更高)。因此这类协议实际能落地的场景比较受限——案例中提到只适合类似BAT这类配备了原子钟和GPS校准时钟、能把时钟误差控制在极小范围内的基础设施环境,即使如此,实际上线支付宝时依然因为1秒的跳变问题而不得不放弃NTP的瞬时校准,改用缓慢渐进的方式校时。这个案例提示了协议选型时一条重要的判断原则:一个协议”更简单”往往不是免费的,往往是把某种复杂度转移到了一个新的强假设上(这里是对硬件级时钟精度的依赖),选型时必须评估自己的基础设施能不能真正稳定地满足这个强假设,否则”更简单”反而会带来更隐蔽、更难排查的故障模式。
参考来源
- 位置:《高可用架构(第1卷)》第2章《高可用架构原理与分布式实践》"2.10 架构师需要了解的Paxos原理、历程及实战"节,"2.10.5 依赖时钟误差的变种Paxos选主协议简单分析"(源文件:_epub-src/OEBPS/Text/Chapter2_10_6.xhtml)
- 结论依据:原文说明"相对于MultiPaxos和Raft协议,它的优势是不需要持久化任何数据……这个选主算法比Paxos和Raft更简单,但是对时钟误差有比较强的依赖,在时钟误差过大的情况下,会造成投票分裂无法选出主,甚至可能出现双主……可能仅仅适合BAT这种配备了原子钟和GPS校准时钟",直接支撑本卡片结论。
- 原始内容:这个选主算法比Paxos和Raft更简单,但是对时钟误差有比较强的依赖,在时钟误差过大的情况下,会造成投票分裂无法选出主,甚至可能出现双主……可能仅仅适合BAT这种配备了原子钟和GPS校准时钟,能够控制时钟误差……这个选主算法已经上线至支付宝,就当时而言,1秒的跳变已经太大。