我们正面临着一个我们在Cassandra中没有想到的问题,我们将一个由6个节点组成的集群分成两个数据中心。 (见下图1)http://s9.postimg.org/vyiykbosf/Cassandra_normal.png不幸的是,我们最近遇到了一个问题,我们失去了3个节点(见图2),我们无法让集群完全可用。 http://postimg.org/image/yy3o6w10r/
在每个数据中心,我们的读取一致性为ONE,WRITE一致性为LOCAL_QUORUM。问题是我们在同一数据中心丢失了两个节点,并且当协调器设置为此数据中心中唯一可用的节点时,在写入时不满足一致性LOCAL_QUORUM。
我们知道有onWriteTimeout方法,但我们不想降低一致性级别。因此,当LOCAL_QUORUM不可能时,是否可以切换协调器?(即:当协调器在DataCenter II上时,无法写入,则重试将协调器切换到数据中心I上的可用节点)
我们找到了Class DCAwareRoundRobinPolicy,但我不确定它是如何工作的,如果它符合我们的需要。你们知道远程数据中心的主机是如何选择的吗?在哪里设置这些主机的列表?
问候,
对不起,我的第一个回复被删除,因为它只询问您是否找到并回答。
但是我最终确实找到了答案。
因此,如果您有2个DC,每个节点上有3个节点,复制因子为3.并且如果一个DC发生故障或DC上的1个节点发生故障,则希望获得local_quourm。然后,您需要使用此连接到群集
172号线,
Set "localDc"to your DC name, E.G "DC1"
Set "usedHostsPerRemoteDc" to the number of of nodes to query in DC2, E.G 3
Set "allowRemoteDCsForLocalConsistencyLevel" to true.
在我们的测试中,当我们杀死本地应用程序时,我们的应用程序切换到远程DC。
但是请注意:这带有一致性警告......因为这可能会破坏一致性保证,如果你对它很好,那么使用较弱的一个,如两个或两个较弱的可能性更好
假设您正在使用Java驱动程序(其他驱动程序可能采取不同的行为),可以从联系点列表连接的第一个主机将确定您的本地DC。为每个DC使用专用群集实例应该允许您实现故障转移方案。
实施DowngradingConsistencyRetryPolicy