如何避免在网络分区期间故障转移到新的主机期间丢失主机的内部状态

时间:2018-11-01 10:26:11

标签: distributed-computing distributed-system fault-tolerance

我试图针对多个备份节点系统实现一个简单的单一主节点,以了解分布式和容错体系结构。

当前,这是我的系统的样子:

  1. N个不同的节点,每个节点相同。 1个主节点运行一个简单的Web服务器。

  2. 所有节点都使用简单的心跳协议相互通信,并且每个节点都保持全局状态(可用节点数,谁是主节点,彼此的停机时间和正常运行时间。)

  3. 如果在设定的时间内未收到任何来自主节点的消息,则引发警报。如果已达成共识,认为该主服务器已关闭,则将选举新的主服务器。

  4. 节点网络是否已分区。

    • 并且主服务器位于次分区中,然后它将停止服务请求,并在设置的时间段后自行关闭。小团体不能选举主人(某些最小的节点需要做出决定)
    • 新老主机在没有听到老主主机的通知后的指定时间后被选中。

现在,我遇到了一个问题,那就是在上面的第4步中,有一个时间间隙,旧的主服务器仍在为请求服务,而新的主服务器在主节点中被选出。

如果某些客户端决定将新数据写入旧主机,这似乎会导致整个系统的数据不一致。我们如何避免这个问题。如果有人将我指向正确的方向,将会很高兴。

1 个答案:

答案 0 :(得分:0)

在这种情况下,您想要的是拒绝接受对旧主控的写入,而不是接受对少数主控的写入,您可以通过尝试在每次写入时使用大部分集群来验证其主控权,从而做到这一点。如果主服务器位于分区的少数派一方,则它将不再能够与大多数群集联系,因此将无法确认客户的请求。短暂的不可用时间比在基于仲裁的系统中丢失已确认的写入要好。

您应该阅读Raft论文。您正在逐步实施Raft协议,它可能会回答您可能遇到的许多问题。