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

How to avoid loss of internal state of a master during fail-over to new master during a network partition

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

目前我的系统是这样的:

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

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

  3. 如果任何节点在一段时间内没有收到主节点的消息,则会发出警报。如果一致认为master宕机,则选举新的master。

  4. 如果节点网络被分割。

    • 而master在minor partition,那么它会停止服务请求,并在设定的时间后自行down掉。 minor group不能选举master(部分minimum节点需要决策)
    • 新主人在没有收到旧主人的消息后经过一段时间后在主分区中被选中。

现在我遇到了一个问题,就是在上面的第4步中,有一个时间差,旧的master还在服务请求,而新的master在主节点上被选举出来。

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

在这种情况下,您不需要接受对少数 master 的写入,而是简单地拒绝对旧 master 的写入,您可以通过在每次写入时尝试验证其对集群的多数的控制权来做到这一点.如果 master 位于分区的少数端,它将无法再联系集群的大多数,因此将无法确认客户端的请求。这段短暂的不可用时间比在基于仲裁的系统中丢失已确认的写入更可取。

你应该阅读 Raft 论文。你正在慢慢地朝着 Raft 协议的实现迈进,它可能会回答你在这个过程中可能遇到的许多问题。