logo
咨询企业版

技术分享

NebulaGraph 扩容|丝滑扩容Graph、Storage 与 Meta 服务

导读:本文来自社区开发者 Zhi@Li 的扩容实践,手把手教大家搞定 Graph 服务、Storage 服务和 Meta 服务扩容~

什么时候需要扩容?

总览

Graph 服务

职责

  • 作为接入层承载客户端连接,会话、认证、权限检查。

  • 查询优化与执行协调:把一个 nGQL 拆成分布式子计划,下推到多个 storaged;最后汇总/排序/聚合返回。

  • 维护计划缓存、会话状态(无业务数据)。

扩容触发信号(看到这些,优先加 graphd)

  • 查询时延上升:p95/p99 明显劣化且 CPU 使用率在 graphd 上飙高(>70% 持续)。

  • 并发连接与 QPS 打满:连接数接近实例上限,或排队时间上升(线程池满负载)。

  • 网络出入带宽紧张:graphd 到 storaged 的返回结果量大,LB 后面每个 graphd 都接近网卡瓶颈。

  • 短时间突发流量导致 graphd 负载尖峰,但 storage 仍然健康。

扩容实践

  • 横向扩容 graphd 容器/主机(无状态,最容易),在前面放负载均衡(L4/L7 皆可)。

  • 适度调优 graphd 并发/连接参数(如网络线程/worker 线程/最大连接数/查询超时),但不要硬顶到 CPU 饱和。

  • 若查询本身数据侧很“重”,仅加 graphd 效果有限——参看 storage 扩容信号。

Storage 服务

职责

  • 数据面:点/边/索引的读写,基于 RocksDB;每个分区是 Raft 组(多副本)。

  • 执行下推算子:点查、邻接边遍历、按属性过滤、按照索引扫描等。

  • 数据复制:WAL 写入、Follower 复制、Compaction、快照/备份等后台任务。

扩容触发信号(看到这些,优先加 storaged)

  • 容量压力:某些盘/实例使用率 >70–80%,且还在快速增长(风险:写放大/compaction 失衡)。

  • 磁盘 IO 持续高(util/await 上升)、write stall、compaction backlog 大(RocksDB Pending Compaction Bytes 居高不下)。

  • 写入/更新延迟上升或Raft 复制落后(commit/apply 延迟大),BALANCE LEADER 后也无法缓解。

  • 热点分区/热点 Leader:单机 Leader 负载显著高于同集群其他节点。

  • 查询在 storage 侧变慢(graphd CPU 并不高、但整体时延升高),说明下推阶段在 IO/网络侧受限。

扩容实践

  • 横向加 storaged 节点(带独立数据盘,优先 NVMe/SSD;充足内存用于 Block Cache)。

  • 扩容后务必执行:

  • BALANCE DATA

    (数据均衡,迁移分区副本)

  • BALANCE LEADER

    (领导者均衡,打散热点)

  • 分区数与副本因子要匹配节点规模(分区过少难以并行,过多会加重 Meta/心跳与 Raft 开销)。

  • 纵向优化:提升磁盘(IOPS/吞吐/延迟)、调高 Block Cache、限速后台 compaction/ingest,避免前台查询抖动。

  • 网络:保证存储平面万兆以上,跨机房/跨可用区时注意 RTT 对 Raft 的影响。

Meta 服务

职责

  • “控制面/大脑”:维护 Space/Schema、分区与副本布局、Leader 分布、Host 列表、用户/角色等。

  • 接收 storaged 心跳、分配/记录元数据变更;通过 Raft 多副本保证一致性。

  • 参与 数据均衡/Leader 均衡 调度。

扩容触发信号(何时考虑从 3 个 metad 扩到 5 个 / 或加强单机)

  • 大规模集群:主机/分区数量非常多导致心跳风暴、元数据读负载过高(metad CPU 持续高位)。

  • 频繁变更:大量 schema 变更或频繁 BALANCE 操作期间,Raft WAL/复制负载明显偏高。

  • Raft 落后或Meta RPC 队列阻塞:元数据读写排队时间增大,metad 磁盘 IO/延迟居高。

  • 容错要求提高:跨 AZ/机房需要更高的多数派存活概率。

扩容实践

  • 保持奇数副本(3/5),优先3 节点即可满足大多数场景;若上面症状长期存在,再扩到 5 节点。

  • 优先纵向加配:给 metad 上更快的 CPU/盘(Raft WAL 对延迟敏感),独占网卡与存储,避免与 storaged 混布高 IO。

  • 拓扑:跨可用区布局 metad,多数派可用优先;避免把所有 metad 堆在同一个故障域。

二、扩容实操参考

(一)扩容 Graph 节点

前置条件检查

1. 软件版本一致

新节点需安装与现有集群一致的 NebulaGraph 3.0.2 版本(包括 graphd 进程版本一致)。

