我们是否需要 运行 使用 Leveled 压缩策略和 SIzeTiered 压缩策略进行手动压缩

Do we need to run manual compaction with Leveled compaction strategy and SIzeTiered compaction strategy

我们有几个表具有 Leveled 压缩策略和 SizeTiered 压缩策略。我们需要多久 运行 压缩一次?提前致谢

TL;DR

压缩 运行 自己进行(只要您没有在 yaml 中禁用自动压缩)。

压缩 - 它是什么?

根据 cassandra 写入路径,我们定期将 memtables 刷新到磁盘到不可变的 SSTables(排序字符串表)中。当您更新现有单元格时,它最终会写入 sstable 中。可能与原始记录不同。当我们阅读时,有时 C* 必须扫描各种 sstables(通过一些优化,请参阅布隆过滤器)以找到单元格的最新版本。在 Cassandra 中,最后写入为准。

Compaction 获取 sstables 并将它们压缩在一起,删除重复数据,以优化读取。这是一个自动操作,尽管您可以或多或少地 tune compactions 到 运行。

Compaction 的一些有用细节

Size tiered 压缩是 cassandra 中默认的压缩策略,它会寻找相同大小的 sstables 并在找到足够大小时将它们压缩在一起(默认为 4 个)。 Size tiered 比 leveled 的 IO 密集度低,并且当你有更小的盒子和旋转驱动器时通常会更好。

Leveled 压缩针对读取进行了优化,当您读取繁重的工作负载或具有大量更新水平的严格读取 SLA 时可能有意义。 Leveled compaction 是更多的 IO 和 CPU 密集型,因为您花费更多的周期来优化读取,但读取本身应该更快并且命中更少的 SStables。当您首次启用这些或工作负载增加时,请密切关注 nodetool compaction stats 中的 io wait 和挂起的压缩。

压缩可调参数/杠杆

多线程压缩 - 关闭它,开销大于收益。到它在 C* 2.1 中被删除的地步。

concurrent compactors - 现在默认为 2,过去默认为核心数,这是一个错误的默认值。如果你在 2.0 分支上而不是 运行 最新的 DSE 检查这个默认值并考虑将它减少到 2。这是你可以 运行(不同列族)的同时压缩任务的数量。

Compaction throttling - 一种限制压缩占用的资源量的方法。您可以使用 nodetool getcompactionthresholdnodetool setcompactionthreshold 即时调整它。您希望将其调整到不累积挂起任务的程度。 0 --> 无限。 Unlimited 通常不是最快的设置,因为系统可能会陷入困境。