从cassandra读取时,一致性水平会发生变化

时间:2016-02-22 12:58:45

标签: cassandra cql datastax datastax-java-driver

我有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状态中,它显示所有节点都在up&正常。我怎么能克服这个?一致性级别如何更改为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);

1 个答案:

答案 0 :(得分:3)

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

正如我从第二期看到的那样,它已在2.0.12和2.1.3中得到修复,因此您可能希望更新版本。

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