前篇解析了 Gossip
协议,这篇主要看看 Raft
是如何实现的。
本文主要分为两个部分,首先是粗略讲解一遍 Raft
的设计思想,在这一部分不会将 RPC
的各种字段(因为没有意义,只会徒增心智负担),而在第二部分则是通过解析一份优质的 Raft
源码实现,在这个部分再深入到 RPC
各个字段。
如果看了一遍看不懂也没关系,建议多去看看 Raft
的论文,笔者也是反复看了两周才大致理解其指导思想。
Raft
一提到共识算法,相信大部分人都能马上想到 Paxos
,但是我认为它不是算法,它的论文里面顶多算是一个指导思想,很少有人能够读完它就实现出一个可靠的共识算法(关键是要验证其的正确性),但是 Raft
不一样,它的一些设计非常巧妙,能够令人非常好的理解其指导思想,同时比较容易的实现(因为 Raft
从诞生那一刻就是为了弥补 Paxos
的可理解性,看看人家的论文名字 In Search of an Understandable Consensus Algorithm
可理解的分布式共识算法)。
用过 Zookeeper
的可能知道其内部的协议就是根据 Paxos
的指导实现的一个 Zab
算法,之所以不用 Raft
是因为 Raft
那时候还没出世呢。