raft协议

链接

youtube:Designing for Understandability: The Raft Consensus Algorithm
raft协议_第1张图片

共识问题

在一堆机器中,达成关于某个值的共识。在2PC中,只需要达成true/false的值,所以2PC可以认为是简化的共识问题。

Raft的几个问题

Raft是为了简化Paxos而诞生的,Paxos过于抽象,并且对于实际问题过于简陋。

Raft要解决的基本问题包括:

  • 选主
    • 选择一个机器作为Leader
    • 检测Crash,在Crash之后选择新的Leader
  • Log复制
    • Leader从Client收到命令,将其append到Log中
    • Leader将其Log复制到从节点中
  • 保持Log主从一致性
    • 只有与主节点一致的从节点,才有可能成为新的Leader

Raft将共识问题抽象为分布式系统中多个状态机的状态同步:每个状态机内部有两个模块

  • log
  • 状态机

log是一个有序的命令存储文件。当一个Leader节点收到命令时:

  1. 首先将命令同步到其他节点上
  2. 将命令转交给状态机执行:如果大多数节点已经同步了这条命令,则认为命令已经写入成功,然后将命令提交给状态机执行
  3. 执行之后,返回命令结果
    raft协议_第2张图片

选主

Term

Term类似于Kafka中Epoch的概念,即时间轴。始情况下,所有机器的Term=0。当Timeout之后,机器需要选主,于是将自己的Term增加1:Term++, 然后发送选主请求给所有的其他机器。
raft协议_第3张图片
在每个Term期间,至多有一个Leader。每次RPC时,两个机器都会交换自身的Term,具有较老的Term自动从Leader转为Follower。(如果其他机器向一个Leader发起RPC,但Leader已经变成Follower,会返回重定向错误)。

当一个机器收到Vote请求时,如果对方具有最新的Term,则返回Yes,并保存这个Term的投票选择;在同一个Term期间再次收到其他Vote请求时,仍然返回之前保存的投票结果。

收到集群中大多数投票的机器成为新的Leader,大多数即多于一半,因此集群不可能再产生第二种结果,所以大多数投票(Total/2+1)结果是唯一确定的。

触发选主的时机:随机化

为了使得集群最终能够选出一个Leader,而不是几乎所有的机器都在某个固定时间发起投票,Raft选择随机的超时时间,这很重要。超时的范围是:[T,2T],比如150ms~300ms。在这种情况下,通常一个机器会先于其他机器获得选举。

commit

当Leader收到client的命令时,它将命令写入Log中(持久化到磁盘上),并且向所有的Follower同步这个命令(AppendEntries)。当收到大多数(majority)Follower的响应后,就认为这条命令提交成功了,因此可以执行这条指令。

log同步

为了简化Log的同步,raft协议假定:1. Leader的Log永远是正确的,所以当Log不一致时,其他Follower要做的事情就是同步Leader的Log; 2.当一条Log已经提交时,它之前的所有Log也被认为已经提交了。

每条Log都都包含(term,index)两个信息,AppendEntries中携带当前Log以及之前Log的(term,index)。当follower收到AppendEntry指令时,使用index最小的log与自己的log历史匹配。如果找不到匹配的,则返回失败;Leader重试,在AppendEntries中再附加更小的Log,直到匹配。
匹配发生之后,Follower根据匹配的位置,将后面的Log截断丢弃,然后添加Leader的Log,与Leader保持完全的一致。
raft协议_第4张图片

Leader的完整性

为什么要假定Leader的Log一定是正确的呢?这是因为选主的机制决定了,具有不完成Log的Follower不能被选举成为Leader。通过总是选取(lastTerm,lastIndex)最大的那个,丢弃哪些具有较小term,较小index的节点,因为它们的Log是不完整的。
raft协议_第5张图片
在上图中,s5 0票,因为其Term是最小的;s2获得s5,因为其Term大于s5; s4和s1都获得s2和s5; s3获得所有的票数。

Raft协议特点

  • 随机化超时选主
  • 每个Term内至多有一个Leader
  • 使用大多数共识原则
  • 每条log由(Term,Index)构成
  • log渐进式同步(先尝试(term,index), (term’,index-1)两条消息,如果前一条消息不匹配,则继续附加,直到发生匹配)
  • 只有log同步到大多数节点之后,才会执行状态机的变化。

redis cluster选主使用RAFT协议

来源:https://redis.io/topics/cluster-spec
redis cluster使用异步复制,当前master失败后,重新选取的master的数据集会成为权威数据集。
在这里插入图片描述

你可能感兴趣的:(分布式,分布式)