2. 网络连通

  • 新节点到所有 Meta 节点的 9559 端口可通。

  • 新节点到 Storage 节点的 9779 端口可通。

  • 新节点与现有 Graph 节点之间互通(用于调试/监控)。

3. 时间同步

确保 NTP 正常工作,避免时钟漂移影响会话和 Raft.

4. 资源分配

  • CPU、内存满足现有 graphd 节点的配置。

  • 网络建议万兆或以上,低延迟。

  • SSD 数据盘配置。

新节点安装与配置 graphd

在 10.xxx.xxx.144 和 10.xxx.xxx.145 执行:

1. 安装 NebulaGraph

rpm 安装

cd /data/server/
mkdir -p /data/server/Nebula_Graph/{data,logs,pids}
rpm -ivh --prefix=/data/server/Nebula_Graph/ nebula-graph-3.0.2.el8.x86_64.rpm
ls -lshrt /data/server/Nebula_Graph/
4.0K drwxr-xr-x 3 root root 4.0K Aug 14 14:48 share
4.0K drwxr-xr-x 2 root root 4.0K Aug 14 14:48 scripts
4.0K drwxr-xr-x 2 root root 4.0K Aug 14 14:48 bin
4.0K drwxr-xr-x 2 root root 4.0K Aug 14 14:58 etc
4.0K drwxr-xr-x 2 root root 4.0K Aug 14 15:05 pids
4.0K drwxr-xr-x 2 root root 4.0K Aug 14 15:05 logs
4.0K drwxr-xr-x 2 root root 4.0K Aug 14 15:05 data

2. 编辑 graphd 配置文件

可直接复用其他节点的配置项,仅需要修改 local_ip 为本地 IP 地址,此处扩容 10.xxx.xxx.14410.xxx.xxx.145 两个 graphd 节点。

# 修改配置文件
ssh ;10.xxx.xxx.144
sed ;-i ;"s,local_ip=10.xxx.xxx.141,local_ip=10.xxx.xxx.144,g" ; /data/server/Nebula_Graph/etc/nebula-graphd.conf
ssh ;10.xxx.xxx.145
sed ;-i ;"s,local_ip=10.xxx.xxx.141,local_ip=10.xxx.xxx.145,g" ; /data/server/Nebula_Graph/etc/nebula-graphd.conf
# 检查配置
cat /data/server/Nebula_Graph/etc/nebula-graphd.conf | grep -Ei 'port=|meta_server_addrs=|local_ip=|log_dir=' --color

启动 Graph 服务并加入集群

在每台新节点上执行:

# 启动 graphd
cd /data/server/
chown -R edu-server:edu-server Nebula_Graph
cd /data/server/Nebula_Graph/scripts

su - edu-server
cd /data/server/Nebula_Graph/scripts
./nebula.service  start graphd
./nebula.service  status graphd

Graph 服务会在启动时向 Meta 注册,成为可用的接入节点。

验证新节点是否成功加入

在任一已有的 Graph 节点上执行:

# 进入控制台,验证新节点注册
nebula-console-linux-amd64-v3.0.0 ;-addr ;10.xxx.xxx.144 ;-port ;9669 ;-u root -p '<user_password>' -e 'SHOW HOSTS GRAPH;'

你应该看到原有三台 + 新增两台节点,状态为 ONLINE.

