多图聊一聊Raft算法

80 阅读3分钟

本期视频已更新,欢迎一键三连! 要是 raft 算法这么讲,我就懂了_哔哩哔哩_bilibili

算法流程

选举leader

我们集群中有5个节点,每一个节点有一个超时时间,最开始集群中大家都在等待超时,选举的流程如下:

  1. 超时后节点进入 candidate 状态,term加1.然后向其他节点发布投票请求,图中是 S2 优先进入 candidate 状态。
  2. 当其他节点收到投票请求后,会判断自己的term和被投票者(S2)的term大小
  3. 如果当前节点的term 小于被投票者(S2)则会投入赞成票,同时自己的term修改为被投票节点的term,否则是反对票
  4. 如果被投票者(S2) 收到的赞成票超过半数,则当前节点(S2)会晋升为leader节点
  5. leader节点广播出信息 ,宣布自己成为 leader 节点
  6. leader和其他节点发送心跳检测响应
  7. 如果超时没有收到心跳,节点会再次进入 candidate

数据同步

  1. 当我们写入数据的时候,首先写入 leader节点
  2. leader 节点把数据 (proposal) 进行广播出去
  3. 其他节点收到数据后,返回对应的ack消息
  4. 当leader 收到ack消息超过半数,自己提交事务,然后通通知其他节点提交数据
  5. 各个节点数据提交完成,数据同步完成

其他情况

竞争选举

如果同时出现了两个节点同时超时的时候会出现什么情况?

  1. 两个节点 S1,S2同时发出投票请求
  2. 其他节点以S5 为例,当先收到 S1 的投票请求时候,由于term <2 所以S5投了赞成票,同时把自己的term改成2 。当再次收到 S2 的请求的发现term=2 所以投了反对票
  3. S1 和 S2 由于term 一样,所以相互投了反对票。
  4. 其他节点也是一样的,谁的票先到,就投递赞成票。
  5. 对于当前情况 S1 节点优先获得半数以上投票,然后作为leader 对外广播。

崩溃恢复

崩溃恢复是对一个分布式算法来说是非常重要的,对于leader节点来说,宕机主要有两种情况:

  1. 宕机时候无数据待同步到其他节点,当前数据已经同步完成。这个时候只需要做正常的选举就可以了
  2. 宕机时候有待提交的数据,如果这个时候 leader 已经被写入了数据,那其他节点的数据应该有一下几种情况
    1. 没有同步到其他节点,在下次选举出leader的时候,由于leader中没有当前数据,所以当前数据会丢失,如图S2的【2】这个数据会丢失

    1. 已经同步其他节点,但是还未提交。如果这个时候leader节点崩溃,则新的leader中有最新的数据,但是新的leader不会立即提交当前数据,而是等待下一次数据到达时候一起提交。

    1. 自己已经提交,然后通知其他其他节点提交的时候宕机。这种情况和第二种情况一样。

其他情况

新的 candidate 数据和集群不一致情况下,选举结果会是如何?

、、