从 cassandra 读取时一致性级别发生变化
Consistency level changes while reading from cassandra
我有 10 个节点的 cassandra 集群,复制因子为 {DC1:3,DC2:2}。 DC1 在 rack1 中有 6 个节点,DC2 在 rack1 中有 4 个节点。我正在发出一致性级别为 LocalQuorum 的读取请求。即使我在每个查询中都设置了一致性级别,有时它 returns 会出现以下错误,
com.datastax.driver.core.exceptions.ReadTimeoutException: Cassandra
timeout during read query at consistency ALL (5 responses were
required but only 3 replica responded)
我使用的是 cassandra 2.0.9 和 datastax java 驱动程序版本 2.0.5。在 nodetool status 中,它显示所有节点都正常运行。我怎样才能克服这个?一致性级别如何更改为全部?
集群建设:
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);
您的问题看起来很像 JIRA ISSUE 7868 which leads to JIRA ISSUE 7947,因为查看您的代码我没有发现任何错误。
正如我从第二期看到的那样,它已在 2.0.12 和 2.1.3 中修复,因此您可能需要更新版本。
我们遇到了同样的问题,基本上错误消息具有误导性,当仲裁请求的校验和不匹配时,它会使用 CL ALL 发出读取修复,如果超时,它会给出此错误消息。
我有 10 个节点的 cassandra 集群,复制因子为 {DC1:3,DC2:2}。 DC1 在 rack1 中有 6 个节点,DC2 在 rack1 中有 4 个节点。我正在发出一致性级别为 LocalQuorum 的读取请求。即使我在每个查询中都设置了一致性级别,有时它 returns 会出现以下错误,
com.datastax.driver.core.exceptions.ReadTimeoutException: Cassandra timeout during read query at consistency ALL (5 responses were required but only 3 replica responded)
我使用的是 cassandra 2.0.9 和 datastax java 驱动程序版本 2.0.5。在 nodetool status 中,它显示所有节点都正常运行。我怎样才能克服这个?一致性级别如何更改为全部?
集群建设:
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);
您的问题看起来很像 JIRA ISSUE 7868 which leads to JIRA ISSUE 7947,因为查看您的代码我没有发现任何错误。
正如我从第二期看到的那样,它已在 2.0.12 和 2.1.3 中修复,因此您可能需要更新版本。
我们遇到了同样的问题,基本上错误消息具有误导性,当仲裁请求的校验和不匹配时,它会使用 CL ALL 发出读取修复,如果超时,它会给出此错误消息。