为什么我在Cassandra表中读了许多墓碑,尽管我的访问模式应该避免它们
题
我知道这不是使用cassandra的最佳方式,但我的数据类型需要从上周阅读所有数据。但是,在CQL3中使用集合类型时,我遇到了某些限制,防止我执行正常的日期范围查询。
所以我已经设置了Cassandra(目前单个节点,在将来可能更多)与下表CREATE TABLE cache (tag text, id int, tags map<text,text>,
PRIMARY KEY (tag, id) );
ALTER TABLE cache WITH GC_GRACE_SECONDS = 0;
.
我在一周内插入TTL以自动从缓存中删除项目。
我试图遵循本文避免通过选择”最小ID“来读取许多墓碑,我在其他地方持续到避免阅读旧数据:
SELECT * FROM cache WHERE tag = ? AND id >= ?
.
ID基本上是某种时间戳,即不断增加,即,我只在时间上插入更高的值,并不断从表中删除较旧的ID。
但我仍然会得到关于达到阈值的警告
WARN 08:59:06,286 Read 5001 live and 5702 tombstoned cells in cache (see tombstone_warn_threshold)
.
,如果我不经常运行手动压缩/擦洗,我会得到例外,查询失败。
但是,然而,基于我的文章和文档的理解,我应该避免大多数古迹在这里,因为我在标签的平等上查询的那样,这允许Cassandra只寻找那些区域,我使用允许的最小ID Cassandra只在大多数墓碑后开始阅读,所以为什么仍有墓碑警告/例外报告?
解决方案
map k / v配对实际上是列(名称,值和时间戳):所以,如果您发出了大量删除的地图元素(通过TTL到期也是如此) - 这是此的源头警告。因为你仍在阅读完整的地图(有很多墓碑上)。此外,地图上的TTL设置应用于每个元素。
第二,在SELECT查询中乘以>=谓词。
如果是这种情况,您应该重新汇定您的数据访问模式,仅使用EQ关系在选择查询和Bump FirmoDicetagcode中更频繁地使用。此外,此访问模式将允许您摆脱主键的群集部分。
所以,如果您在该地图上发出大量删除,则可以尝试使用id
模型并按时间精确地切片。
不隶属于 StackOverflow