分布式共识算法(故障容错算法)系列整理(四):Raft

五篇分布式共识系列文章合集:
分布式共识算法(拜占庭容错算法)的系列整理一:PBFT、PoW、PoS、DPos
分布式共识算法(故障容错算法)系列整理(二):Bully、Gossip、NWR
分布式共识算法(故障容错算法)系列整理(三):Paxos
分布式共识算法(故障容错算法)系列整理(四):Raft
分布式共识算法(故障容错算法)系列整理(五):ZAB

Raft算法的成员身份(服务器节点状态)

  • 领导者(Leader):同一时刻只有一个Leader,主要工作有处理写请求、管理日志复制和不断地发送心跳信息
  • 跟随者(Follower):默默接收和处理来自领导者的消息,当等待领导者心跳信息超时的时候,主动站出来,推荐自己当候选人
  • 候选者(Candidate):每一个节点都可以成为Candidate,节点在该角色下才可以被选为新的Leader,候选人将向其它节点发送请求投票(RequestVote) RPC消息,通知其它节点来投票,如果赢得了大多数选票,就晋升当领导者
  • Raft算法是强领导者模型,集群中只能有一个领导者
  • 任何一个节点有且仅有三种状态: Leader、 Follower、 Candidate。 Candidate 是一个中间状态,是正在选举中,选举结束后要么切换到Leader,要么切换到Follower
  • 分布式共识算法(故障容错算法)系列整理(四):Raft_第1张图片

Raft 算法如何避免 Paxos 的活锁问题?

  • Raft 限制为「单点写入」,必须选出一个 Leader,并且任一时刻只允许一个有效的 Leader 存在,所有的写请求都传到 Leader 上,然后由 Leader 同步给超过半数的 Follower
  • 分布式共识算法(故障容错算法)系列整理(四):Raft_第2张图片

Raft算法中的日志结构是怎样

  • 在Raft算法中,副本数据以日志的形式存在,日志是由日志项组成,日志项是一种数据格式,主要包含任期编号(Term)、索引值(Log index)、和用户指定的数据,即指令(Command/Content)
  • 分布式共识算法(故障容错算法)系列整理(四):Raft_第3张图片
  • 分布式共识算法(故障容错算法)系列整理(四):Raft_第4张图片
  • 任期编号(term):创建这条日志项的领导者的任期编号,后一条日志的 term >= 前一条日志的 term
  • 索引值(index):日志项对应的整数索引值,用来标识日志项,是一个连续的、单调递增的整数号码
  • 指令(command):一条由客户端请求指定的、状态机需要执行的指令。可理解成客户端指定的数据
  • 注意:一届领导者任期,往往有多条日志项。而且日志项的索引值是连续的

什么是任期(term)?

  • Raft算法中的领导者也是有任期的,每个任期由单调递增的数字(任期编号)标识,如节点A的任期编号是1。任期编号是随着选举的举行而变化的
    • 1.跟随者在等待领导者心跳信息超时后,推举自己为候选人时,会增加自己的任期号,如节点A的当前任期编号为0,那么在推举自己为候选人时,会将自己的任期编号加1
    • 2.如果一个服务器节点,发现自己的任期编号比其它节点小,那么它会更新自己的编号到较大的编号值。如节点B的任期编号是0,当收到来自节点A的请求投票RPC消息时,因为信息中包含了结点A的任期编号,且编号为1,那么节点B将把自己的任期编号更新为1
  • Raft 算法中的任期不只是时间段,而且任期编号的大小,会影响领导者选举和请求的处理,可解决「脑裂」问题
    • 1.在Raft算法中约定,如果一个候选人或领导者,发现自己的任期编号比其它节点小,那么它会立即恢复成跟随者状态。比如分区错误恢复后,任期编号为3的领导者节点B,收到来自新领导者的,包含任期编号为4的心跳信息,那么节点B将立即恢复成跟随者状态
    • 2.还约定如果一个节点接收到一个包含较小的

你可能感兴趣的:(架构,分布式,raft算法)