分布式一致性协议:Raft协议


1. Raft协议

Raft协议动态演示图

        nacosCP架构是通过Raft协议来实现的,Raft协议和ZAB协议都是分布式一致性协议的实现,两者很类似,主要包括两部分:

  1. Leader选举(半数以上节点投票同意)
  2. 集群节点写入数据同步(两阶段提交,半数以上节点写入成功)

①:Leader选举

集群中各节点有三种状态可以切换:跟随者(Follower)、领导者(Leader)、候选者(Candidater

  • 在进行leader选举时,所有的节点都从跟随者(Follower)状态开始
    在这里插入图片描述

  • 这些跟随者(Follower)如果没有收到其他leader的心跳,那么他们会变成候选者(Candidater)状态
    在这里插入图片描述

  • 当然,跟随者(Follower)在成为候选者(Candidater)状态时,并不是只要没接收到Leader心跳就会变换状态,这样是不合理的! Raft协议规定了Follower成为Candidater之前所等待的时间被随机分配在150毫秒至300毫秒之间,尽可能的避免多个节点同时发起投票,造成多节点选票一致的情况。如果出现了多节点选票一致的情况,那么此次选举作废,重新随机分配等待时间,重新发起选举,直到选举成功!
    在这里插入图片描述

  • 变成候选者(Candidater)的B节点开始向其他节点开始发起投票!
    在这里插入图片描述

  • 其他节点在接收到B节点的投票请求时,分别给B投一票,并重新为自己随机分配一个150 - 300毫秒的选举时间!
    在这里插入图片描述

  • B节点获取了大于集群节点一半的选票,变成了领导者Leader
    在这里插入图片描述

  • 后续B作为Leader会给其他节点发送心跳验证节点存活、同步数据。其他节点接受心跳后会重置变成候选者(Candidater)状态的时间。
    在这里插入图片描述

  • 如果B节点宕机,A、C节点会通过150 - 300毫秒的随机时间后变为候选者(Candidater)节点,并在AC中选举新的Leader节点!由于C节点收到了A和C(自身)节点的选票,同时 2 > 1.5,所以C变为新的Leader
    *


②:集群节点数据同步

  • 首先客户端集群写数据时,只能向Leader节点中写在这里插入图片描述

  • Leader接收到数据时,并不是马上在Leader节点内部保存数据,并给客户端回应。而是把数据传输给其他节点。在这里插入图片描述

  • 其他节点接收到数据后给Leader返回响应,Leader接收到大多数(可配置,一般为半数以上)Flower节点的响应后,数据才在Leader节点提交,写入Leader节点内部,并响应给客户端写数据成功!
    在这里插入图片描述

  • Leader响应给客户端写数据成功,然后再通过心跳把数据更新到其他Flower节点下
    在这里插入图片描述


③:发生网络分区,出现脑裂如何处理?

  • 当多个节点发生了网络分区,就会出现多个Leader,也就是俗称的脑裂现象!
    在这里插入图片描述
  • 由于Raft协议规定:更新数据时Leader要与Flower节点通信,且必须收到大多数(默认半数)节点的响应才能更新数据成功,下图由于网络分区把5个节点的集群变成了两个分区,分区之间无法通信:
    • B节点作为Leader在他自己的分区内最多接受1个节点响应,1=1(半数),并没有大于半数1,所以无法更新数据,进而无法给客户端更新成功的响应,可以无法对外提供服务,该分区不可用!
    • 而C节点作为Leader在他自己的分区内可以接受2个节点响应,2>1.5(半数),大于半数节点1.5,所以在当前分区内可以正常更新数据,正常给客户端发送成功的响应!
    • 通过这个半数机制,保证即使发生了脑裂,也能保证数据的一致性!
      在这里插入图片描述
  • 当网络分区恢复后,Leader节点B由于看到Leader节点C拥有更多的选票,就把自己的Leader身份下掉,变为Leader节点C的Flower节点!并回滚自己之前未提交的数据 SET 3。然后通过心跳从Leader节点C同步最新的数据!
    在这里插入图片描述
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
分布式系统一致性协议是用于确保在分布式系统中的多个节点之间达成一致状态的协议。在分布式系统中,由于网络延迟、节点故障等原因,节点之间的数据可能会出现不一致的情况。一致性协议的目标是通过协调节点之间的操作,使得系统在面对各种故障和并发操作时能够保持一致性。 常见的分布式系统一致性协议包括: 1. 两阶段提交(Two-Phase Commit,2PC):2PC是一种基于中心协调者的协议,它通过两个阶段的消息交换来实现一致性。第一阶段是准备阶段,协调者向参与者发送准备请求,并等待参与者的响应。第二阶段是提交阶段,协调者根据参与者的响应决定是否提交或中止事务。2PC的缺点是存在阻塞和单点故障问题。 2. 三阶段提交(Three-Phase Commit,3PC):3PC是对2PC的改进,引入了超时机制来解决阻塞问题。它将2PC的准备阶段拆分为canCommit和preCommit两个阶段,并引入超时机制来处理参与者和协调者的故障。 3. Paxos:Paxos是一种基于消息传递的一致性协议,用于解决分布式系统中的一致性问题。Paxos通过选举一个提议者和多个接受者来达成一致,它具有高度的容错性和可扩展性。 4. RaftRaft是一种相对于Paxos更易理解和实现的一致性协议Raft一致性问题分解为领导选举、日志复制和安全性三个子问题,并通过选举一个领导者来协调节点之间的操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值