将gc_grace_seconds 10天更改为0天后,对Cassandra进行了重大压缩

时间:2019-01-17 09:07:55

标签: database cassandra cassandra-2.0 cassandra-2.1

我有一个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天的现有数据?

谢谢。

2 个答案:

答案 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中的墓碑。