了解SSTable的不可变性

时间:2018-06-23 11:44:42

标签: database cassandra nosql bigdata

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

因此,我了解一个简单的方法:我执行插入操作并将数据写入到内存表中。当内存表已满时,它将刷新为sstable。

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

1 个答案:

答案 0 :(得分:5)

在Cassandra / Scylla中,您总是会添加。意味着任何操作,无论是插入/更新/删除,都会为该分区创建一个包含新数据和新时间戳记的新条目。如果执行删除操作,则新条目实际上将是带有新时间戳记的墓碑(指示先前的数据已删除)。无论数据仍在内存中(内存表)还是已刷新到磁盘->创建的sstable,都适用。

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

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

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

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