执行超GC宽限期TIMESTAMP的Scylla CQL DELETE的墓碑及数据复现疑问
Cassandra带过期时间戳的DELETE操作问题解答
1. 是否会生成墓碑?
会生成墓碑,但这个墓碑的时间戳T(示例中的1月1日)早于GC宽限期的计算阈值(当前1月10日,GC宽限期5天,阈值为1月5日)。当集群执行压缩(compaction)操作时,这个墓碑会被判定为过期墓碑,直接被清理,不会长期留存。
2. 是否会导致数据复现?
是的,存在数据复现的风险。原因有两点:
- 如果集群副本中还存在该数据的旧版本(时间戳晚于
T但早于当前时间),墓碑被清理后,这些旧版本数据会在读取时被正常返回,相当于数据“复现”。 - 若有节点在执行DELETE时离线,恢复后同步数据时,该过期墓碑可能已经被清理,导致该节点上的旧数据未被标记删除,最终被读取到。
3. 使用一致性级别ALL执行也会如此吗?
即使指定一致性级别ALL,结果依然相同。ALL仅能保证DELETE操作被所有副本确认执行,但生成的墓碑时间戳还是T(早于GC阈值)。后续压缩时墓碑仍会被清理,只要副本上存在时间戳晚于T的旧数据,就依然可能出现数据复现的情况。
示例验证
GC宽限期为5天,当前日期1月10日,DELETE操作使用1月1日的时间戳。此时GC阈值为1月10日减去5天,即1月5日。由于1月1日早于1月5日,生成的墓碑会在压缩时被清理。如果副本上存在1月2日至1月4日的数据版本,这些数据会在墓碑清理后重新被读取,导致数据复现。
内容的提问来源于stack exchange,提问作者Rado Buransky
相关产品推荐
相关产品推荐

