vlambda博客
学习文章列表

Raft(三). 向可理解性进军

必须是简单易懂的!



04



Designing for understandability





设计Raft的时候,我们有若干目标:为系统实现提供完整且坚实的基础,它必须极大程度上去减轻开发人员的负担;必须在任何情况下都保证安全性,在大部分运行状态下保证可用性;必须保证常见的操作都是高效的。不过我们最看重的目标还是——它必须是简单易懂的,这个目标极具挑战。我们必须保证大部分受众都能够无痛地充分理解raft协议。也就是说,读者可以轻易地对该算法形成一种符合直观的感觉,这样的话系统的开发人员在具体实现的时候才能轻易地对其进行拓展。


设计Raft的过程中,在有多种解决方案的时候,我们出于一切为可理解性让步的原则,主要考量以下几点:每个候选方案的可解释性究竟几何(比如说,它的状态空间有多复杂,它是否有一些不易觉察的假设)?读者想彻底搞懂这个方法和它的假设是否容易?


我们了解这种分析具有相当强的主观性,不过我们使用了两种通用性的技巧来进行设计。第一个技巧是对问题进行分解:我们尽可能把一个大问题分解成若干小问题,每个小问题彼此独立且简洁易懂,都可以被逐个击破。比如说,在Raft里我们将一个大问题拆解成若干个小问题,其中有leader选举、日志备份、安全性以及成员变更。


第二个技巧是尽可能地简化状态空间,方法是减少所需要考虑的状态、使系统更加紧凑、不使用非确定性方法。特别要指出的是,log不允许有空洞,并且Raft限制log不一致的情况。另外,尽管我们极尽所能地去剔除非确定性因素,有些时候非确定性算法反而能够增强可理解性。特别地,通过引入随机化方法,算法的状态空间被极大的削减了(例如在leader选举的时候,每一个可能的leader都会导致不同的状态,这个时候随机选一个leader,则会使整个算法具有一种对称的简洁性)。我们使用随机化的方式来简化Raft里的leader选举算法。