了解 SSTable 不变性

Posted

技术标签:

【中文标题】了解 SSTable 不变性【英文标题】:Understanding SSTable immutiability 【发布时间】:2018-06-23 11:44:42 【问题描述】:

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

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

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

【问题讨论】:

这一切都在这里描述:docs.datastax.com/en/dse/6.0/dse-arch/datastax_enterprise/… 【参考方案1】:

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

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

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

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

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

SStables

Compaction strategies

【讨论】:

以上是关于了解 SSTable 不变性的主要内容,如果未能解决你的问题,请参考以下文章

万字长文使用 LSM Tree 思想实现一个 KV 数据库

06-Leveldb实现-sstable

06-Leveldb实现-sstable

06-Leveldb实现-sstable

SSTable多个目录

LevelDB 源码剖析SSTable模块:SSTableBlock布隆过滤器LRU Cache