database - 了解 SSTable 不变性
问题描述
我试图更好地理解 Cassandra 中 sstables 的不变性。当数据存在于 memtable 中时,插入操作或更新/删除操作中会发生什么非常清楚。但是不清楚当我想修改已经被清除的数据时会发生什么。
所以我理解了简单的场景:我执行了一个插入操作,数据被写入一个内存表。当 memtable 已满时,它会被刷新到 sstable。
现在,数据的修改是如何发生的?当我执行删除或更新命令时(数据已被清除)会发生什么?如果 sstable 是不可变的,那么数据将如何被删除/更新?以及 memtable 如何在删除和更新命令中工作(因为它已被清除而在其中不存在的数据)?memtable 将包含什么?
解决方案
在 Cassandra / Scylla 中,你总是追加。意味着任何操作,无论是插入/更新/删除都会为该分区创建一个包含新数据和新时间戳的新条目。在删除操作的情况下,新条目实际上将是一个带有新时间戳的墓碑(表示先前的数据已被删除)。这适用于数据是否仍在内存中(memtable)或已刷新到磁盘 -> sstable 创建。
具有不同数据和不同时间戳的同一分区的多个“版本”可以同时驻留在多个 sstable 中(甚至在内存中)。SStables 将合并持续时间压缩,并且可以应用多种压缩策略。
当gc_grace_period
(默认值:10 天,可调)到期时,在下一次压缩时删除墓碑,这意味着已删除的数据和指示最新操作(删除)的墓碑将不会合并到新的 sstable 中。
内存表的内部实现在 Scylla 和 Cassandra 之间可能略有不同,但为了简单起见,我们假设它是相同的。
欢迎您在以下文档中阅读有关架构的更多信息:
推荐阅读
- java - 如何从类中的 strings.xml 获取字符串?
- asp.net-core - NuGet 包将不会安装
- python - 为什么 np.add.at() 对大型数组返回错误的答案?
- javascript - API 在 HTML 中显示 undefined 而不是值
- c# - 如何从 C# 控制台应用程序自动启动 Zoom 会议
- javascript - 如何删除除 1 条具有消息 ID 的特定消息之外的所有消息?
- r - R中具有重复重复项的列
- c++ - 如何使用指针编写具有可变数量参数的函数?
- python - 根据条件从第一个 df 到另一个 df 的列值
- r - 'closure' 类型的 R-object 不是子集