在 Cassandra 里,一次删除其实是一次写入(而读取为此买单)
来源:dev.to — 2026-08-23
📋 概述
在 Cassandra 中 DELETE 并不真正移除数据,而是写入一个墓碑标记,声明"这段数据在时间戳 T 已经死了",真正的清除要等到合并且过了宽限期之后。墓碑之所以必须存在,是为了防止"僵尸数据":分布式系统里如果一个副本在删除时掉线,稍后恢复时它仍持有已删的行,修复机制会把旧数据复制回所有节点。墓碑必须在默认 gc_grace_seconds(十天)内存活才能被清除,这是你修复离线副本的时间窗口。而每次读取都要在请求范围内处理所有墓碑,一个积累了百万墓碑的分区意味着返回任何活数据前都要处理百万个死单元格,超过 100000 阈值就会抛 TombstoneOverwhelmingException 让查询失败,以免把节点内存耗尽。这些阈值是护栏而非调优旋钮。
🔑 核心要点
- DELETE 在 Cassandra 里只是写入一个墓碑标记,真正清除发生在合并并过了宽限期之后。
- 墓碑能防止删除的行被修复机制当成缺失数据复制回所有节点(僵尸数据)。
- 读取必须处理请求范围内的所有墓碑,一个百万墓碑的分区会让读取被迫处理百万个死单元格。
- 超过 tombstone_failure_threshold(默认 100000)时查询会以 TombstoneOverwhelmingException 中止,以免拖垮节点。
💡 金句
这些阈值是护栏,不是调优旋钮——抬高它们只是在治疗症状,而保留着病根。
👍 0
👎 0
← 返回 dev.to 首页