0

我们正在开发基于 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 集群中的一个作为主要集群吗?

4

2 回答 2

0

不管 ZooKeeper 的行为如何,如果 DC1 和 DC2 之间失去连接,集群将无法正常运行。ZooKeeper 负责DiscoverySpi,但不负责需要所有节点之间完全连接的CommunicationSpi 。

因此,即使发现 SPI 能够解决丢失的连接问题,缓存操作也无法成功。

不建议包含与集群其余部分连接速度较慢的节点,因为它们会减慢所有操作并使集群不稳定。在这种情况下,最好设置两个单独的集群并配置它们之间的复制(例如,GridGain 提供了这样的能力:https ://www.gridgain.com/products/software/enterprise-edition/data-center-replication )

如果您想实现集群之间失去连接的保护,您还可以查看SegmentationResolver 。

于 2019-10-09T10:02:03.020 回答
0

您可以查看https://apacheignite.readme.io/docs/zookeeper-discovery#section-failures-and-split-brain-handling的“ZooKeeper 集群分段”部分

您总共有 3 个 zknode,zookeeper 需要一半以上的节点,即在您的情况下,分段中的 2 个节点仍在努力决定应该关闭哪个分段。从您当前的架构中,您有三个分段,每个分段中只有一个 zknode。因此,没有分段包含超过一半的节点(在您的情况下为 2 个节点),那么我认为结果应该是关闭您身边的所有三个 zknode,然后所有 ignite 节点也因无法连接到 zknode 而关闭。

于 2021-04-09T10:01:55.900 回答