在将gc_grace_seconds改为10到0天后对Cassandra进行重大压缩

问题描述 投票:2回答:2

我有一个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?

提前致谢。

database cassandra cassandra-2.0 cassandra-2.1
2个回答
1
投票

首先,除非在单节点集群上,否则不应将gc_grace_seconds设置为0。如果将gc_grace_seconds设置为某个句点,则必须在每个此类句点中至少运行一次修复,否则您将面临数据复活的风险 - 当群集中的一个节点错过删除,而其他节点丢弃其逻辑删除时会发生这种情况,因此以后修复会认为数据是新的并且没有意识到它已经被删除了。如果您将gc_grace_seconds设置为0,那么您之前删除的任何数据都可能在下次修复时复活,如果数据恰好位于其中一个副本上(因为此特定副本由于某些临时问题而错过了删除)。

所以,是的,正确的方法是使用10天的原始gc_grace_seconds进行主要压缩(并确保至少每10天进行一次修复)。

但是你需要考虑为什么要运行一个主要的压缩。轻微压实是否可以摆脱旧的(过去10天)墓碑取决于很多因素,例如你最近是否对这些墓碑所在的同一分区进行了其他修改。但除非墓碑造成重大问题(大量的磁盘空间,较慢的读取等),可能不值得做一个主要的压缩。主要压缩不是免费的,并且(至少在大小分层的压缩策略中)之后,所有数据都位于一个文件中,并且需要更长时间才能再次压缩。


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

© www.soinside.com 2019 - 2024. All rights reserved.