为什么我在Cassandra表中读了许多墓碑,尽管我的访问模式应该避免它们

StackOverflow https://stackoverflow.com//questions/24053860

  •  21-12-2019
  •  | 
  •  

我知道这不是使用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模型并按时间精确地切片。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top