(root@nebula) [(none)]> ;SHOW ;HOSTS GRAPH;
+------------------+------+----------+---------+--------------+---------+
| ;Host  ;  ;  ;  ;  ;  ; ;| ;Port ;| ;Status  ; ;| ;Role  ;  ;| ;Git Info Sha ;| ;Version ;|
+------------------+------+----------+---------+--------------+---------+
| ;"10.xxx.xxx.141" ;| ;9669 ;| ;"ONLINE" ;| ;"GRAPH" ;| ;"4805f8c"  ;  ;| ;"3.0.2" ;|
| ;"10.xxx.xxx.142" ;| ;9669 ;| ;"ONLINE" ;| ;"GRAPH" ;| ;"4805f8c"  ;  ;| ;"3.0.2" ;|
| ;"10.xxx.xxx.143" ;| ;9669 ;| ;"ONLINE" ;| ;"GRAPH" ;| ;"4805f8c"  ;  ;| ;"3.0.2" ;|
| ;"10.xxx.xxx.144" ;| ;9669 ;| ;"ONLINE" ;| ;"GRAPH" ;| ;"4805f8c"  ;  ;| ;"3.0.2" ;|
| ;"10.xxx.xxx.145" ;| ;9669 ;| ;"ONLINE" ;| ;"GRAPH" ;| ;"4805f8c"  ;  ;| ;"3.0.2" ;|
+------------------+------+----------+---------+--------------+---------+
Got ;5 ;rows ;(time ;spent ;1074/1841 ;us)
# 查询集群版本一致性
nebula-console-linux-amd64-v3.0.0 ;-addr ;10.xxx.xxx.144 ;-port ;9669 ;-u root -p '<user_password>' -e 'SHOW HOSTS META;'
+------------------+------+----------+--------+--------------+---------+
| ;Host  ;  ;  ;  ;  ;  ; ;| ;Port ;| ;Status  ; ;| ;Role  ; ;| ;Git Info Sha ;| ;Version ;|
+------------------+------+----------+--------+--------------+---------+
| ;"10.xxx.xxx.141" ;| ;9559 ;| ;"ONLINE" ;| ;"META" ;| ;"4805f8c"  ;  ;| ;"3.0.2" ;|
| ;"10.xxx.xxx.142" ;| ;9559 ;| ;"ONLINE" ;| ;"META" ;| ;"4805f8c"  ;  ;| ;"3.0.2" ;|
| ;"10.xxx.xxx.143" ;| ;9559 ;| ;"ONLINE" ;| ;"META" ;| ;"4805f8c"  ;  ;| ;"3.0.2" ;|
+------------------+------+----------+--------+--------------+---------+
nebula-console-linux-amd64-v3.0.0 ;-addr ;10.xxx.xxx.144 ;-port ;9669 ;-u root -p '<user_password>' -e 'SHOW HOSTS STORAGE;'
(root@nebula) [(none)]> ;SHOW ;HOSTS STORAGE;
+------------------+------+----------+-----------+--------------+---------+
| ;Host  ;  ;  ;  ;  ;  ; ;| ;Port ;| ;Status  ; ;| ;Role  ;  ;  ;| ;Git Info Sha ;| ;Version ;|
+------------------+------+----------+-----------+--------------+---------+
| ;"10.xxx.xxx.141" ;| ;9779 ;| ;"ONLINE" ;| ;"STORAGE" ;| ;"4805f8c"  ;  ;| ;"3.0.2" ;|
| ;"10.xxx.xxx.142" ;| ;9779 ;| ;"ONLINE" ;| ;"STORAGE" ;| ;"4805f8c"  ;  ;| ;"3.0.2" ;|
| ;"10.xxx.xxx.143" ;| ;9779 ;| ;"ONLINE" ;| ;"STORAGE" ;| ;"4805f8c"  ;  ;| ;"3.0.2" ;|
+------------------+------+----------+-----------+--------------+---------+

业务配置修改并验证

1. 更新负载均衡配置

  • 如果客户端通过 LB 访问 graphd,需要将新节点的 IP:9669 加入 LB 后端池。

  • 10.xxx.xxx.144:9669
    10.xxx.xxx.145:9669
    
  • 确认健康检查(TCP 9669)正常。

2. 业务验证

业务查询进行并发压测,确认 QPS 与时延符合预期。

3. 监控接入量

通过监控系统或 SHOW STATS 查看各 graphd 的连接数与查询负载分布。

(二)扩容 Storage 节点

前置条件检查

1. 软件版本一致

新节点需安装与现有集群一致的 NebulaGraph 3.0.2 版本(包括 graphd 进程版本一致)。

2. 网络连通

  • 新节点到所有 Meta 节点的 9559 端口可通。

  • 新节点到 Storage 节点的 9779 端口可通。

  • 新节点与现有 Graph 节点之间互通(用于调试/监控)。

3. 时间同步

确保 NTP 正常工作,避免时钟漂移影响会话和 Raft.

4. 资源分配

  • CPU、内存满足现有 graphd 节点的配置。

  • 网络建议万兆或以上,低延迟。

  • SSD 数据盘配置。

5. 主机初始化

新节点安装与配置 storage

在 10.xxx.xxx.144 和 10.xxx.xxx.145 执行:

1. 安装 NebulaGraph

rpm 安装

cd /data/server/
mkdir -p /data/server/Nebula_Graph/{data,logs,pids}
rpm -ivh --prefix=/data/server/Nebula_Graph/ nebula-graph-3.0.2.el8.x86_64.rpm
ls -lshrt /data/server/Nebula_Graph/
4.0K drwxr-xr-x 3 root root 4.0K Aug 14 14:48 share
4.0K drwxr-xr-x 2 root root 4.0K Aug 14 14:48 scripts
4.0K drwxr-xr-x 2 root root 4.0K Aug 14 14:48 bin
4.0K drwxr-xr-x 2 root root 4.0K Aug 14 14:58 etc
4.0K drwxr-xr-x 2 root root 4.0K Aug 14 15:05 pids
4.0K drwxr-xr-x 2 root root 4.0K Aug 14 15:05 logs
4.0K drwxr-xr-x 2 root root 4.0K Aug 14 15:05 data
2. 编辑 storaged 配置文件

可直接复用其他节点的配置项,仅需要修改 local_ip 为本地 IP 地址,此处扩容 10.xxx.xxx.14410.xxx.xxx.145 两个 storaged 节点。

# 修改配置文件
ssh ;10.xxx.xxx.144
sed ;-i ;"s,local_ip=10.xxx.xxx.141,local_ip=10.xxx.xxx.144,g" ; /data/server/Nebula_Graph/etc/nebula-storaged.conf
ssh ;10.xxx.xxx.145
sed ;-i ;"s,local_ip=10.xxx.xxx.141,local_ip=10.xxx.xxx.145,g" ; /data/server/Nebula_Graph/etc/nebula-graphd.conf
# 检查配置
cat /data/server/Nebula_Graph/etc/nebula-graphd.conf | grep -Ei 'port=|meta_server_addrs=|local_ip=|log_dir=' --color

3. 启动 storaged 服务并加入集群

# 进入控制台,检查当前节点列表
nebula-console-linux-amd64-v3.0.0 ;-addr ;10.xxx.xxx.144 ;-port ;9669 ;-u root -p 'user_password' -e 'SHOW HOSTS STORAGE;'
+------------------+------+----------+-----------+--------------+---------+
| ;Host  ;  ;  ;  ;  ;  ; ;| ;Port ;| ;Status  ; ;| ;Role  ;  ;  ;| ;Git Info Sha ;| ;Version ;|
+------------------+------+----------+-----------+--------------+---------+
| ;"10.xxx.xxx.141" ;| ;9779 ;| ;"ONLINE" ;| ;"STORAGE" ;| ;"4805f8c"  ;  ;| ;"3.0.2" ;|
| ;"10.xxx.xxx.142" ;| ;9779 ;| ;"ONLINE" ;| ;"STORAGE" ;| ;"4805f8c"  ;  ;| ;  ;  ;  ;  ;|
| ;"10.xxx.xxx.143" ;| ;9779 ;| ;"ONLINE" ;| ;"STORAGE" ;| ;"4805f8c"  ;  ;| ;"3.0.2" ;|
+------------------+------+----------+-----------+--------------+---------+
# 进入控制台,检查当前节点列表
nebula-console-linux-amd64-v3.0.0 ;-addr ;10.xxx.xxx.144 ;-port ;9669 ;-u root -p 'user_password' -e 'SHOW HOSTS;'
+------------------+------+----------+--------------+---------------------------------------------------------------+-----------------------------------------------------------------+---------+
| ;Host  ;  ;  ;  ;  ;  ; ;| ;Port ;| ;Status  ; ;| ;Leader count ;| ;Leader distribution  ;  ;  ;  ;  ;  ;  ;  ;  ;  ;  ;  ;  ;  ;  ;  ;  ;  ;  ;  ;  ; ;| ;Partition ;distribution  ;  ;  ;  ;  ;  ;  ;  ;  ;  ;  ;  ;  ;  ;  ;  ;  ;  ;  ;  ;  ;| ;Version ;|
+------------------+------+----------+--------------+---------------------------------------------------------------+-----------------------------------------------------------------+---------+
| ;"10.xxx.xxx.141" ;| ;9779 ;| ;"ONLINE" ;| ;10 ;  ;  ;  ;  ;  ;| ;"ttt_20250613_001:5, ttt_20250711_001:5"  ;  ;  ;  ;  ;  ;  ;  ;  ;  ;  ;| ;"ttt_20250613_001:15, ttt_20250711_001:15, ttt_20250723_001:15" ;| ;"3.0.2" ;|
| ;"10.xxx.xxx.142" ;| ;9779 ;| ;"ONLINE" ;| ;20 ;  ;  ;  ;  ;  ;| ;"ttt_20250613_001:5, ttt_20250711_001:5, ttt_20250723_001:10" ;| ;"ttt_20250613_001:15, ttt_20250711_001:15, ttt_20250723_001:15" ;| ;  ;|
| ;"10.xxx.xxx.143" ;| ;9779 ;| ;"ONLINE" ;| ;15 ;  ;  ;  ;  ;  ;| ;"ttt_20250613_001:5, ttt_20250711_001:5, ttt_20250723_001:5"  ;| ;"ttt_20250613_001:15, ttt_20250711_001:15, ttt_20250723_001:15" ;| ;"3.0.2" ;|
+------------------+------+----------+--------------+---------------------------------------------------------------+-----------------------------------------------------------------+---------+

在每台新节点上执行:

# 启动 graphd
cd /data/server/
chown -R edu-server:edu-server Nebula_Graph
cd /data/server/Nebula_Graph/scripts

su - edu-server
cd /data/server/Nebula_Graph/scripts
./nebula.service  start storaged
./nebula.service  status storaged

nebula-storaged 进程的端口号的红色闪烁状态是因为 nebula-storaged 在启动流程中会等待 nebula-metad 添加当前 Storage 服务,当前 Storage 服务收到 Ready 信号后才会正式启动服务。

从 3.0.0 版本开始,Meta 服务无法直接读写在配置文件中添加的 Storage 服务,配置文件的作用仅仅是将 Storage 服务注册至 Meta 服务中。用户必须使用 ADD HOSTS 命令后,才能使 Meta 服务正常读写 Storage 服务。

