Compaction

本文介绍Compaction的相关信息。

Nebula Graph中,Compaction是最重要的后台操作,对性能有极其重要的影响。

Compaction操作会读取硬盘上的数据,然后重组数据结构和索引,然后再写回硬盘,可以成倍提升读取性能。将大量数据写入Nebula Graph后,为了提高读取性能,需要手动触发Compaction操作(全量Compaction)。

Nebula Graph有两种类型的Compaction操作:自动Compaction和全量Compaction

自动Compaction

自动Compaction是在系统读取数据、写入数据或系统重启时自动触发Compaction操作,提升短时间内的读取性能。默认情况下,自动Compaction是开启状态,可能在业务高峰期触发,导致意外抢占IO影响业务。如果需要完全手动控制Compaction操作,用户可以关闭自动Compaction

关闭自动Compaction

  1. # 查看当前rocksdb_column_family_options设置,复制value列内容。
  2. nebula> SHOW CONFIGS STORAGE;
  3. +-----------+-------------------------------------+-------+-----------+------------------------------------------------------------------------------------------------------+
  4. | module | name | type | mode | value |
  5. +-----------+-------------------------------------+-------+-----------+------------------------------------------------------------------------------------------------------+
  6. | "STORAGE" | "v" | "int" | "MUTABLE" | 0 |
  7. +-----------+-------------------------------------+-------+-----------+------------------------------------------------------------------------------------------------------+
  8. ...
  9. +-----------+-------------------------------------+-------+-----------+------------------------------------------------------------------------------------------------------+
  10. | "STORAGE" | "rocksdb_column_family_options" | "map" | "MUTABLE" | {max_bytes_for_level_base: "268435456", max_write_buffer_number: "4", write_buffer_size: "67108864"} |
  11. +-----------+-------------------------------------+-------+-----------+------------------------------------------------------------------------------------------------------+
  12. ...
  13. # 修改rocksdb_column_family_options设置,在复制的value内容中添加disable_auto_compactions: true
  14. nebula> UPDATE CONFIGS storage:rocksdb_column_family_options = {disable_auto_compactions: true, max_bytes_for_level_base: 268435456, max_write_buffer_number: 4, write_buffer_size: 67108864};
  15. # 查看是否修改成功。
  16. nebula> SHOW CONFIGS STORAGE;
  17. +-----------+-------------------------------------+-------+-----------+--------------------------------------------------------------------------------------------------------------------------------------+
  18. | module | name | type | mode | value |
  19. +-----------+-------------------------------------+-------+-----------+--------------------------------------------------------------------------------------------------------------------------------------+
  20. | "STORAGE" | "v" | "int" | "MUTABLE" | 0 |
  21. +-----------+-------------------------------------+-------+-----------+--------------------------------------------------------------------------------------------------------------------------------------+
  22. ...
  23. +-----------+-------------------------------------+-------+-----------+--------------------------------------------------------------------------------------------------------------------------------------+
  24. | "STORAGE" | "rocksdb_column_family_options" | "map" | "MUTABLE" | {disable_auto_compactions: true, max_bytes_for_level_base: "268435456", max_write_buffer_number: "4", write_buffer_size: "67108864"} |
  25. +-----------+-------------------------------------+-------+-----------+--------------------------------------------------------------------------------------------------------------------------------------+
  26. ...

全量Compaction

全量Compaction可以对图空间进行大规模后台操作,例如合并文件、删除TTL过期数据等,该操作需要手动发起。使用如下语句执行全量Compaction操作:

  1. nebula> USE <your_graph_space>;
  2. nebula> SUBMIT JOB COMPACT;

上述命令会返回作业的ID,用户可以使用如下命令查看Compaction状态:

  1. nebula> SHOW JOB <job_id>;

操作建议

为保证Nebula Graph的性能,请参考如下操作建议:

  • 数据写入时为避免浪费IO,请在大量数据写入前关闭自动Compaction。详情请参见关闭自动Compaction

  • 数据导入完成后,请执行SUBMIT JOB COMPACT

  • 业务低峰期(例如凌晨)执行SUBMIT JOB COMPACT

  • 白天时设置disable_auto_compactionsfalse,提升短时间内的读取性能。

  • 为控制Compaction的读写速率,请在配置文件nebula-storaged.conf中设置如下两个参数:

    1. # 设置为从本地配置文件读取配置。
    2. --local_config=true
    3. # 读写速率限制为20MB/S。
    4. --rate_limit=20 (in MB/s)

FAQ

可以同时在多个图空间执行全量Compaction操作吗?

可以,但是此时的硬盘IO会很高,可能会影响效率。

全量Compaction操作会耗费多长时间?

如果已经设置读写速率限制,例如rate_limit限制为20MB/S时,用户可以通过硬盘使用量/rate_limit预估需要耗费的时间。如果没有设置读写速率限制,根据经验,速率大约为50MB/S。

可以动态调整rate_limit吗?

不可以。

全量Compaction操作开始后可以停止吗?

不可以停止,必须等待操作完成。这是RocksDB的限制。