2015-03-31 22 views
1

我们正面临一个我们没有预料到的Cassandra问题,我们将一个由6个节点组成的集群分成两个数据中心。 (见image1波纹管) http://s9.postimg.org/vyiykbosf/Cassandra_normal.png 不幸的是,我们最近面临一个问题,我们失去了3个节点(见图2波纹管),我们无法使集群完全可用。 http://postimg.org/image/yy3o6w10r/故障转移到远程数据中心 - Cassandra

在每个数据中心上,我们读取的一致性为1,写入的一致性为LOCAL_QUORUM。问题是我们在同一个数据中心上丢失了两个节点,并且当协调器被设置为该Datacenter中唯一可用的节点时,写入时一致性LOCAL_QUORUM不满足。

我们知道有onWriteTimeout方法,但我们不想降低一致性级别。 因此,当LOCAL_QUORUM不可能时,是否可以切换协调器(即:当协调器在DataCenter II上时,写入不可能,则重试将协调器切换到数据中心I上的可用节点)

我们找到了类DCAwareRoundRobinPolicy,但我不确定它是如何工作的,以及它是否符合我们的需要。 你们知道如何选择远程数据中心的主机吗?在哪里设置这些主机的列表?

问候,

回答

0

假设你正在使用的Java驱动程序(其他司机可能会采取不同的),可以从接触点的名单将决定你的本地DC连接的第一个主机。为每个DC使用专用群集实例应允许您实施故障转移方案。

+0

谢谢你回答,但我真的不明白我在哪里可以找到任何信息,这将有助于我解决此案。也许我在这里错过了一些东西。 – HammerZEIT 2015-03-31 12:34:03

+0

问题是它必须是一个完整的集群,分成两个数据中心。由于它必须这样,协调员可以在DCI或DCII(循环)中。如果协调器处于DCII中且LOCAL_QUORUM不满足,则写入过程将失败,并且不会在LOCAL_QUORUM在此处可以良好的DCI上重试。问题是关于如何实现/设置这样一个事实,即如果协调员的一致性不能得到满足,Cassandra会尝试写在其他DC上。 – HammerZEIT 2015-03-31 12:35:12

+0

尝试使您的应用程序处理写入错误,并使用第二个回退到其他DC的连接来实现重试。 – 2015-03-31 13:24:09

1

对不起,我的第一次答复已被删除,因为它只有在你没有发现和回答询问。

但是我终于找到了答案。

因此,如果您有2个DC,每个DC上有3个节点,并且复制因子为3. 如果一个DC发生故障或DC上的一个节点发生故障,您希望实现local_quourm。然后,你需要使用这个

http://grepcode.com/file/repo1.maven.org/maven2/com.datastax.cassandra/cassandra-driver-core/2.0.7/com/datastax/driver/core/policies/DCAwareRoundRobinPolicy.java#172

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的时候,我们杀死了当地的一个连接到集群。

但请注意:这个带有一个一致性警告...... 因为这可能会破坏一致性保证,如果你是罚款的是,它可能更好地使用弱consitency像一,二或三

+0

谢谢斯蒂芬,我对我回答的时间表示歉意。我会尝试测试你的意见,并尽快给我一个反馈。 – HammerZEIT 2016-04-22 14:57:22