原理

RocksDB除了根据需要自动触发compaction外,还能通过接口手动触发compaction,这个功能称之为。其提供了接口,如下:

对应地,Pegasus对该功能在上层进行了封装,提供了表级别的Manual Compact功能,其作用是:

  • 通过compaction去掉垃圾数据,减少数据量,降低文件层数,提升读操作的性能。
  • 对最高层做compaction,可以清理掉Delete标记数据。
  • 配合Usage Scenario功能中表的bulk_load模式,可以在灌数据完成后执行一次Manual Compact,去除垃圾数据,整理数据和文件夹结构,提升读性能。 实现方式:

  • 利用,来设置两类Manual Compect的环境变量:

    • 单次Manual Compact:
      • manual_compact.once.trigger_time:格式为Unix时间戳的秒数,可通过shell命令date +%s获取当前时间戳。如果LastManualCompactFinishTime旧于该trigger_time,就触发Manual Compaction的执行。
      • manual_compact.once.target_level:用于设置CompactRangeOptions::target_level。如果不设置,则使用默认值-1。
      • manual_compact.once.bottommost_level_compaction:可设置为skip或者force。如果是,则不对最高层做compaction;如果是force,则强制对最高层做compaction。如果不设置,则默认为skip
    • 周期Manual Compact:
      • manual_compact.periodic.target_level:用于设置CompactRangeOptions::target_level。如果不设置,则使用默认值-1。
      • manual_compact.periodic.bottommost_level_compaction:可设置为skip或者。如果是skip,则不对最高层做compaction;如果是force,则强制对最高层做compaction。如果不设置,则默认为skip
    • Manual Compact总开关:
      • manual_compact.disabled(从1.9.0版本开始支持):如果为true,则关闭Manual Compact功能,并且取消正在执行中的Manual Compact动作。如果不设置,默认为false。
      • manual_compact.max_concurrent_running_count(从开始支持):指定最大并发数。实际上,可执行的最大并发数由该env参数服务端MANUAL_COMPACT_THRAD_POOL的线程数共同决定,取两者的较小值。 注意:
  • Manual Compact功能是分派到独立的Compact线程池中执行的,每个线程同一时刻只能处理一个replica的full compaction,因为并发处理量与Compact线程池的线程数量有关,可以通过配置文件的worker_count进行配置,如果使用Manual Compact比较频繁,建议调大线程数量(譬如设置为cpu core数量接近):

  • Manual Compact过程中可能需要较多的额外磁盘空间。因为compaction前后文件变化较大,而Pegasus一般又会保留最近3个版本的checkpoint,所以基本上额外需要的磁盘空间量大约等于执行Manual Compact的表的数据存储量。所以,在执行Manual Compact前需确认集群有足够的存储空间,同时在执行过程中关注磁盘空间使用情况,避免因为磁盘空间耗尽导致集群节点宕机,影响集群可用度。

如何设置

既然Manual Compact功能是利用触发的,那么可以直接通过shell功能的set_app_envs命令来设置。需要设置的环境变量参照上面的描述,环境变量设置后不会立即生效,大约需要等几十秒后才能在所有replica上生效。

通过脚本设置

我们提供了一个脚本工具scripts/pegasus_manual_compact.sh来方便地设置,用法:

该工具不仅会调用shell命令设置Table环境变量,对于once类型还会等待所有的replica上的操作都执行完成,使用起来十分方便。

譬如,在完成后执行once manual compact如下: