我试图更好地理解Cassandra中sstables的不变性。很明显,当数据存在于memtable中时,在插入操作或更新/删除操作中会发生什么。但不清楚当我想修改已经刷新的数据时会发生什么。
所以我明白了简单的senario:我执行一个插入操作,数据被写入一个memtable。当memtable满了,它就会被刷新到sstable。
那么,数据的修改是如何发生的呢?当我执行删除或更新命令时(当数据被刷新时)会发生什么?如果sstable是不可变的,那么数据如何被删除/更新?memtable在删除和更新命令中是如何工作的(因为它已经被刷新了,所以不存在于其中的数据)?memtable将包含什么?
1条答案
按热度按时间zzoitvuj1#
在Cassandra / Scylla中,你总是添加。这意味着任何操作,无论是插入/更新/删除,都将为该分区创建一个包含新数据和新时间戳的新条目。在删除操作的情况下,新条目实际上将是具有新时间戳的墓碑(指示先前的数据被删除)。这适用于数据是否仍然在内存中(memtable)或已经刷新到磁盘-> sstable created。
具有不同数据和不同时间戳的同一分区的几个“版本”可以同时驻留在多个sstable中(甚至在内存中)。SStables将在压缩过程中合并,并且可以应用几种压缩策略。
当
gc_grace_period
(默认值:10天,可调)已经过期,在下一次压缩时,该tombstone将被删除,这意味着被删除的数据和指示最新操作(删除)的tombstone将不会合并到新的sstable中。Scylla和Cassandra的memtables的内部实现可能略有不同,但为了简单起见,我们假设它是相同的。
欢迎您在以下文档中阅读有关该架构的更多信息: