我试图更好地理解cassandra中sstables的不变性。很明显,当数据存在于MeMeTabe中时,插入操作或更新/删除操作中发生了什么。但不清楚当我想修改已经被清除的数据时会发生什么。
所以我理解这个简单的senario:我执行一个insert操作,数据被写到memtable中。当memtable已满时,它将刷新到sstable。
现在,如何修改数据?当我执行delete或update命令时(当数据被刷新时),会发生什么情况?如果sstable是不可变的,那么如何删除/更新数据?MeMeTabe在删除和更新命令中如何工作(因为它已被刷新而不存在于数据中)?memtable将包含什么?
最佳答案
在卡桑德拉/锡拉你总是附加。这意味着任何操作,无论是insert/update/delete,都将为包含新数据和新时间戳的分区创建一个新条目。在delete操作的情况下,新条目实际上是一个带有新时间戳的墓碑(表示以前的数据已被删除)。无论数据仍在内存(memtable)中,还是已经刷新到磁盘->sstable created,这都适用。
具有不同数据和时间戳的同一分区的多个“版本”可以同时驻留在多个sstable(甚至内存中)。sstables将被合并持续时间压缩,并且有几个压缩策略可以应用。
当gc_grace_period
(默认值:10天,可调)过期时,在下一次压缩时,将删除tombstone,这意味着已删除的数据和指示最新操作(delete)的tombstone将不会合并到新的sstable中。
memtables的内部实现在scylla和cassandra之间可能略有不同,但是为了简单起见,我们假设它是相同的。
欢迎您在以下文档中阅读有关体系结构的更多信息:
SStables
Compaction strategies
关于database - 了解SSTable的不可变性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51000833/