在任意 Graph 节点执行 ADD HOSTS 将新节点注册到 Meta 服务,否则 Meta 不会分配分区给它,BALANCE DATA 也不会把数据迁移过去。

从 NebulaGraph 3.0.0 开始,在配置文件中设置存储主机仅在元数据(Meta)端注册主机,但不会将它们添加到集群中,必须运行 ADD HOSTS 语句来添加存储主机。

# 进入控制台,检查当前节点列表
nebula-console-linux-amd64-v3.0.0 -addr 10.xxx.xxx.144 -port 9669 -u root -p 'user_password'
ADD  HOSTS  10.xxx.xxx.144:977910.xxx.xxx.145:9779;

增加 Storage 主机在下一个心跳周期之后才能生效,为确保数据同步,请等待 2 个心跳周期(20 秒),然后执行 SHOW HOSTS 查看是否在线。

  • IP地址和端口请和配置文件中的设置保持一致,例如单机部署的默认为 127.0.0.1:9779。

验证新节点是否成功加入

在任一已有的 Graph 节点上执行:

# 进入控制台,确认新节点
nebula-console-linux-amd64-v3.0.0 ;-addr ;10.xxx.xxx.144 ;-port ;9669 ;-u root -p 'user_password' -e 'SHOW HOSTS STORAGE;'

你应该看到原有三台 + 新增两台节点,状态为 ONLINE.

  • 为了确保后续操作按预期工作,请等待两个心跳周期,即 20 秒,然后运行 SHOW HOSTS 来检查主机是否在线。

  • 确保 IP 地址和端口号与配置文件中的相同。例如,在独立部署中,默认的 IP 地址和端口号是 127.0.0.1:9779。

(root@nebula) [(none)]> ;SHOW ;HOSTS STORAGE;
+------------------+------+----------+-----------+--------------+---------+
| ;Host  ;  ;  ;  ;  ;  ; ;| ;Port ;| ;Status  ; ;| ;Role  ;  ;  ;| ;Git Info Sha ;| ;Version ;|
+------------------+------+----------+-----------+--------------+---------+
| ;"10.xxx.xxx.141" ;| ;9779 ;| ;"ONLINE" ;| ;"STORAGE" ;| ;"4805f8c"  ;  ;| ;"3.0.2" ;|
| ;"10.xxx.xxx.142" ;| ;9779 ;| ;"ONLINE" ;| ;"STORAGE" ;| ;"4805f8c"  ;  ;| ;"3.0.2" ;|
| ;"10.xxx.xxx.143" ;| ;9779 ;| ;"ONLINE" ;| ;"STORAGE" ;| ;"4805f8c"  ;  ;| ;"3.0.2" ;|
| ;"10.xxx.xxx.144" ;| ;9779 ;| ;"ONLINE" ;| ;"STORAGE" ;| ;"4805f8c"  ;  ;| ;"3.0.2" ;|
| ;"10.xxx.xxx.145" ;| ;9779 ;| ;"ONLINE" ;| ;"STORAGE" ;| ;"4805f8c"  ;  ;| ;"3.0.2" ;|
+------------------+------+----------+-----------+--------------+---------+

负载均衡

因为在 Nebula 3.0.x(含 3.0.2) 里,没有可用的“数据均衡”命令来把现有分区副本搬到新节点;只支持 Leader 均衡。新加的 10.xxx.xxx.144 / 145 依然是 “No valid partition”,所以 Leader 不可能被分配到它们——Leader 只能在“持有该分区副本的存储节点”里轮换。

当前的三个 Space 的分区副本仍然只在旧的三台 141/142/143 上,因此 Leader 均衡只在这三台之间打散;对 144/145 没有任何效果。

