我们正在开发基于 Apache Ignite 的分布式系统架构。系统对容错有严格的要求。
为此,我们有三个数据中心 (DC):其中两个是主 DC(DC1 和 DC2),一个是备用 DC(DC3)。我们在主要 DC 之间有一个快速以太网通道。DC1 和 DC2 通过 40 GbE 连接。Reserve DC3 通过慢速通道 1 GbE 连接到 DC1 和 DC2。
我们计划将 ZooKeeper Discovery 用于 Ignite Cluster,并希望将 ZooKeeper Cluster 节点放置到三个 DC:每个 DC 1 个节点。
我们计划仅将 Ignite Cluster 节点放置在主 DC(到 DC1 和 DC2)中。DC1 和 DC2 将具有相同数量的 Ignite 节点。
如果主 DC DC1 和 DC2 之间的 40GbE 通道关闭,当发生网络分段时,Ignite Cluster 会发生什么情况?
比如DC3中的ZK3节点是leader,ZK1和ZK2是follower,这种情况下leader节点可以和两个follower通信,follower之间就失去了联系。ZooKeeper 集群保持在集合中。
来自 DC1 的 Ignite Cluster 节点可以与 ZK1 和 ZK3 节点以及 DC1 中的彼此通信。来自 DC2 的 Ignite Cluster 节点可以与 ZK2 和 ZK3 节点以及 DC2 中的彼此之间进行通信。
在这种网络分段情况下,如何解决脑裂情况,或者我们得到两个独立的 Ignite 集群?
文档https://apacheignite.readme.io/docs/zookeeper-discovery#section-failures-and-split-brain-handling告诉我们:
每当一个节点发现它无法连接到集群中的某些其他节点时,它就会通过向 ZooKeeper 集群发布特殊请求来启动通信故障解决过程。当进程启动时,所有节点都尝试相互连接,并将连接尝试的结果发送到协调进程的节点(协调节点)。基于此信息,协调节点创建表示集群中网络情况的连接图。进一步的操作取决于网络分段的类型。
在这种情况下,协调器可以选择半个 Ignite 集群中的一个作为主要集群吗?