我有一个Cassandra集群,其gc_grace_seconds为10天。自动压缩已启用并按配置运行,但我怀疑自动压缩不会清除过期的gc_grace_seconds持续时间(10天)的逻辑删除。我计划在那张桌子上进行一次重大的压缩,所以我的问题是。
1)我应该在不更改gc_grace_seconds 10天的情况下运行主要压缩吗?
2)我应该运行主要压缩改变gc_grace_seconds 0天?
3)如果我要更改gc_grace_seconds 0,那么它是否适用于将来的数据或已存在的数据,天数为gc_grace_seconds?
提前致谢。
首先,除非在单节点集群上,否则不应将gc_grace_seconds设置为0。如果将gc_grace_seconds设置为某个句点,则必须在每个此类句点中至少运行一次修复,否则您将面临数据复活的风险 - 当群集中的一个节点错过删除,而其他节点丢弃其逻辑删除时会发生这种情况,因此以后修复会认为数据是新的并且没有意识到它已经被删除了。如果您将gc_grace_seconds设置为0,那么您之前删除的任何数据都可能在下次修复时复活,如果数据恰好位于其中一个副本上(因为此特定副本由于某些临时问题而错过了删除)。
所以,是的,正确的方法是使用10天的原始gc_grace_seconds进行主要压缩(并确保至少每10天进行一次修复)。
但是你需要考虑为什么要运行一个主要的压缩。轻微压实是否可以摆脱旧的(过去10天)墓碑取决于很多因素,例如你最近是否对这些墓碑所在的同一分区进行了其他修改。但除非墓碑造成重大问题(大量的磁盘空间,较慢的读取等),可能不值得做一个主要的压缩。主要压缩不是免费的,并且(至少在大小分层的压缩策略中)之后,所有数据都位于一个文件中,并且需要更长时间才能再次压缩。
1)我应该在不更改gc_grace_seconds 10天的情况下运行主要压缩吗?
是。如果设置为0,则逻辑删除将不会传播到群集中的其他节点。这导致数据不一致。
3)如果我要更改gc_grace_seconds 0,那么它是否适用于将来的数据或已存在的数据,天数为gc_grace_seconds?
如果更改gc_grace_seconds,它将适用于将来的数据以及当前数据。
如果你想通过压缩清除墓碑我有两个选择
1)nodetool compact -s keyspace table
这将压缩表并创建50%-25%-12.5%的sstables,依此类推
2)nodetool compact --user-defined path/to/sstable
这将清除上面提到的sstable中的墓碑。