nebula-console-linux-amd64-v3.0.0 ;-addr ;10.xxx.xxx.144 ;-port ;9669 ;-u root -p 'user_password' -e 'SHOW HOSTS;'
(root@nebula) [(none)]> ;SHOW ;HOSTS;
+------------------+------+----------+--------------+--------------------------------------------------------------+-----------------------------------------------------------------+---------+
| ;Host  ;  ;  ;  ;  ;  ; ;| ;Port ;| ;Status  ; ;| ;Leader count ;| ;Leader distribution  ;  ;  ;  ;  ;  ;  ;  ;  ;  ;  ;  ;  ;  ;  ;  ;  ;  ;  ;  ;  ;| ;Partition ;distribution  ;  ;  ;  ;  ;  ;  ;  ;  ;  ;  ;  ;  ;  ;  ;  ;  ;  ;  ;  ;  ;| ;Version ;|
+------------------+------+----------+--------------+--------------------------------------------------------------+-----------------------------------------------------------------+---------+
| ;"10.xxx.xxx.141" ;| ;9779 ;| ;"ONLINE" ;| ;15 ;  ;  ;  ;  ;  ;| ;"ttt_20250613_001:5, ttt_20250711_001:5, ttt_20250723_001:5" ;| ;"ttt_20250613_001:15, ttt_20250711_001:15, ttt_20250723_001:15" ;| ;"3.0.2" ;|
| ;"10.xxx.xxx.142" ;| ;9779 ;| ;"ONLINE" ;| ;15 ;  ;  ;  ;  ;  ;| ;"ttt_20250613_001:5, ttt_20250711_001:5, ttt_20250723_001:5" ;| ;"ttt_20250613_001:15, ttt_20250711_001:15, ttt_20250723_001:15" ;| ; ;|
| ;"10.xxx.xxx.143" ;| ;9779 ;| ;"ONLINE" ;| ;15 ;  ;  ;  ;  ;  ;| ;"ttt_20250613_001:5, ttt_20250711_001:5, ttt_20250723_001:5" ;| ;"ttt_20250613_001:15, ttt_20250711_001:15, ttt_20250723_001:15" ;| ;"3.0.2" ;|
| ;"10.xxx.xxx.144" ;| ;9779 ;| ;"ONLINE" ;| ;0 ;  ;  ;  ;  ;  ; ;| ;"No valid partition"  ;  ;  ;  ;  ;  ;  ;  ;  ;  ;  ;  ;  ;  ;  ;  ;  ;  ;  ;  ; ;| ;"No valid partition"  ;  ;  ;  ;  ;  ;  ;  ;  ;  ;  ;  ;  ;  ;  ;  ;  ;  ;  ;  ;  ;  ;| ; ;|
| ;"10.xxx.xxx.145" ;| ;9779 ;| ;"ONLINE" ;| ;0 ;  ;  ;  ;  ;  ; ;| ;"No valid partition"  ;  ;  ;  ;  ;  ;  ;  ;  ;  ;  ;  ;  ;  ;  ;  ;  ;  ;  ;  ; ;| ;"No valid partition"  ;  ;  ;  ;  ;  ;  ;  ;  ;  ;  ;  ;  ;  ;  ;  ;  ;  ;  ;  ;  ;  ;| ; ;|
+------------------+------+----------+--------------+--------------------------------------------------------------+-----------------------------------------------------------------+---------+

升级到 Nebula 3.2.x 版本以上即可。

业务验证

业务查询进行并发压测,确认 QPS 与时延等符合预期。

(三)扩容 Meta 节点

前置条件检查

1. 软件版本一致

新节点需安装与现有集群一致的 NebulaGraph 3.0.2 版本(包括 graphd 进程版本一致)。

2. 网络连通

  • 新节点到所有 Meta 节点的 9559 端口可通。

  • 新节点到 Storage 节点的 9779 端口可通。

  • 新节点与现有 Graph 节点之间互通(用于调试/监控)。

3. 时间同步

确保 NTP 正常工作,避免时钟漂移影响会话和 Raft.

4. 资源分配

CPU、内存满足现有 graphd 节点的配置。

  • 网络建议万兆或以上,低延迟。

  • SSD 数据盘配置。

5. 主机初始化

新节点安装与配置 storage

1. 安装 NebulaGraph

rpm 安装

cd /data/server/
mkdir -p /data/server/Nebula_Graph/{data,logs,pids}
rpm -ivh --prefix=/data/server/Nebula_Graph/ nebula-graph-3.0.2.el8.x86_64.rpm
ls -lshrt /data/server/Nebula_Graph/
4.0K drwxr-xr-x 3 root root 4.0K Aug 14 14:48 share
4.0K drwxr-xr-x 2 root root 4.0K Aug 14 14:48 scripts
4.0K drwxr-xr-x 2 root root 4.0K Aug 14 14:48 bin
4.0K drwxr-xr-x 2 root root 4.0K Aug 14 14:58 etc
4.0K drwxr-xr-x 2 root root 4.0K Aug 14 15:05 pids
4.0K drwxr-xr-x 2 root root 4.0K Aug 14 15:05 logs
4.0K drwxr-xr-x 2 root root 4.0K Aug 14 15:05 data
2. 编辑 metad 配置文件

2.1 配置新节点

配置文件路径一般在 /usr/local/nebula/etc/nebula-metad.conf(tar 包安装)或 /etc/nebula-metad.conf(RPM 安装)。

可直接复用其他节点的配置项,仅需要修改 local_ip 为本地 IP 地址,同时需要将新增节点加入到meta_server_addrs配置项中,此处扩容10.xxx.xxx.14410.xxx.xxx.145 两个 meta 节点。

