【问题标题】:Issues with Datastax Cassandra driver default load balancing policyDatastax Cassandra 驱动程序默认负载平衡策略的问题
【发布时间】: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 值。

标签: java cassandra datastax


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2018-06-09
    • 1970-01-01
    • 2016-06-04
    • 2019-08-01
    • 1970-01-01
    • 2017-02-27
    • 2016-02-27
    • 2017-01-20
    相关资源
    最近更新 更多