我在这里看到了一个密切相关的类似问题,但提供的答案并不能完全解决我的疑虑。
假设配置了一个没有见证节点的 3 节点集群,并且所有节点都能够相互通信。
由于节点的数量是奇数,它应该能够自己达到法定人数,假设至少有 2 个节点已启动并正在运行并且能够相互通信。这可以防止出现裂脑情况,即多个节点可以运行一次应该只有一个活动实例的服务。
如果其中一个连接中断并且节点 A 和 B 无法相互通信怎么办,如下所示:
然后 (A,C) 和 (B,C) 对都可以实现两个独立的法定人数(绿色和红色)并可能引入裂脑情况 - 如果 B 正在运行 UniqueService,节点 A 将不知道 B 仍在运行并且可以决定启动它。我的问题是:
a) 这是一个真正的问题吗?如果不是,为什么?
b) 如果不是,是不是因为 AC 和 BC 对都可以通信,所以 A 和 B 之间的任何通信仍然可以通过 A <-> C <-> B 进行。如果 A 和 B 不能通信,那是因为 a法定人数甚至没有试图解决的更大问题?
你在这里几乎回答了你自己的问题,但只是为了确认,是的 - 如果你遵循实施此类集群的最佳实践,那永远不会出现这种情况。
如果A<->C可以通信,B<->C可以通信,那么A<->B不能通信的可能性就真的不存在了。
此外,由于 C 在这两种情况下都存在,因此它不会两次投票创建法定人数——这就是法定人数的全部意义所在。每个节点只有一票。
根据集群配置,我会说,即使您以某种方式发明了一种场景,其中 A 和 B 只能与 C 通信而不能彼此通信,那么集群要么 a) 根本不形成,要么 b) 是形成一次,因为节点 C 基本上将决定哪些节点将参与集群(它和另一个)。