cassandra - 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(如果这很重要)。此外,读取跟在写入之后,并且不会并行发生。
关于我们应该如何处理这个问题的任何指针?
- 我们是否应该使用 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.) 尝试使用 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
推荐阅读
- eclipse - eclipse 3.8.1 cdt 8.6.0,从索引器中排除特定的系统头文件
- python - 如何在python中删除特定的csv行?
- node.js - Node.js - 由于 .msi,无法安装它显示错误
- java - JAVA,setter 没有将值发送到我的构造函数程序返回零
- matlab - 如何从 MATLAB 中的包函数生成 MEX?
- java - 请帮助我理解这个 JUnit 考试问题
- verilog - 综合中超出循环迭代限制但仿真中未超出
- python - PyQt5 QWidget 在@classmethod 中调用时不显示
- ios - 如何在没有应用商店的情况下发布我的 ios 应用程序?
- google-chrome - 检查 chrome 开发者工具