【问题标题】:Consistency level changes while reading from cassandra从 cassandra 读取时一致性级别发生变化
【发布时间】:2016-06-03 22:08:30
【问题描述】:

我有 10 个节点的 cassandra 集群,复制因子为 {DC1:3,DC2:2}。 DC1 在 rack1 中有 6 个节点,DC2 在 rack1 中有 4 个节点。我正在发出具有 LocalQuorum 一致性级别的读取请求。即使我在每个查询中设置了一致性级别,有时它也会返回以下错误,

com.datastax.driver.core.exceptions.ReadTimeoutException: Cassandra 在一致性 ALL 的读取查询期间超时(5 个响应是 需要,但只有 3 个副本响应)

我正在使用 cassandra 2.0.9 和 datastax java 驱动程序版本 2.0.5。在 nodetool 状态下,它显示所有节点都正常。我该如何克服呢?一致性级别如何更改为 ALL?

集群建设:

private static Cluster constructCluster(String hostName,String port) {
    String[] hostNames = hostName.split(",");
    SocketOptions sOptions = new SocketOptions();
    sOptions.setKeepAlive(true);
    QueryOptions qOptions = new QueryOptions().setConsistencyLevel(ConsistencyLevel.LOCAL_QUORUM)
            .setFetchSize(500);
    LatencyAwarePolicy loadBalancingPolicy = LatencyAwarePolicy.builder(new DCAwareRoundRobinPolicy(defaultDC))
            .build();
    Cluster cluster = Cluster.builder()
            .addContactPoints(hostNames)
            //.withCompression(Compression.SNAPPY)
            .withLoadBalancingPolicy(loadBalancingPolicy)
            .withPoolingOptions(new PoolingOptions())
            .withQueryOptions(qOptions)
            .withReconnectionPolicy(new ConstantReconnectionPolicy(TimeUnit.SECONDS.toMillis(5)))
            .withRetryPolicy(new LoggingRetryPolicy(DefaultRetryPolicy.INSTANCE))
            .withSocketOptions(sOptions)
            .build();
    return cluster;
}

数据检索:

Cluster cluster = constructCluster(hosts, null);
Session session = cluster.connect("mykeyspace");
Statement stmt = QueryBuilder.select().all().from(cf).where(QueryBuilder.eq("key", row_key)).setConsistencyLevel(ConsistencyLevel.LOCAL_QUORUM);
ResultSet resultSet = session.execute(stmt);

【问题讨论】:

  • 能否请您使用 Java 驱动程序显示您的源代码?

标签: cassandra cql datastax datastax-java-driver


【解决方案1】:

您的问题看起来很像 JIRA ISSUE 7868 导致 JIRA ISSUE 7947,因为查看您的代码我没有发现任何问题。

正如我从第二个问题中看到的,它已在 2.0.12 和 2.1.3 中得到修复,因此您可能需要更新版本。

我们遇到了同样的问题,基本上错误消息具有误导性,当仲裁请求的校验和不匹配时,它会使用 CL ALL 发出读取修复,如果超时它会给出此错误消息。

【讨论】:

  • 在使用datastax java驱动时经常出现这个错误。但是在使用 hector 时,不会发生此错误。你能解释一下为什么吗?
猜你喜欢
  • 1970-01-01
  • 2016-07-05
  • 2017-01-09
  • 2018-06-13
  • 2021-11-24
  • 2021-05-07
  • 2018-07-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多