Storage 配置

本文介绍 storaged 配置文件。配置文件默认在 /usr/local/nebula/etc/ 目录下。如果您已指定 Nebula Graph 安装路径,则配置文件目录为 $pwd/nebula/etc/

  • *.default 文件为日常调试使用,也是服务启动时默认使用的配置文件
  • *.production 文件为推荐生产时使用的的文件,生产时请去掉 .production 后缀

Basics 基础配置

属性名 默认值 说明
daemonize true 作为 daemon 进程运行
pid_file "pids/nebula-storaged.pid" 进程 PID 文件

logging 日志相关

属性名 默认值 说明 动态修改
log_dir logs (也即 /usr/local/nebula/logs) storaged 日志文件存放路径,建议与 data_path 放不同硬盘
minloglevel 0 对应的日志级别分别为 INFO(DEBUG),WARNING,ERROR,FATAL。通常在调试环境设置为 0,生产环境设置为 1,设置为 4 不打印任何日志。 UPDATE CONFIGS 命令修改,立刻生效
v 0 0-4: 当 minloglevel 设置为 0 时,可以进一步设置调试日志的详细程度,值越大越详细 UPDATE CONFIGS 命令修改,立刻生效
logbufsecs 0 (秒) 日志缓存时间 UPDATE CONFIGS 命令修改,立刻生效
slow_op_threshhold_ms 50 (毫秒) 慢操作和慢查询需要打印日志的阈值 UPDATE CONFIGS 命令修改,立刻生效

例如,下面命令可以增加 storage 的日志详细程度 v=1.

nebula> UPDATE CONFIGS storage:v=1;

networking 网络通信相关

属性名 默认值 说明 动态修改
meta_server_addrs "127.0.0.1:45500" meta server 地址列表,格式为 ip1:port1, ip2:port2, ip3:port3
port 44500 RPC 监听端口
reuse_port true 开启内核(>3.9) SO_REUSEPORT 选项
ws_http_port 12000 HTTP 协议监听端口 (内部使用)
ws_h2_port 12002 HTTP/2 协议监听端口 (内部使用)
ws_ip "127.0.0.1" web service 绑定地址
heartbeat_interval_secs 10 (秒) meta service 的心跳,需和 nebula-meta.conf 文件中的该项一致 UPDATE CONFIGS 命令修改,下个心跳周期生效
raft_heartbeat_interval_secs 5 (秒) RAFT 选举通信超时时间 修改配置文件重启
raft_rpc_timeout_ms 500 (ms) RAFT RPC 通信超时 修改配置文件重启

注意: meta_server_addrs 参数中推荐使用实际 IP,127.0.0.1 有时不会被正确解析。

storage 数据持久化设置

属性名 默认值 说明
data_path data/storage (也即 /usr/local/nebula/data/storage/) 本机数据持久化的根目录。 每个 partition 对应一个子目录。

多块硬盘时可以逗号分隔多个目录,每个目录对应一个 Rocksdb 实例,以有更好的并发能力。例如

--data_path=/disk1/storage/,/disk2/storage/,/disk3/storage/

RocksDB Options

属性名 默认值 说明 动态修改
rocksdb_batch_size 4096 (B) Batch 写
rocksdb_block_cache 1024 (MB) block cache 大小。建议为本机内存的1/3
rocksdb_disable_wal true 使用 Rocksdb 的wal。默认使用 raft wal
wal_ttl 14400 (秒) RAFT wal 保留时间 UPDATE CONFIGS 命令修改,立刻生效
rocksdb_db_options {} json 类型,其中每个参数 key 和 value 均为 string 格式。解释见下 UPDATE CONFIGS 命令修改,整个json覆盖,立刻生效
rocksdb_column_family_options {} json 类型,其中每个参数 key 和 value 均为 string 格式。解释见下 UPDATE CONFIGS 命令修改,整个json覆盖,立刻生效
rocksdb_block_based_table_options {} json 类型,其中每个参数 key 和 value 均为 string 格式。解释见下 UPDATE CONFIGS 命令修改,整个json覆盖,立刻生效

