raft协议初识
raft协议初识
什么是Raft协议?
- 对于分布式系统而言,与单机系统相比优势之一就是有更好的容错性。比如当一台机器上的磁盘损坏,数据丢失,可以从另一台机器上的磁盘恢复(分布式系统会对数据做备份),集群中某些机器宕机,整个集群还可以对外提供服务。实现的方法很自然的想到的就是备份。
- 一个系统的工作模式:接受客户端的command,系统进行处理,将处理的结果返回给客户端。由此可见,系统里的数据可能会因为command而变化。
- 实现备份的做法之一就是复制状态机(Repilcated State Machine,RSM),它有- 一个很重要的性质——确定性(deterministic):如果两个相同的、确定性的状态从同一状态开始,并且以相同的顺序获得相同的输入,那么这两个状态机将会生成相同的输出,并且结束在相同的状态.
也就是说,如果我们能按顺序将command作用于状态机,它就可以产生相同的状态和相同的输出。
那么,状态机该如何实现?见下图(来自raft协议)
上图中,每个RSM都有一个replicated log,存储的是来自客户端的commands。每个RSM中replicate log中commads的顺序都是相同的,状态机按顺序处理replicate log中的command,并将处理的结果返回给客户端。由于状态机具有确定性,因此每个状态机的输出和状态都是相同的。
Consensus Module模块的作用是:保证每个server上Log的一致性! 如果不做任何保障,直接将commad暴力写入,一旦服务器宕机或者出现什么其他故障,就会导致这个Log丢失,并且无法恢复。而出现故障的可能性是很高的,这就导致系统不可用。
因此,raft就是Consensus Module的一个实现,是用来保障servers上副本一致性的一种算法,它是一个为真实世界应用建立的协议,主要注重协议的落地性和可理解性。
Consensus一致性
再了解raft协议之前,首先了解一下一致性这个概念。Consensus一致性是指多个服务器在状态达成一致,但是在一个分布式系统中,因为各种意外可能,有的服务器可能会崩溃或变得不可靠,它就不能和其他服务器达成一致状态。这样就需要一种Consensus协议,一致性协议是为了确保容错性,也就是即使系统中有一两个服务器当机,也不会影响其处理过程。
Raft为了实现Consensus一致性这个目标,过程如同选举一样,参选者需要说服大多数选民(服务器)投票给他,一旦选定后就跟随其操作。在Raft中,任何时候一个服务器可以扮演下面角色之一:
- Leader: 处理所有客户端交互,日志复制等,一般一次只有一个Leader.
- Follower: 类似选民,完全被动
- Candidate候选人: 类似Proposer律师,可以被选为一个新的领导人
通常情况下(无主备切换时),一个leader, 其他是follower。Follower处于被动的状态,它不能发起任何请求,只能回应leader和candidate的请求。Leader处理客户端的请求,如果客户端请求发到了follower,follower负责将请求重定向到leader。candidate作用是:选主过程中用于选出新主。
Term
Raft将时间划分为Term。Term可以是任意长度的时间段。Term有一个连续递增的id。每个term以选主开始,选主过程中,若干candidate尝试成为leader。选主过程成功之后进到normal operation的阶段,leader开始提供服务。选主可能因为选票分裂而失败,此时在当前term没有leader,在下一个term继续选主。
从上图可以看到,任期是递增的,这就充当了逻辑时钟的作用;另外,term 3展示了一种情况,就是说没有选举出leader就结束了,然后会发起新的选举,后面会解释这种split vote的情况。
选举过程
…
参考
未完待续。