首页 > 解决方案 > Cassandra 读取超时的正确行为是什么?

问题描述

我们的设置是 6 个节点,每个 DC 3 个,每个 DC 3 路复制。我们使用 EACH_QUORUM 编写。尝试使用 LOCAL_QUORUM 阅读。

有时,我们会收到带有错误的读取超时:

com.datastax.driver.core.exceptions.ReadTimeoutException: Cassandra time out during read query at consistency ALL (6 responses were required but only 5 replica responded)

我们发现这个错误实际上并不意味着它所说的 CASSANDRA-7947​​ 。相反,这意味着触发了读取修复并且未能及时完成。

当我们因此异常而失败时,我们实际上会使用 QURUM 读取重试,但稍后会因相同的异常而失败。

我们验证的是写入和读取发生在同一个 DC 而不是跨 DC(如果这很重要)。此外,读取跟在写入之后,并且不会并行发生。

关于我们应该如何处理这个问题的任何指针?

  1. 我们是否应该使用 LOCAL_QUORUM 重试几次?
  2. 我们应该增加超时吗?
  3. 我们应该跳下悬崖吗?

任何建议将不胜感激。

表模式是这样的:

CREATE TABLE records (
    firstKey text,
    secondKey text,
    data blob,
    PRIMARY KEY (firstKey, secondKey)
) WITH read_repair_chance = 0.0
   AND dclocal_read_repair_chance = 0.1
   AND gc_grace_seconds = 864000
   AND bloom_filter_fp_chance = 0.01
   AND caching = { 'keys' : 'ALL', 'rows_per_partition' : 'NONE' }
   AND comment = ''
   AND compaction = { 'class' : 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy', 'max_threshold' : 32, 'min_threshold' : 4 }
   AND compression = { 'chunk_length_in_kb' : 64, 'class' : 'org.apache.cassandra.io.compress.LZ4Compressor' }
   AND default_time_to_live = 432000
   AND speculative_retry = '99PERCENTILE'
   AND min_index_interval = 128
   AND max_index_interval = 2048
   AND crc_check_chance = 1.0
   AND cdc = false;

查询超时:

select * from records where firstKey=XXXXXXX

标签: cassandra

解决方案


在你跳下悬崖之前,我会在你的情况下做什么:

1.) 尝试使用 LOCAL_QUORUM 读取,如果失败,请使用 LOCAL_QUORUM 甚至使用 ONE 一致性级别重试。QUORUM 比 LOCAL_QUORUM 强,所以我不认为在这种情况下重试具有更强的一致性级别会有所帮助。您在使用 EACH_QUORUM 写入时具有很强的一致性,因此取决于您的复制因子 - 如果它真的是 3,那么您的读取也应该与 ONE 一致。https://docs.datastax.com/en/cassandra/3.0/cassandra/dml/dmlConfigConsistency.html

2.) 我还会研究如何获取数据,例如一次获取大量数据也会导致超时。

3.)如果没有什么需要改进的并且您仍然遇到超时 - 即使具有 ONE 一致性,那么我建议检查您的 cassandra 驱动程序,因为它可能有一些驱动程序端超时参数,作为最后的手段,我会更新 range_request_timeout_in_ms 和cassandra.yaml 中的 read_request_timeout_in_ms


推荐阅读