日志压缩
当 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 被禁用,此选项可能导致我们在恢复到上一个检查点时丢失数据。