【问题标题】:DCAwareRoundRobinPolicy Vs RoundRobinPolicyDCAwareRoundRobinPolicy 与 RoundRobinPolicy
【发布时间】:2018-10-29 16:48:22
【问题描述】:

我在 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不好???

【问题讨论】:

    标签: cassandra datastax-java-driver


    【解决方案1】:

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

    此策略保证不会查询远程数据中心中的任何主机,除非本地数据中心中的主机无法访问。

    虽然很奇怪,因为你说:

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

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

    【讨论】:

    • 我已经编辑了上面显示的代码以修复和删除 .allowRemoteDCsForLocalConsistencyLevel();我又试了一次,我仍然可以在我们的产品集群中看到同样的问题。我在想问题可能是因为 .withUsedHostsPerRemoteDc(2) 。仍然很奇怪,没有为新 DC 设置 RF。我可以先在客户端应用程序中看到一些警告,然后再看到错误:--
    • 2018-10-30 16:17:44.853 WARN [prod cluster-nio-worker-10 - HostConnectionPool] 创建与 /x.y.z.141:9042 的连接时出错 2018-10-30 16:17:46.460错误 [prod cluster-reconnection-0 - AbstractReconnectionHandler] 主机 /x.y.z.141:9042 上的身份验证错误:org.apache.cassandra.exceptions.UnavailableException:无法达到一致性级别 LOCAL_ONE
    • 2018-10-30 16:17:46.462 错误 [prod cluster-reconnection-0 - Cluster] 重新连接到 /x.y.z.141:9042 期间的身份验证错误,计划在 2000 毫秒内重试 com.datastax.driver .core.exceptions.AuthenticationException:主机 /x.y.z.141:9042 上的身份验证错误:org.apache.cassandra.exceptions.UnavailableException:无法达到一致性级别 LOCAL_ONE
    • 您是否更改了身份验证密钥空间的复制? docs.datastax.com/en/dse/5.1/dse-admin/datastax_enterprise/… 我建议只留下 DCAwareRoundRobinPolicy.builder().withLocalDc(cassandraConfig.getLocalDC()) 并在集群配置中仅使用本地 DC 的联系点
    • 如果您更改了复制但尚未修复,可能会发生身份验证错误。另外cassandra用户的数据是用QUORUM读取的,所以如果你用它来认证,最好创建一个单独的用户
    猜你喜欢
    • 1970-01-01
    • 2017-02-13
    • 1970-01-01
    • 2016-03-23
    • 1970-01-01
    • 1970-01-01
    • 2012-12-05
    • 1970-01-01
    • 2015-12-10
    相关资源
    最近更新 更多