【问题标题】:Cassandra behavior on contact point based on data center基于数据中心的接触点上的 Cassandra 行为
【发布时间】:2019-09-03 12:32:45
【问题描述】:

Cassandra 设置在 3 个数据中心(dc1、dc2 和 dc3)形成​​一个集群

在 dc1 上运行 Java 应用程序。 dc1 应用程序具有指向 dc1 的 Cassandra 连接器(dc1 中 cassandra 的 ips 单独提供给应用程序)

关闭 dc1 cassandra 节点应用程序会在应用程序中引发异常,例如

尝试查询的所有主机均失败(未尝试任何主机)

更多信息:

cassandra-driver-core-3.0.8.jar
netty-3.10.5.Final.jar
netty-buffer-4.0.37.Final.jar
netty-codec-4.0.37.Final.jar
netty-common-4.0.37.Final.jar
netty-handler-4.0.37.Final.jar
netty-transport-4.0.37.Final.jar

Keyspace : Network topology
Replication : dc1:2, dc2:2, dc3:2
Cassandra Version : 3.11.4

【问题讨论】:

  • 你使用默认的负载均衡策略吗?您是否在驱动程序中明确设置本地数据中心?你使用本地一致性级别吗?
  • @AlexOtt 应用程序代码中没有提到 LoadBalancingPolicy。
  • 驱动是否存在版本不匹配(Cassandra: 3.11.4 & cassandra-driver-core-3.0.8.jar)

标签: java cassandra


【解决方案1】:

以下是我在连接和 Cassandra 中发现的一些内容(顺便说一句,我相信 Cassandra 拥有我在过去 25 年中使用过的所有数据库中最好的 HA 配置之一)。

1) 确保您拥有连接连接中指定的所有组件。这是一些连接组件的示例,但也有其他的(也许您已经这样做了):

 cluster = Cluster.builder()
    .addContactPoints(nodes.split(","))
    .withCredentials(username, password)
    .withPoolingOptions(poolingOptions)
    .withLoadBalancingPolicy(
            new TokenAwarePolicy(DCAwareRoundRobinPolicy.builder()
                    .withLocalDc("MYLOCALDC")
                    .withUsedHostsPerRemoteDc(1)
                    .allowRemoteDCsForLocalConsistencyLevel()
                    .build()
               )
    ).build();

2) 除非您“工作”的整个 DC 都关闭了,否则您可能会收到错误消息。 Cassandra 不会故障转移到备用 DC,除非 DC 中的每个节点都已关闭。如果少于所有节点都关闭并且您的客户端无法满足客户端 CL 设置,您将收到错误消息。我实际上希望,当我前一段时间进行测试时,如果您无法在本地 DC 中实现客户端 CL(即使当前 DC 中的某些节点已启动)而备用 DC 可以,它会自动故障转移,但事实并非如此(自从我上次测试以来)。

也许这有帮助?

-吉姆

【讨论】:

  • 应用代码@Jim 中没有LoadBalancingPolicy
  • datastax 的默认值为 new TokenAwarePolicy(DCAwareRoundRobinPolicy.builder().build());
  • 在DCAwareRoundRobinPolicy 的文档中。在我的情况下,整个 DC1 都关闭了。
猜你喜欢
  • 2016-03-04
  • 2021-11-25
  • 2021-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-10
  • 2018-11-08
相关资源
最近更新 更多