首页 文章

Cassandra查询超时,在明确指定为LOCAL_QUORUM时将一致性视为ALL

提问于
浏览
2

Cassandra查询超时选择查询:

SELECT x, y FROM <table> WHERE unique_id= <value>

有这个特例

com.datastax.driver.core.exceptions.ReadTimeoutException: Cassandra timeout during read query at consistency ALL (3 responses were required but only 2 replica responded)
    at com.datastax.driver.core.exceptions.ReadTimeoutException.copy(ReadTimeoutException.java:88)
    at com.datastax.driver.core.exceptions.ReadTimeoutException.copy(ReadTimeoutException.java:25)
    at com.datastax.driver.core.DriverThrowables.propagateCause(DriverThrowables.java:37)
    at com.datastax.driver.core.DefaultResultSetFuture.getUninterruptibly(DefaultResultSetFuture.java:245)

Cassandra 司机:

<dependency>
    <groupId>com.datastax.cassandra</groupId>
    <artifactId>cassandra-driver-core</artifactId>
    <version>3.5.0</version>
</dependency>

我们的查询代码:

QueryOptions queryOptions = new QueryOptions();
    queryOptions.setSerialConsistencyLevel(ConsistencyLevel.LOCAL_SERIAL);
    queryOptions.setConsistencyLevel(ConsistencyLevel.LOCAL_QUORUM);

    List<String> contactPoints = Utils
        .getArrayStrings(config, Constants.CASSANDRA_CONTACT_POINTS);

    Cluster cluster = Cluster.builder()
        .addContactPoints(contactPoints.toArray(new String[contactPoints.size()]))
        .withQueryOptions(queryOptions)
        .withProtocolVersion(ProtocolVersion.V4)
        .build();

    Session session = cluster.connect();
    session.executeAsync(SELECT_STATEMENT).bind()
                .setUUID(0, UUID.fromString(inputEvent.getUniqueId()))

当我们将查询选项一致性设置为LOCAL_QUORUM时,为什么将一致性视为ALL?

2 回答

  • 0

    它看起来非常像CASSANDRA-7947,如果在触发读取修复的查询中发生超时(用 ALL 执行),则报告为 ALL 而不是原始 LOCAL_QUORUM . 虽然这个bug应该已经在2.0.12 / 2.1.3中修复了......

  • 0

    我们在 生产环境 环境中遇到了同样的问题 . 看起来它与此处描述的读取修复过程有关CASSANDRA-10726 . 另外在这个重复的CASSANDRA-14480 bug中,其他人都有确切的行为 .

    我们在切换到多DC环境后才注意到这个错误 .

    我们正在使用这个版本:

    Cassandra:3.0.15 DSE:5.0.12 Java驱动程序:3.1.4

相关问题