磁盘 space 对 scylla/cassandra 中令牌范围的压缩要求

Disk space requirement for compaction on a token range in scylla/cassandra

我在 Scylla 数据库中使用 SizeTieredCompaction 策略。我删除了特定标记范围内的一半数据(比方说 x 到 y)。我的 gc_grace_seconds 设置为 6 小时。我想摆脱在这个令牌范围内创建的所有墓碑。如果在 gc_grace_seconds 过去后我在集群中的所有节点上 运行 nodetool compact --start-token x --end-token y keyspace table,会发生什么?它会删除墓碑吗?它会消耗多少磁盘space?它会和 nodetool compact major compaction 一样需要多 50% space 吗?

要删除墓碑,您还需要 运行 nodetool repair。有关修复过程的详细信息,请参阅 here。基本上修复比较节点之间的数据,以便墓碑可以安全地过期。 压缩所需的 space 取决于具体的工作负载,如果没有有关您的工作负载的数据,则无法提供答案。但考虑到安全边际,2x 是一个安全的赌注。完全压缩后,使用的 space 将最少,因为每个节点上只保存 1 个数据副本。

Scylla 的 nodetool compact 文档(参见 https://docs.scylladb.com/operating-scylla/nodetool-commands/compact/) doesn't even the token range option, unfortunately. But the Cassandra documentation (https://cassandra.apache.org/doc/latest/operating/compaction/index.html)解释了 so-called sub-range 压缩 的作用:

It is possible to only compact a given sub range - this could be useful if you know a token that has been misbehaving - either gathering many updates or many deletes. (nodetool compact -st x -et y) will pick all sstables containing the range between x and y and issue a compaction for those sstables. For STCS this will most likely include all sstables but with LCS it can issue the compaction for a subset of the sstables.

对于 STCS,常见的情况是所有 sstables 都有来自整个令牌环的令牌,因此您的 nodetool compact 调用通常会调用所有 sstables 的完整主要压缩。令牌范围选项可能不会免除任何 sstables 被压缩。因此,临时磁盘 space 开销将与 STCS 一样:在压缩结束时,您同时拥有旧的 sstables 和新的 sstables。你假设新的只有原始数据的一半,所以新的 sstable 将是旧 sstable 总大小的一半左右,所以这可能是你问的“50%”。