我试图针对多个备份节点系统实现一个简单的单一主节点,以了解分布式和容错体系结构。
当前,这是我的系统的样子:
N个不同的节点,每个节点相同。 1个主节点运行一个简单的Web服务器。
所有节点都使用简单的心跳协议相互通信,并且每个节点都保持全局状态(可用节点数,谁是主节点,彼此的停机时间和正常运行时间。)
如果在设定的时间内未收到任何来自主节点的消息,则引发警报。如果已达成共识,认为该主服务器已关闭,则将选举新的主服务器。
节点网络是否已分区。
现在,我遇到了一个问题,那就是在上面的第4步中,有一个时间间隙,旧的主服务器仍在为请求服务,而新的主服务器在主节点中被选出。
如果某些客户端决定将新数据写入旧主机,这似乎会导致整个系统的数据不一致。我们如何避免这个问题。如果有人将我指向正确的方向,将会很高兴。
答案 0 :(得分:0)
在这种情况下,您想要的是拒绝接受对旧主控的写入,而不是接受对少数主控的写入,您可以通过尝试在每次写入时使用大部分集群来验证其主控权,从而做到这一点。如果主服务器位于分区的少数派一方,则它将不再能够与大多数群集联系,因此将无法确认客户的请求。短暂的不可用时间比在基于仲裁的系统中丢失已确认的写入要好。
您应该阅读Raft论文。您正在逐步实施Raft协议,它可能会回答您可能遇到的许多问题。