我有一个Cassandra群集,该群集的gc_grace_seconds为10天。自动压缩已启用并按照配置运行,但是我怀疑自动压缩无法清除已过期gc_grace_seconds持续时间(10天)的逻辑删除。我打算在该表上进行一次大型压实,这样我的问题就可以了。
1)我是否应该在不更改gc_grace_seconds 10天的情况下进行大型压缩?
2)我应该在0天内更改gc_grace_seconds来进行大型压缩吗?
3)如果我将gc_grace_seconds更改为0,那么它适用于将来的数据还是gc_grace_seconds天的现有数据?
谢谢。
答案 0 :(得分:1)
首先,除非在单节点群集上,否则不应将gc_grace_seconds设置为0。如果将gc_grace_seconds设置为某个时间段,则必须在每个这样的时间段中至少运行一次 repair ,否则就有复活数据的风险-当集群中的一个节点错过删除操作时,会发生这种情况。节点删除了它们的墓碑,因此以后的修复将认为数据是新数据,而不是意识到它已被删除。如果将gc_grace_seconds设置为0,则以前删除的任何数据都可能在下次修复时恢复,如果该数据恰好位于其中一个副本上(因为该特定副本由于某些暂时性问题而错过了删除操作)。>
所以是的,正确的方法是使用原始gc_grace_seconds为10天运行一次大压缩(并确保至少每10天进行一次修复)。
但是您需要考虑为什么根本要运行大型压缩。较小的压缩是否可以消除旧的(过去10天)墓碑取决于很多因素,例如您最近是否对这些墓碑所在的分区进行了其他修改。但是除非墓碑引起了您的重大问题(大量的磁盘空间,读取速度较慢等),进行大型压缩可能不值得。大型压缩不是免费的,并且在压缩之后(至少在大小分层压缩策略中),所有数据都位于一个文件中,并且需要更长的时间才能再次进行压缩。
答案 1 :(得分:1)
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中的墓碑。