跳到主要内容
版本:3.11.0

Compaction

本文介绍 Compaction 的相关信息。

悦数图数据库 中,Compaction是最重要的后台操作,对性能有极其重要的影响。

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

备注

Compaction操作会长时间占用硬盘的 IO,建议在业务低峰期(例如凌晨)执行该操作。

悦数图数据库 有两种类型的Compaction操作:自动Compaction和全量Compaction

自动Compaction

自动Compaction是在系统读取数据、写入数据或系统重启时自动触发Compaction操作,提升短时间内的读取性能。默认情况下,自动Compaction是开启状态,可能在业务高峰期触发,导致意外抢占 IO 影响业务。

全量Compaction

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

备注

建议在业务低峰期(例如凌晨)执行该操作,避免大量占用硬盘 IO 影响业务。

nebula> USE <your_graph_space>;
nebula> SUBMIT JOB COMPACT;

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

nebula> SHOW JOB <job_id>;

操作建议

为保证 悦数图数据库 的性能,请参考如下操作建议:

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

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

  • 为控制Compaction的写入速率,请在配置文件nebula-storaged.conf中设置如下参数(注:此参数限制全部写入,包括正常写入和 Compaction):

    # 写入速度限制为 20MB/S。
    --rocksdb_rate_limit=20 (in MB/s)

FAQ

Compaction 相关的日志在哪?

默认情况下,/usr/local/nebula/data/storage/nebula/{1}/data/ 目录下的文件名为 LOG 文件,或者类似 LOG.old.1625797988509303,找到如下的部分。

** Compaction Stats [default] **
Level Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
L0 2/0 2.46 KB 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.53 0.51 2 0.264 0 0
Sum 2/0 2.46 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.53 0.51 2 0.264 0 0
Int 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.00 0.00 0 0.000 0 0

如果当前的 L0 文件数量较多,对读性能影响较大,可以触发 compaction。

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

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

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

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

可以动态调整rocksdb_rate_limit吗?

不可以。

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

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