Cassandra - 两个 DCS 如果其中一个 DC 关闭,它将无法再次工作

问题描述 投票:0回答:1

` '此集群中有 2 个 RF=3 的 DC:DC1 3 个节点 DC2 3 个节点

客户要求当 DC2 出现故障(所有 3 个节点均出现故障)时,他们希望保持集群正常工作而不会出现任何仲裁问题。 来自客户:当 DC2 区域出现故障(所有 3 个节点均出现故障)时,他们尝试从工作室或结构服务器执行某些操作,但会收到以下错误

"Exception in wsSearchContact() java.sql.SQLTransientException:com.datastax.driver.core.exceptions.UnavailableException:  Not enough replicas available for query at consistency QUORUM (4 required but only 3 alive)"

在我们的案例中,当我们尝试保持 DC2 上的一个节点和 DC1 上的 3 个节点时,集群工作时没有任何仲裁问题。 我们正在为 Cassandra 和 Fabric 双方的集群寻找正确的配置。

我尝试将一致性级别设置为 Local_Quorum'`

database cassandra consistency
1个回答
0
投票

因此,2 个 DC 上基本上有 6 个副本。因此,以

QUORUM
一致性运行查询需要 4 个副本启动。

我在这里看到两个解决方案:

构建两个连接对象。其中一个连接对象使用“DC1”的

LocalDatacenter
,另一个使用“DC2”的
LocalDatacenter
。以
LOCAL_QUORUM
的一致性级别运行查询,这只需要 2 个副本。如何在运行时以编程方式在两个连接对象之间进行选择完全取决于您,但基本上,如果一个连接对象失败,您应该将其默认为另一个。该解决方案还消除了跨 DC 流量,因为每个连接都“粘性”到 DC。

更简单的解决方案是使用

TWO
的一致性级别。这不会阻止跨 DC 流量,但它的性能会比您现在的性能好得多(这保证每个查询中的跨 DC 流量)。另外,您仍然会获得单个 DC 的“松散法定人数”。

TBH - 我不确定 Fabric 是如何工作的,但理想情况下,您将拥有多个应用程序(或服务层)实例,它们与 Cassandra 节点运行所在的同一个物理 DC 紧密相关,并在

LOCAL_QUORUM 进行查询
(或其他一些“本地”一致性级别)。这样,当 DC1 发生故障时,它会带走 DC1 应用程序堆栈。然后,负载平衡在(Web)应用程序级别完成,并且只会将请求发送到实际运行的应用程序服务器。

© www.soinside.com 2019 - 2024. All rights reserved.