DCAwareRoundRobinPolicy与RoundRobinPolicy

时间:2018-10-29 05:54:55

标签: cassandra datastax-java-driver

我对DCAwareRoundRobinPolicy与RoundRobinPolicy之间感到困惑

根据文档,DCAwareRoundRobinPolicy首先与本地DC联系,然后再与远程DC联系。

如果我未设置UsedHostsPerRemoteDc和allowRemoteDCsForLocalConsistencyLevel。 如果发生回退,所有Java客户端应用程序是否仍将转至远程DC?

我当前正在使用以下代码:

    DCAwareRoundRobinPolicy.builder().withLocalDc(cassandraConfig.getLocalDC())
.withUsedHostsPerRemoteDc(cassandraConfig.getUsedHostsPerRemoteDc())
.allowRemoteDCsForLocalConsistencyLevel();

在当前的生产集群中添加新的DC时遇到问题。由于上面的代码,我还可以看到我刚刚添加的在远程DC上启动的读/写操作。尽管新DC没有为其设置任何复制因子。我仍然可以看到此流量。因为重建新节点将花费数小时才能完成,所以我无法让所有应用程序都到达新节点。 最后,我需要停用新节点以暂时停止此行为。

在删除 withUsedHostsPerRemoteDc allowRemoteDCsForLocalConsistencyLevel 之后,一切看起来都不错。

Datastax文档也说https://docs.datastax.com/en/latest-java-driver-api/com/datastax/driver/core/policies/DCAwareRoundRobinPolicy.Builder.html#allowRemoteDCsForLocalConsistencyLevel--

  

但是在几乎所有情况下都不建议这样做,因为这样做会   可能破坏一致性保证

如果以上内容正确,那么DCAwareRoundRobinPolicy有什么用,为什么RoundRobinPolicy不好??

1 个答案:

答案 0 :(得分:3)

默认情况下,DCAwareRoundRobinPolicy在设置了您提到的选项之前不会进入远程DC。但这只会在一致性级别LOCAL_ONELOCAL_QUORUM中发生。如果使用非LOCAL_一致性级别,则请求也可以发送到远程DC。但它仅应在QUORUMEACH_QUORUM或以下情况下发生:

  

此策略确保除非查询本地数据中心中的主机,否则不会查询远程数据中心中的主机。

虽然看到它是很奇怪的,因为您说过:

  

尽管新DC没有设置任何复制因子。

我建议通过JMX检查它是否真的到达了远程DC中的表?