首页 文章

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

提问于
浏览
1

我们的设置是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而不是crossDC(如果这很重要) . 写入之后的读取也不会并行发生 .

有什么指示我们应该如何处理这个?

  • 我们应该用LOCAL_QUORUM重试几次吗?

  • 我们应该增加时间吗?

  • 我们应该跳下悬崖吗?

任何建议将不胜感激 .

表模式如下:

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 回答

  • 1

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

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

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

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

相关问题