# 修改配置文件
ssh 10.xxx.xxx.144
sed -i "s,local_ip=10.xxx.xxx.141,local_ip=10.xxx.xxx.144,g"  /data/server/Nebula_Graph/etc/nebula-metad.conf
sed -i "s%meta_server_addrs=10.xxx.xxx.141:9559,10.xxx.xxx.142:9559,10.xxx.xxx.143:9559%meta_server_addrs=10.xxx.xxx.141:9559,10.xxx.xxx.142:9559,10.xxx.xxx.143:9559,10.xxx.xxx.144:9559,10.xxx.xxx.145:9559%g"  /data/server/Nebula_Graph/etc/nebula-metad.conf
ssh 10.xxx.xxx.145
sed -i "s,local_ip=10.xxx.xxx.141,local_ip=10.xxx.xxx.145,g"  /data/server/Nebula_Graph/etc/nebula-metad.conf
sed -i "s%meta_server_addrs=10.xxx.xxx.141:9559,10.xxx.xxx.142:9559,10.xxx.xxx.143:9559%meta_server_addrs=10.xxx.xxx.141:9559,10.xxx.xxx.142:9559,10.xxx.xxx.143:9559,10.xxx.xxx.144:9559,10.xxx.xxx.145:9559%g"  /data/server/Nebula_Graph/etc/nebula-metad.conf
# 检查配置
cat /data/server/Nebula_Graph/etc/nebula-metad.conf | grep -Ei 'port=|meta_server_addrs=|local_ip=|log_dir=|meta_server_addrs=' --color
2.2 更新已有节点

现有所有 Meta 节点的配置文件 中 --meta_server_addrs 也必须同时更新,写入全部 5 个 IP,否则旧节点无法识别新节点。

ssh 10.xxx.xxx.141
ssh 10.xxx.xxx.142
ssh 10.xxx.xxx.143
sed -i "s%meta_server_addrs=10.xxx.xxx.141:9559,10.xxx.xxx.142:9559,10.xxx.xxx.143:9559%meta_server_addrs=10.xxx.xxx.141:9559,10.xxx.xxx.142:9559,10.xxx.xxx.143:9559,10.xxx.xxx.144:9559,10.xxx.xxx.145:9559%g"  /data/server/Nebula_Graph/etc/nebula-metad.conf
cat /data/server/Nebula_Graph/etc/nebula-metad.conf | grep -Ei 'port=|meta_server_addrs=|local_ip=|log_dir=|meta_server_addrs=' --color

更新配置后需要滚动重启所有 Meta 节点(一次重启一台,避免多数派丢失)。

# 一次重启一台,避免多数派丢失
ssh 10.xxx.xxx.141
ssh 10.xxx.xxx.142
ssh 10.xxx.xxx.143
su - edu-server
cd /data/server/Nebula_Graph/scripts
./nebula.service  status metad
./nebula.service  stop metad
./nebula.service  status metad
sleep 30
./nebula.service  status metad
./nebula.service  start metad
./nebula.service  status metad
nebula-console-linux-amd64-v3.0.0 ;-addr ;10.xxx.xxx.144 ;-port ;9669 ;-u root -p 'user_password' -e 'SHOW HOSTS META;'
(root@nebula) [(none)]> ;SHOW ;HOSTS META;
+------------------+------+----------+--------+--------------+---------+
| ;Host  ;  ;  ;  ;  ;  ; ;| ;Port ;| ;Status  ; ;| ;Role  ; ;| ;Git Info Sha ;| ;Version ;|
+------------------+------+----------+--------+--------------+---------+
| ;"10.xxx.xxx.141" ;| ;9559 ;| ;"ONLINE" ;| ;"META" ;| ;"4805f8c"  ;  ;| ;"3.0.2" ;|
| ;"10.xxx.xxx.142" ;| ;9559 ;| ;"ONLINE" ;| ;"META" ;| ;"4805f8c"  ;  ;| ;"3.0.2" ;|
| ;"10.xxx.xxx.143" ;| ;9559 ;| ;"ONLINE" ;| ;"META" ;| ;"4805f8c"  ;  ;| ;"3.0.2" ;|
| ;"10.xxx.xxx.144" ;| ;9559 ;| ;"ONLINE" ;| ;"META" ;| ;"4805f8c"  ;  ;| ;"3.0.2" ;|
| ;"10.xxx.xxx.145" ;| ;9559 ;| ;"ONLINE" ;| ;"META" ;| ;"4805f8c"  ;  ;| ;"3.0.2" ;|
+------------------+------+----------+--------+--------------+---------+

启动 metad 服务并加入集群

在每台新节点上执行:

# 启动 graphd
cd /data/server/
chown -R edu-server:edu-server Nebula_Graph
cd /data/server/Nebula_Graph/scripts
su - edu-server
cd /data/server/Nebula_Graph/scripts
./nebula.service  start metad
./nebula.service  status metad

验证新节点是否成功加入

在任一已有的 Graph 节点上执行

# 进入控制台,确认新节点
nebula-console-linux-amd64-v3.0.0 ;-addr ;10.xxx.xxx.144 ;-port ;9669 ;-u root -p 'user_password' -e 'SHOW HOSTS META;'

你应该看到原有三台 + 新增两台节点,状态为 ONLINE

