Raft的诞生
在分布式领域,始终都要面临的一个挑战就是:数据一致性
。它是指数据在各个机器节点上流转的时候,如何保证任一时刻数据都是正确并且最新的。为此,莱斯利·兰伯特(Leslie Lamport)在1990年提出了一种实现算法,也就是著名的Paxos。如今它是业界公认此类问题的最有效解。虽然Paxos在理论界得到了高度认可,但是却给工程界带来了难题。因为这个算法本身比较晦涩,并且抽象,缺少很多实现细节。这让许多工程师大为头疼。天无绝人之路。几十年后,希望的曙光出现了。来自斯坦福大学的两位仁兄 Diego Ongaro 和 John Ousterhout 在“In Search of an Understandable Consensus Algorithm (Extended Version)”一文中正式引入 Raft。并在论文开篇就表明Raft是为解决Paxos难以理解和实现的问题而提出的。从此,Raft一炮走红。
初识Raft
Raft 算法的工作流程主要包含五个部分:
- 领导选举(Leader election):在集群初始化或者旧领导异常情况下,选举出一个新的领导。
- 日志复制(Log replication): 当有新的日志写入时,领导能把它复制到集群中大多数节点上。
- 集群成员变更(Cluster Membership changes): 当集群有扩容或者缩容的需求,集群各节点能准确感知哪些节点新加入或者被去除。
- 日志压缩(Log compaction): 当写入的日志文件越来越大,重启时节点回放(replay)日志的时间将无限延长,并且新节点加入集群时传送日志文件也会无限拉大。需要定期对日志文件进行重整压缩。
- 读写一致性(Read/write consistency): 客户端作为集群的外部组件,当一个客户端写入新数据时,能保证后续所有客户端都能读到最新的值。
从上面可以看出,Raft 算法涵盖的内容很多。如果一条条逐个讲解,对于一个初学者来说,无异于“一口吃下一个胖子”,这显然不切实际,也会让人淹没在细节的海洋中,失去对算法的全局认识。所以本文采用“突出主要问题,忽略其次细节”的方法先让大家对其最核心的部分,领导选举和日志复制有一个深入理解。
Raft为什么是正确的
理解一个算法,最重要的是要知道如此设计的正确性。学习算法的思想,才能真正理解,继而分享和交流。上来就讲实现细节,很难产生共鸣。
那怎么论证Raft的正确性呢?要科学地论证一件事,一般有两种方法。
- 使用精巧的数学方程推导。这是最严谨的方式。
- 使用归纳假设推理。通过一步步逻辑推理最终归纳出结论。