cassandra - DCAwareRoundRobinPolicy 与 RoundRobinPolicy
问题描述
我在 DCAwareRoundRobinPolicy 与 RoundRobinPolicy 之间感到困惑
根据文档,DCAwareRoundRobinPolicy 首先从本地 DC 联系节点,然后从远程 DC 联系节点。
如果我没有设置 withUsedHostsPerRemoteDc & allowRemoteDCsForLocalConsistencyLevel。在回退的情况下,所有 Java 客户端应用程序仍将转到远程 DC 吗?
我目前正在使用以下代码:
DCAwareRoundRobinPolicy.builder().withLocalDc(cassandraConfig.getLocalDC())
.withUsedHostsPerRemoteDc(cassandraConfig.getUsedHostsPerRemoteDc())
.allowRemoteDCsForLocalConsistencyLevel();
我在当前生产集群中添加新 DC 时遇到问题。由于上面的代码,我可以看到远程 DC 上的读/写也开始了,我只是在加起来。尽管新的 DC 没有为它们设置任何复制因子。我仍然可以看到这种流量。因为重建新节点需要几个小时才能完成,所以我不能让所有应用程序都到达新节点。最后,我需要停用新节点以暂时停止这种行为。
删除withUsedHostsPerRemoteDc和allowRemoteDCsForLocalConsistencyLevel后一切看起来都不错。
然而,在几乎所有情况下都不建议这样做,因为这可能会破坏一致性保证
如果上面是真的,那么 DCAwareRoundRobinPolicy 有什么用,为什么 RoundRobinPolicy 不好???
解决方案
默认情况下,DCAwareRoundRobinPolicy
在设置您提到的选项之前不会转到远程 DC。但这只会发生在一致性级别LOCAL_ONE
& LOCAL_QUORUM
。如果您使用非LOCAL_
一致性级别,那么也可以将请求发送到远程 DC。但它应该只发生在QUORUM
, EACH_QUORUM
, 或以下情况下:
该策略保证不会查询远程数据中心中的任何主机,除非本地数据中心中的任何主机都无法到达。
虽然看到这一点很奇怪,因为你说:
尽管新的 DC 没有为它们设置任何复制因子。
我建议通过 JMX 检查它是否真的到达了远程 DC 中的表?
推荐阅读
- intellij-idea - 如何在 IntelliJ 中导出所需的插件功能?
- html - 获取文本部分到 xpath 中的特定标签
- excel - 使用 VBA 将超链接字段写入循环内的另一个工作表范围
- postgresql - 通过 @NamedStoredProcedureQuery 使用 Spring 数据 JPA 调用 postgres 函数时出错
- c++ - clang 格式 AlignAfterOpenBracket 列表参数
- flutter - 为什么我的 DropdownButtonFormField 不显示项目?
- java - 我想通过在 java 中显示多个 BankaccountNames 来显示员工姓名
- amazon-web-services - Amazon Redshift:查询在空闲期后永远不会完成运行
- keras - 二进制文本分类:为什么 LSTM 无法拟合,而 Dense net 拟合正常?
- oracle - 安装 Oracle ODAC 12.2.0.1 崩溃并在 W10 中完成