Cassandra读取超时的正确行为是什么?

时间:2018-07-23 23:08:41

标签: 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 read重试,而之后又因相同的异常而失败。

我们验证的是,写入和读取是在同一DC上进行的,而不是在crossDC上进行的(如果这很重要)。同样,在写入之后还会进行读取,并且不会并行发生。

任何有关如何处理此问题的指针?

  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

1 个答案:

答案 0 :(得分:1)

在您跳下悬崖之前,我会如何处理您的情况:

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。)如果没有什么可改善的,并且您仍然遇到超时-即使具有一个一致性,则我建议检查您的cassandra驱动程序,因为它可能具有一些驱动程序端超时参数,并且作为最后的选择,我将更新cassandra.yaml中的range_request_timeout_in_ms和read_request_timeout_in_ms