前面讲到了分布式系统的基本原理(CAP,BASE)。那么分布式存储是如何在基本原理的指导下工作的呢?正如前面所提到的,存储系统的数据一致性是至关重要的,分布式存储也是如此。那么分布式存储是如何保证多个节点间数据的一致性的呢?这就是共识算法需要完成的任务了。
共识算法的作用就是使分布式存储的多个节点在满足一定条件下才能对存储数据的请求返回成功。因为是分布式的,它会面临着 CAP 中的 P 带来的问题,也就是一个集群里的节点间可能存在网络分区的可能。那么如何在节点间的通信不稳定的情况下还能使得数据保存是可信的呢?这个问题被莱斯利·兰波特具像化为拜占庭将军问题:https://zh.wikipedia.org/wiki/拜占庭将军问题
然后大名鼎鼎的 Paxos 协议就是为了解决这个问题,但是 PAXOS 的原始论文比较难懂。RAFT 是 PAXOS 简化协议中的一个。RAFT 协议是一种基于 Leader(可能是任意一个节点) 的共识算法,而 PAXOS 是无 Leader 的共识算法。
为了达到易于理解的目标,RAFT 做了很多努力,其中最主要是两件事情:
- 问题分解
问题分解是将 “复制集中节点一致性” 这个复杂的问题划分为数个可以被独立解释、理解、解决的子问题。在 RAFT,子问题包括 Leader 选举,日志(log,存储系统里的数据)复制,安全,成员变化。
- 状态简化
状态简化就是算法通过增加约束条件做出一些限制,减少需要考虑的状态数,使得算法更加清晰,更少的不确定性(比如,保证新选举出来的leader会包含所有commited log entry)。
Raft implements consensus by first electing a distinguished leader, then giving the leader complete responsibility for managing the replicated log. The leader accepts log entries from clients, replicates them on other servers, and tells servers when it is safe to apply log entries to their state machines. A leader can fail or become disconnected from the other servers, in which case a new leader is elected.
这段引文概括了raft协议的工作原理:RAFT会先选举出Leader,Leader负责复制日志。当Leader接受所有客户端更新请求,然后复制到其他的Follower节点,并在“安全”的时候执行这些请求。如果Leader故障,followers会重新选举出新的leader。
上面描述的过程中两个核心的子问题:Leader 选举和日志复制。整个系统中的节点有3个角色:Leader,Follower,Candidate。
下一篇中将详细介绍3个角色的职责,角色的转换等。
RAFT中的3个角色
,