Java Datastax Cassandra驱动程序默认负载平衡策略的问题

Java Datastax Cassandra驱动程序默认负载平衡策略的问题,java,cassandra,datastax,Java,Cassandra,Datastax,如文件所述,这是TokenAware(dcawarerRoundRobinPolicy)。我的集群配置如下所示 lazy val session = { val poolOptions = new PoolingOptions() poolOptions.setMaxConnectionsPerHost(HostDistance.LOCAL, config.getInt("pooling.max-local")) poolOptions.setCoreConnectionsPerHost(Hos

如文件所述,这是TokenAware(dcawarerRoundRobinPolicy)。我的集群配置如下所示

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的比例成功,无hostAvailableException。本地Dc将为“dc1”或“dc2”

  • 如果hosts=[10.dc1.rac1.ip1,10.dc1.rac2.ip1],应用程序将以NoHostAvailableException一致失败。本地Dc将被错误地设置为“dc2”。如果我使用其他两台机器,情况也是如此。注意:应用程序的位置未更改

  • 如果我在构建器中手动设置localDc,那么一切都会按预期进行。但这并不重要,因为广告的功能应该能够回退到另一个数据中心

此外,驱动程序似乎正在尝试连接到localhost,尽管没有运行cassandra实例,配置中也没有提到它。所有这些乍一看都是一个bug,但考虑到配置的简单性和datastax驱动程序的老练性,我会感到惊讶


编辑:抱歉,我应该提到我使用的是3.0.0,上面的安迪·托尔伯特对任何正在查看的人都给出了正确的答案。不幸的是,默认设置(以及除在每台计算机上明确配置正确地址之外的任何设置)似乎不允许您同时接受来自本地和远程主机的连接

您正在使用哪个版本的驱动程序?驱动程序可能正在尝试localhost,因为其中一个节点上的cassandra.yaml中的rpc_地址/广播_rpc_地址设置为localhost。你能证实是否是这样吗?此外,您还应该查看system.peers表,方法是分别对每个主机进行cqlsh并运行“select*from system.peers”,以查看每个节点的每个对等点的rpc_地址和数据_中心值。