内容提要
本文探讨了共识算法中处理竞争条件的方法,特别是领导权的撤销与建立。介绍了基于锁和无锁的两种解决方案。基于锁的方法确保只有一个选举者能进行系统更改,但可能导致进展问题;无锁的方法支持前进进展,但缺乏稳定的领导者。对于大规模系统,推荐使用基于锁的方案以简化操作。
延伸解读
选举者角色的引入
文章引入“选举者”概念,将领导权变更的执行者与候选人分离。在YouTube等大规模系统中,每个分片有多个合格主节点,让所有节点主动故障检测和切换不现实,因此由每个区域的选举者负责。选举者可以独立于候选人,候选人不必自我选举。这种分离在Vitess中体现为VTorc组件。理解这一角色有助于设计更灵活的共识系统,避免候选人直接竞争带来的复杂性。
基于锁的方法的权衡
基于锁的方法确保只有一个选举者能进行变更,但可能因选举者崩溃或网络分区导致进展停滞。为此必须引入超时机制,锁在一定时间后自动释放。锁方法通常收敛更快,因为第一个尝试变更的节点往往进展最多。获取锁需要多个节点参与,这保证了部分节点故障时的进展。Raft实际上隐式实现了锁,而Vitess使用etcd等外部系统获取锁,因为领导权变更频率低,每天或每周一次。
无锁方法的利弊
无锁方法让最新选举者胜出,通过时间戳排序(如Paxos的提案编号、Raft的任期号)。跟随者记住请求的时间戳,拒绝更旧的请求。无锁方法自然支持前进进展,无需依赖超时。但缺点是没有稳定的领导者,领导权可能在发现后和发送请求之间结束,导致一致读必须使用法定人数读,这对扩展系统是主要缺点。
大规模系统的选择建议
文章推荐大规模共识系统采用基于锁的方法。虽然无锁方法看似优雅,但缺乏稳定领导者会使一致读复杂化,需要法定人数读,不利于扩展。基于锁的方法提供稳定领导者,简化操作。在Vitess中,当前领导者通过拓扑发布,许多工作流依赖此信息。任何不希望领导者变更的操作只需先获取锁。因此,权衡之下,基于锁的方案更适合大规模系统。
Q&A
什么是共识算法中的竞争条件?
竞争条件是指在多个代理进行领导权变更时,可能出现的冲突情况。
基于锁的方法和无锁的方法有什么区别?
基于锁的方法确保只有一个选举者能进行系统更改,但可能导致进展问题;无锁的方法支持前进进展,但缺乏稳定的领导者。
在大规模系统中,推荐使用哪种方法处理领导权变更?
推荐使用基于锁的方法以简化操作。
锁的获取在领导权变更中有什么重要性?
获取锁可以确保在持有锁期间,只有一个选举者能够对系统进行更改,从而避免冲突。
无锁方法的主要优缺点是什么?
无锁方法的优点是支持前进进展,缺点是缺乏稳定的领导者,导致一致性读取变得复杂。
如何确保在基于锁的系统中实现前进进展?
基于锁的系统需要引入时间组件,确保持有锁的选举者在一定时间内完成任务,否则锁会自动释放。