【发布时间】:2016-07-21 15:41:43
【问题描述】:
据记载,这是 TokenAware(DCAwareRoundRobinPolicy)。我的集群配置如下所示
lazy val session = {
val poolOptions = new PoolingOptions()
poolOptions.setMaxConnectionsPerHost(HostDistance.LOCAL, config.getInt("pooling.max-local"))
poolOptions.setCoreConnectionsPerHost(HostDistance.LOCAL, config.getInt("pooling.min-local"))
poolOptions.setMaxConnectionsPerHost(HostDistance.REMOTE, config.getInt("pooling.max-remote"))
poolOptions.setCoreConnectionsPerHost(HostDistance.REMOTE, config.getInt("pooling.min-remote"))
Cluster.builder.addContactPoints(hosts)
.withPoolingOptions(poolOptions)
.build
.connect
}
我的集群如下所示:
DC1
10.dc1.rac1.ip1
10.dc1.rac2.ip1
DC2
10.dc2.rac1.ip1
10.dc2.rac2.ip1
应用程序正在第五台不相关的机器上运行。问题似乎与 localDc 自动发现有关。根据源代码,驱动程序应该将本地 DC 检测为主机列表中的第一个节点。以下是似乎发生的事情:
如果 hosts = [ 10.dc1.rac1.ip1, 10.dc2.rac1.ip1 ],应用程序将以 50/50 的比例成功并出现 NoHostAvailableException。本地直流将是“dc1”或“dc2”
如果 hosts = [ 10.dc1.rac1.ip1, 10.dc1.rac2.ip1 ],应用程序将始终失败并出现 NoHostAvailableException。本地直流将错误地为“dc2”。如果我使用其他两台机器也是如此。注意应用程序的位置没有改变。
如果我在构建器中手动设置 localDc,一切都会按预期进行。不过这无关紧要,因为宣传的功能应该能够回退到另一个数据中心。
虽然没有运行 cassandra 实例并且在配置中没有提及它,但驱动程序似乎正在尝试连接到 localhost。所有这些乍一看似乎都是一个错误,但考虑到我的配置的简单性和 datastax 驱动程序的老练性质,我会感到惊讶。
编辑:抱歉,应该提到我正在使用 3.0.0
【问题讨论】:
-
您使用的是哪个版本的驱动程序?
-
驱动程序可能正在尝试 localhost,因为您的一个节点上的 cassandra.yaml 中的 rpc_address / broadcast_rpc_address 设置为 localhost。你能确认是否是这种情况吗?此外,您还应该通过 cqlsh 单独进入每个主机并运行“select * from system.peers”来查看 system.peers 表,以根据每个节点查看每个对等点的 rpc_address 和 data_center 值。