闲聊分布式共识算法raft(2)

raft 算法在发生网络分区的时候是怎么保证一致性的

     本文主要简单聊聊分布式共识算法raft在发生网络分区的时候如何保持最终一致性。如果有对raft基础不清楚,或者对日志复制和首领选举有疑问可以参看之前的文章.raft
共识算法(1)
    首先我们看一个状态就是没有网络分区的情况。闲聊分布式共识算法raft(2)_第1张图片
图中我们可以观察到的情况就是绿色的client和蓝色的服务端节点之间网络是互通的。接下来我们来添加一个分区来使得他们有网络隔离存在。闲聊分布式共识算法raft(2)_第2张图片
黑色的虚线代表网络隔离,这样节点AB和CDE三个节点就不在同一分区了,然后我们可以看到黑色圈的B依然是leader。上面的三个节点是没有leader的。上面的CDE经过一次首领选举以后会变成下图的样子。闲聊分布式共识算法raft(2)_第3张图片闲聊分布式共识算法raft(2)_第4张图片
注意看上图节点C也是leader了,但是节点C的term 是2 也就是说任期提升了一个任期。由于出现网络分区导致我们现在存在不同的两个leader(这里要注意这两个leader是不一样的任期,也就是term不一样)。闲聊分布式共识算法raft(2)_第5张图片

然后我们在AB的网络分区中增加一个client来尝试改变这个节点B的值(对于这个增加的client可能在真实场景中本来就有甚至有很多个)。闲聊分布式共识算法raft(2)_第6张图片
下图中我们可以看到AB的节点网络分区中尝试更新节点的值为3,但是呢这个黑色的框中日志是红色的。代表着这个 SET 3这条日志还没有提交,然后我们的节点值也没有发生变化。为什么呢,因为我们看到的是有5个节点,对于 SET 3 这条日志是没有办法根据日志复制原则,复制到一半以上的节点的,所以这条日志无法提交,这样也就无法进行提交和更改。也就是说raft在发生网络分区的时候,我们是没有办法在半数以下的节点的网络分区中进行更改的闲聊分布式共识算法raft(2)_第7张图片
对于上图中CDE所在的网络分区中,leader的节点C是可以把日志复制到3个节点的(也就是半数以上个节点),这样我们可以看到,对于节点C的更改是成功的。那么我们这个时候如果修复了网络分区会怎样呢。闲聊分布式共识算法raft(2)_第8张图片
修复网络分区以后我们发现,原先节点AB的任期是1,修复分区以后节点任期增加到2了。而且上一步的日志 SET 3 没有了,这就说明呀,所有未提交的日志,遇到了更高任期的leader的时候都会被回滚掉。还有当接收到任期比自己高的leader的心跳的时候,是复制了leader的节点日志的。而且把自己任期追上了leader的任期。这样我们的日志在整个的集群中都是一致的。

    以上就是我们的raft算法在发生网络分区的时候如何保持最终一致性的过程了。
——————————————————————————————————————
参考文献:数据的秘密
生活和梦想同样重要。我是小码农,谢谢您的浏览!

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