Datastax Cassandra驱动程序默认负载平衡策略

时间:2016-04-01 18:05:55

标签: java cassandra datastax

如文档所述,这是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

1 个答案:

答案 0 :(得分:0)

上面的Andy Tolbert对任何正在寻找的人都有正确的答案。不幸的是,似乎默认设置(除了在每台机器上明确配置正确的地址之外的任何设置)都不允许您同时接受来自本地和远程主机的连接。