了解 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 不变性的主要内容,如果未能解决你的问题,请参考以下文章