rocksdb_db_options

max_total_wal_size
delete_obsolete_files_period_micros
max_background_jobs
stats_dump_period_sec
compaction_readahead_size
writable_file_max_buffer_size
bytes_per_sync
wal_bytes_per_sync
delayed_write_rate
avoid_flush_during_shutdown
max_open_files
stats_persist_period_sec
stats_history_buffer_size
strict_bytes_per_sync
enable_rocksdb_prefix_filtering
enable_rocksdb_whole_key_filtering
rocksdb_filtering_prefix_length
num_compaction_threads
rate_limit

以上参数都可通过 UPDATE CONFIGS 语法进行动态修改,也可以写在本地配置文件中。具体作用和修改是否需要重启请参考 RocksDB 手册。

rocksdb_column_family_options

write_buffer_size
max_write_buffer_number
level0_file_num_compaction_trigger
level0_slowdown_writes_trigger
level0_stop_writes_trigger
target_file_size_base
target_file_size_multiplier
max_bytes_for_level_base
max_bytes_for_level_multiplier
disable_auto_compactions       -- 停止写入数据时候的自动 compact,默认 false。动态修改立刻生效。

以上参数都可通过 UPDATE CONFIGS 语法进行动态修改,也可以写在本地配置文件中。具体作用和修改是否需要重启请参考RocksDB手册。

以上参数可通过命令行如下设置:

nebula> UPDATE CONFIGS storage:rocksdb_column_family_options = \
        { disable_auto_compactions = false, level0_file_num_compaction_trigger = 10 };
        -- 该命令会整个覆盖 rocksdb_column_family_options,请注意是否会覆盖其他子项
nebula> UPDATE CONFIGS storage:rocksdb_db_options  = \
        { max_subcompactions = 10, max_background_jobs = 10};
nebula> UPDATE CONFIGS storage:max_edge_returned_per_vertex = 10; -- 该参数解释见下文

可在配置文件中如下设置:

    rocksdb_db_options = {"stats_dump_period_sec":"200", "write_thread_max_yield_usec":"600"}
    rocksdb_column_family_options = {"max_write_buffer_number":"4", "min_write_buffer_number_to_merge":"2", "max_write_buffer_number_to_maintain":"1"}
    rocksdb_block_based_table_options = {"block_restart_interval":"2"}

说明:稠密点处理(出入边数量极多的点)

针对图遍历过程中,遇到稠密点的情况,目前有两种截断策略:

  1. 直接截断。设置 enable_reservoir_sampling = false,截取前 max_edge_returned_per_vertex 个边,多余的边不返回。
  2. 蓄水池采样。对出边进行等概率采样,从未知数量的所有出边中,等概率采样 max_edge_returned_per_vertex 个边。对于出边数量超过 max_edge_returned_per_vertex 的稠密点,蓄水池采样方法的性能相对直接截取方法要差,但对某些业务场景更有应用价值。

例如:

nebula> UPDATE CONFIGS storage:enable_reservoir_sampling = false;

直接截断方法

属性名 默认值 说明 动态修改
max_edge_returned_per_vertex 2147483647 每个稠密点,最多返回多少条边,多余的边截断不返回 UPDATE CONFIGS 命令修改,立刻生效

Reservoir Sampling 蓄水池采样算法方式

属性名 默认值 说明 动态修改
enable_reservoir_sampling false 对于边采用蓄水池概率采样方式决定是否返回 UPDATE CONFIGS 命令修改,立刻生效

数据量大时的 storage 配置

如果数据量很大但内存不够,则推荐把 storage 配置中的 enable_partitioned_index_filter 设置为 true;但由于缓存了较少的 RocksDB 索引,性能会受影响。