我对DCAwareRoundRobinPolicy与RoundRobinPolicy之间感到困惑
根据文档,DCAwareRoundRobinPolicy首先与本地DC联系,然后再与远程DC联系。
如果我未设置UsedHostsPerRemoteDc和allowRemoteDCsForLocalConsistencyLevel。 如果发生回退,所有Java客户端应用程序是否仍将转至远程DC?
我当前正在使用以下代码:
DCAwareRoundRobinPolicy.builder().withLocalDc(cassandraConfig.getLocalDC())
.withUsedHostsPerRemoteDc(cassandraConfig.getUsedHostsPerRemoteDc())
.allowRemoteDCsForLocalConsistencyLevel();
在当前的生产集群中添加新的DC时遇到问题。由于上面的代码,我还可以看到我刚刚添加的在远程DC上启动的读/写操作。尽管新DC没有为其设置任何复制因子。我仍然可以看到此流量。因为重建新节点将花费数小时才能完成,所以我无法让所有应用程序都到达新节点。 最后,我需要停用新节点以暂时停止此行为。
在删除 withUsedHostsPerRemoteDc 和 allowRemoteDCsForLocalConsistencyLevel 之后,一切看起来都不错。
但是在几乎所有情况下都不建议这样做,因为这样做会 可能破坏一致性保证
如果以上内容正确,那么DCAwareRoundRobinPolicy有什么用,为什么RoundRobinPolicy不好??
答案 0 :(得分:3)
默认情况下,DCAwareRoundRobinPolicy
在设置了您提到的选项之前不会进入远程DC。但这只会在一致性级别LOCAL_ONE
和LOCAL_QUORUM
中发生。如果使用非LOCAL_
一致性级别,则请求也可以发送到远程DC。但它仅应在QUORUM
,EACH_QUORUM
或以下情况下发生:
此策略确保除非查询本地数据中心中的主机,否则不会查询远程数据中心中的主机。
虽然看到它是很奇怪的,因为您说过:
尽管新DC没有设置任何复制因子。
我建议通过JMX检查它是否真的到达了远程DC中的表?