【问题标题】:Major compaction on Cassandra after changing gc_grace_seconds 10 to 0 day将 gc_grace_seconds 10 更改为 0 天后,Cassandra 上的主要压缩
【发布时间】:2019-06-11 10:38:45
【问题描述】:

我有一个有 gc_grace_seconds 10 天的 Cassandra 集群。自动压缩已启用并根据配置运行,但我怀疑自动压缩不会清除过期 gc_grace_seconds 持续时间(10 天)的墓碑。我计划在该表上运行一次重大压缩,所以我的问题是。

1) 我应该在不更改 gc_grace_seconds 10 天的情况下运行主要压缩吗?

2) 我应该将 gc_grace_seconds 更改为 0 天吗?

3) 如果我将 gc_grace_seconds 更改为 0,那么它是否也适用于未来数据或已经存在的数据以及天数 gc_grace_seconds?

提前致谢。

【问题讨论】:

  • 是什么让您想要清除墓碑,您是否因为它们而出现读取延迟问题?即治疗根本原因而不是症状。墓碑并不坏,只是太多会导致性能问题
  • 是的,我们正面临读取延迟问题。
  • 您能否添加到您的问题:表架构,该表的示例 cfstats 输出,确认您是否在日志中看到墓碑警告消息。示例 cqlsh 跟踪。
  • 您可能还想看看这个博客:academy.datastax.com/support-blog/…

标签: database cassandra cassandra-2.0 cassandra-2.1


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢纳达夫。是的,gc_grace_seconds=0 对 Cassandra 集群有害,也不建议进行主要压缩,但是如果我想在已经设置 gc_grace_seconds 10days 的 Cassandra 集群上运行主要压缩,那么它将清除所有墓碑或在运行主要压缩之前需要设置 0日?在这两种情况下,哪一种非常有用?为什么?
【解决方案2】:

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

【讨论】:

  • 正如您所提到的...更改 gc_grace_seconds 将适用于当前和未来的删除。简单查询:- 我用 gc_grace_seconds 10 天删除了 Cassandra 上的数据。 Cassandra 创建了墓碑并等待 gc_grace_seconds 过期。现在,我在删除后的第二天运行了主要压缩(gc_grace_seconds 到期还剩下 8 天)。 1)什么压缩会做?它将考虑所有墓碑并清除2天前删除的内容? 2) 我应该在运行主要压缩之前更改 gc_grace_seconds=0 吗?
  • 压缩将保留最近更新的数据,并将丢弃所有其他更新(因为 sstables 是不可变的,它包含相同数据的其他更新)。即使您在 gc_grace_seconds 中运行压缩,墓碑也会不被删除。墓碑只有在过期时才会被删除,即如果它们通过了 gc_grace_seconds。因此,如果在第 2 天运行压缩,墓碑将不会被删除,如果您在 10 天后运行压缩,它们将被删除。您可以将 gc_grace_seconds 更改为 0,但如果您有集群并且不建议使用,则会出现数据不一致的情况。
  • 会是什么?如果在第二天更改 gc_grace_seconds 0 并运行主要压缩。它会清除所有删除 2 天前删除的所有墓碑吗?
猜你喜欢
  • 2014-12-25
  • 1970-01-01
  • 2019-11-25
  • 1970-01-01
  • 2019-10-18
  • 2019-07-21
  • 1970-01-01
  • 1970-01-01
  • 2019-10-26
相关资源
最近更新 更多