首页 > 解决方案 > 了解 SSTable 不变性

问题描述

我试图更好地理解 Cassandra 中 sstables 的不变性。当数据存在于 memtable 中时,插入操作或更新/删除操作中会发生什么非常清楚。但是不清楚当我想修改已经被清除的数据时会发生什么。

所以我理解了简单的场景:我执行了一个插入操作,数据被写入一个内存表。当 memtable 已满时,它会被刷新到 sstable。

现在,数据的修改是如何发生的?当我执行删除或更新命令时(数据已被清除)会发生什么?如果 sstable 是不可变的,那么数据将如何被删除/更新?以及 memtable 如何在删除和更新命令中工作(因为它已被清除而在其中不存在的数据)?memtable 将包含什么?

标签: databasecassandranosqlbigdata

解决方案


在 Cassandra / Scylla 中,你总是追加。意味着任何操作,无论是插入/更新/删除都会为该分区创建一个包含新数据和新时间戳的新条目。在删除操作的情况下,新条目实际上将是一个带有新时间戳的墓碑(表示先前的数据已被删除)。这适用于数据是否仍在内存中(memtable)或已刷新到磁盘 -> sstable 创建。

具有不同数据和不同时间戳的同一分区的多个“版本”可以同时驻留在多个 sstable 中(甚至在内存中)。SStables 将合并持续时间压缩,并且可以应用多种压缩策略。

gc_grace_period(默认值:10 天,可调)到期时,在下一次压缩时删除墓碑,这意味着已删除的数据和指示最新操作(删除)的墓碑将不会合并到新的 sstable 中。

内存表的内部实现在 Scylla 和 Cassandra 之间可能略有不同,但为了简单起见,我们假设它是相同的。

欢迎您在以下文档中阅读有关架构的更多信息:


推荐阅读