跳到主要内容

日志压缩

当 Garnet 配置为使用存储(通过 EnableStorageTier--storage-tier)运行时,不适合内存的数据将溢出到磁盘存储。磁盘上的数据被分成段,每个段对应一个物理文件。每个段的大小通过 SegmentSize 或主存储的 --segment,以及对象存储的 ObjectStoreSegmentSize--obj-segment 进行配置。

文件段会随着时间的推移不断创建和添加,因此我们需要一种方法来删除旧的段。这就是压缩发挥作用的地方。

触发压缩

您可以配置 CompactionFrequencySecs--compaction-freq,这将创建一个任务,定期唤醒以尝试进行压缩。如果磁盘上的段数超过 CompactionMaxSegments--compaction-max-segments,压缩将使用指定的策略运行,以使活动段数最多为 CompactionMaxSegments。最旧的段是我们选择的压缩候选段。对于对象存储,对应的开关是 ObjectStoreCompactionMaxSegments--obj-compaction-max-segments

压缩策略

用于压缩的候选段将使用某种策略进行处理,该策略通过 CompactionType--compaction-type 开关指定。可用选项有:

  • None:不执行压缩。
  • Shift:非活动段仅被标记为准备删除。
  • Scan:扫描整个日志,检查要压缩的候选段中的哪些记录是“活动”的,并将这些活动记录复制到日志的尾部(在内存中)。
  • Lookup:对于要压缩的候选段中的每条记录,我们执行一次随机查找以检查它是否是活动的。和之前一样,活动记录被复制到日志的尾部(在内存中)。

段删除

在对候选段应用压缩策略后,它们将变为非活动状态并符合删除条件。然而,默认情况下,非活动段不会立即从磁盘中删除,因为如果服务器在进行下一次检查点之前崩溃(并且 AOF 被禁用),这样做可能导致数据丢失。相反,下一次检查点将自动导致非活动段的删除。

如果您不进行检查点,并希望在应用压缩策略后立即强制物理删除非活动段,您可以指定覆盖 CompactionForceDelete--compaction-force-delete 开关。请注意,如果 AOF 被禁用,此选项可能导致我们在恢复到上一个检查点时丢失数据。