+------------------+------+----------+--------+--------------+---------+
| ;Host  ;  ;  ;  ;  ;  ; ;| ;Port ;| ;Status  ; ;| ;Role  ; ;| ;Git Info Sha ;| ;Version ;|
+------------------+------+----------+--------+--------------+---------+
| ;"10.xxx.xxx.141" ;| ;9559 ;| ;"ONLINE" ;| ;"META" ;| ;"4805f8c"  ;  ;| ;"3.0.2" ;|
| ;"10.xxx.xxx.142" ;| ;9559 ;| ;"ONLINE" ;| ;"META" ;| ;"4805f8c"  ;  ;| ;"3.0.2" ;|
| ;"10.xxx.xxx.143" ;| ;9559 ;| ;"ONLINE" ;| ;"META" ;| ;"4805f8c"  ;  ;| ;"3.0.2" ;|
| ;"10.xxx.xxx.144" ;| ;9559 ;| ;"ONLINE" ;| ;"META" ;| ;"4805f8c"  ;  ;| ;"3.0.2" ;|
| ;"10.xxx.xxx.145" ;| ;9559 ;| ;"ONLINE" ;| ;"META" ;| ;"4805f8c"  ;  ;| ;"3.0.2" ;|
+------------------+------+----------+--------+--------------+---------+

观察 Raft 同步状态,在任一 Meta 节点服务器执行:

curl "http://127.0.0.1:19559/raft_info"

确认新节点日志追平,未出现长时间落后的 follower.

# 查询集群版本一致性
nebula-console-linux-amd64-v3.0.0 ;-addr ;10.xxx.xxx.144 ;-port ;9669 ;-u root -p 'user_password' -e 'SHOW HOSTS GRAPH;'
+------------------+------+----------+---------+--------------+---------+
| ;Host  ;  ;  ;  ;  ;  ; ;| ;Port ;| ;Status  ; ;| ;Role  ;  ;| ;Git Info Sha ;| ;Version ;|
+------------------+------+----------+---------+--------------+---------+
| ;"10.xxx.xxx.141" ;| ;9669 ;| ;"ONLINE" ;| ;"GRAPH" ;| ;"4805f8c"  ;  ;| ;  ;  ;  ;  ;|
| ;"10.xxx.xxx.142" ;| ;9669 ;| ;"ONLINE" ;| ;"GRAPH" ;| ;"4805f8c"  ;  ;| ;"3.0.2" ;|
| ;"10.xxx.xxx.143" ;| ;9669 ;| ;"ONLINE" ;| ;"GRAPH" ;| ;"4805f8c"  ;  ;| ;"3.0.2" ;|
| ;"10.xxx.xxx.144" ;| ;9669 ;| ;"ONLINE" ;| ;"GRAPH" ;| ;"4805f8c"  ;  ;| ;  ;  ;  ;  ;|
| ;"10.xxx.xxx.145" ;| ;9669 ;| ;"ONLINE" ;| ;"GRAPH" ;| ;"4805f8c"  ;  ;| ;  ;  ;  ;  ;|
+------------------+------+----------+---------+--------------+---------+
nebula-console-linux-amd64-v3.0.0 ;-addr ;10.xxx.xxx.144 ;-port ;9669 ;-u root -p 'user_password' -e 'SHOW HOSTS STORAGE;'
+------------------+------+----------+-----------+--------------+---------+
| ;Host  ;  ;  ;  ;  ;  ; ;| ;Port ;| ;Status  ; ;| ;Role  ;  ;  ;| ;Git Info Sha ;| ;Version ;|
+------------------+------+----------+-----------+--------------+---------+
| ;"10.xxx.xxx.141" ;| ;9779 ;| ;"ONLINE" ;| ;"STORAGE" ;| ;"4805f8c"  ;  ;| ;"3.0.2" ;|
| ;"10.xxx.xxx.142" ;| ;9779 ;| ;"ONLINE" ;| ;"STORAGE" ;| ;"4805f8c"  ;  ;| ;  ;  ;  ;  ;|
| ;"10.xxx.xxx.143" ;| ;9779 ;| ;"ONLINE" ;| ;"STORAGE" ;| ;"4805f8c"  ;  ;| ;"3.0.2" ;|
| ;"10.xxx.xxx.144" ;| ;9779 ;| ;"ONLINE" ;| ;"STORAGE" ;| ;"4805f8c"  ;  ;| ;  ;  ;  ;  ;|
| ;"10.xxx.xxx.145" ;| ;9779 ;| ;"ONLINE" ;| ;"STORAGE" ;| ;"4805f8c"  ;  ;| ;  ;  ;  ;  ;|
+------------------+------+----------+-----------+--------------+---------+

业务验证

业务查询进行并发压测,确认 QPS 与时延等符合预期。

感谢 Zhi@Li 老师的分享,欢迎大家把自己的开发实战经验分享到社区,帮助到更多小伙伴的同时,还能收获社区送出的精美礼物哦~


本文首发于 Zhi@Li 老师博客

https://www.modb.pro/db/1978003356962533376