我们的设置是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.)尝试使用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