首页 > 解决方案 > DCAwareRoundRobinPolicy 与 RoundRobinPolicy

问题描述

我在 DCAwareRoundRobinPolicy 与 RoundRobinPolicy 之间感到困惑

根据文档,DCAwareRoundRobinPolicy 首先从本地 DC 联系节点,然后从远程 DC 联系节点。

如果我没有设置 withUsedHostsPerRemoteDc & allowRemoteDCsForLocalConsistencyLevel。在回退的情况下,所有 Java 客户端应用程序仍将转到远程 DC 吗?

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

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

我在当前生产集群中添加新 DC 时遇到问题。由于上面的代码,我可以看到远程 DC 上的读/写也开始了,我只是在加起来。尽管新的 DC 没有为它们设置任何复制因子。我仍然可以看到这种流量。因为重建新节点需要几个小时才能完成,所以我不能让所有应用程序都到达新节点。最后,我需要停用新节点以暂时停止这种行为。

删除withUsedHostsPerRemoteDcallowRemoteDCsForLocalConsistencyLevel后一切看起来都不错。

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

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

如果上面是真的,那么 DCAwareRoundRobinPolicy 有什么用,为什么 RoundRobinPolicy 不好???

标签: cassandradatastax-java-driver

解决方案


默认情况下,DCAwareRoundRobinPolicy在设置您提到的选项之前不会转到远程 DC。但这只会发生在一致性级别LOCAL_ONE& LOCAL_QUORUM。如果您使用非LOCAL_一致性级别,那么也可以将请求发送到远程 DC。但它应该只发生在QUORUM, EACH_QUORUM, 或以下情况下:

该策略保证不会查询远程数据中心中的任何主机,除非本地数据中心中的任何主机都无法到达。

虽然看到这一点很奇怪,因为你说:

尽管新的 DC 没有为它们设置任何复制因子。

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


推荐阅读