如文档所述,这是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
}
My Cluster看起来像这样:
DC1
10.dc1.rac1.ip1
10.dc1.rac2.ip1
DC2
10.dc2.rac1.ip1
10.dc2.rac2.ip1
应用程序在第5台不相关的计算机上运行。问题似乎与localDc自动发现有关。根据源代码,驱动程序应将本地DC检测为主机列表中的第一个节点。这是似乎发生的事情:
如果hosts = [10.dc1.rac1.ip1,10.dc2.rac1.ip1],app将以50/50为基础使用NoHostAvailableException成功。本地Dc将是“dc1”或“dc2”
如果hosts = [10.dc1.rac1.ip1,10.dc1.rac2.ip1],app将与NoHostAvailableException一致失败。本地Dc将错误地为“dc2”。如果我使用其他2台机器也是如此。注意应用程序的位置未更改。
如果我在构建器中手动设置localDc,则一切都可以正常工作。这应该无关紧要,因为广告功能应该能够回退到另一个数据中心。
此外,驱动程序似乎正在尝试连接到localhost,尽管没有运行cassandra实例,并且在配置中没有提及它。所有这一切看起来都是一个错误,但考虑到我的配置的简单性和数据存储驱动程序的经验性质,我会感到惊讶。
编辑:道歉,应该提到我使用的是3.0.0答案 0 :(得分:0)