跳转至

Storage 负载均衡

用户可以使用BALANCE语句平衡分片和 Raft leader 的分布,或者删除冗余的 Storage 服务器。

均衡分片分布

BALANCE DATA语句会开始一个任务,将 Nebula Graph 集群中的分片平均分配到所有 Storage 服务器。通过创建和执行一组子任务来迁移数据和均衡分片分布。

Danger

不要停止集群中的任何机器或改变机器的 IP 地址,直到所有子任务完成,否则后续子任务会失败。

示例

以横向扩容 Nebula Graph 为例,集群中增加新的 Storage 服务器后,新服务器上没有分片。

  1. 执行命令 SHOW HOSTS 检查分片的分布。

    nebual> SHOW HOSTS;
    +-------------+------+----------+--------------+-----------------------------------+------------------------+
    | Host        | Port | Status   | Leader count | Leader distribution               | Partition distribution |
    +-------------+------+----------+--------------+-----------------------------------+------------------------+
    | "storaged0" | 9779 | "ONLINE" | 4            | "basketballplayer:4"              | "basketballplayer:15"  |
    | "storaged1" | 9779 | "ONLINE" | 8            | "basketballplayer:8"              | "basketballplayer:15"  |
    | "storaged2" | 9779 | "ONLINE" | 3            | "basketballplayer:3"              | "basketballplayer:15"  |
    | "storaged3" | 9779 | "ONLINE" | 0            | "No valid partition"              | "No valid partition"   |
    | "storaged4" | 9779 | "ONLINE" | 0            | "No valid partition"              | "No valid partition"   |
    | "Total"     |      |          | 15           | "basketballplayer:15"             | "basketballplayer:45"  |
    +-------------+------+----------+--------------+-----------------------------------+------------------------+
    
  2. 执行命令BALANCE DATA将所有分片均衡分布。

    nebula> BALANCE DATA;
    +------------+
    | ID         |
    +------------+
    | 1614237867 |
    +------------+
    
  3. 根据返回的任务 ID,执行命令BALANCE DATA <balance_id>检查任务状态。

    nebula> BALANCE DATA 1614237867;
    +--------------------------------------------------------------+-------------------+
    | balanceId, spaceId:partId, src->dst                          | status            |
    +--------------------------------------------------------------+-------------------+
    | "[1614237867, 11:1, storaged1:9779->storaged3:9779]"         | "SUCCEEDED"       |
    | "[1614237867, 11:1, storaged2:9779->storaged4:9779]"         | "SUCCEEDED"       |
    | "[1614237867, 11:2, storaged1:9779->storaged3:9779]"         | "SUCCEEDED"       |
    ...
    | "Total:22, Succeeded:22, Failed:0, In Progress:0, Invalid:0" | 100               |
    +--------------------------------------------------------------+-------------------+
    
  4. 等待所有子任务完成,负载均衡进程结束,执行命令SHOW HOSTS确认分片已经均衡分布。

    Note

    BALANCE DATA不会均衡 leader 的分布。均衡 leader 请参见均衡 leader 分布

    nebula> SHOW HOSTS;
    +-------------+------+----------+--------------+-----------------------------------+------------------------+
    | Host        | Port | Status   | Leader count | Leader distribution               | Partition distribution |
    +-------------+------+----------+--------------+-----------------------------------+------------------------+
    | "storaged0" | 9779 | "ONLINE" | 4            | "basketballplayer:4"              | "basketballplayer:9"   |
    | "storaged1" | 9779 | "ONLINE" | 8            | "basketballplayer:8"              | "basketballplayer:9"   |
    | "storaged2" | 9779 | "ONLINE" | 3            | "basketballplayer:3"              | "basketballplayer:9"   |
    | "storaged3" | 9779 | "ONLINE" | 0            | "No valid partition"              | "basketballplayer:9"   |
    | "storaged4" | 9779 | "ONLINE" | 0            | "No valid partition"              | "basketballplayer:9"   |
    | "Total"     |      |          | 15           | "basketballplayer:15"             | "basketballplayer:45"  |
    +-------------+------+----------+--------------+-----------------------------------+------------------------+
    

如果有子任务失败,请重新执行BALANCE DATA。如果重做负载均衡仍然不能解决问题,请到 Nebula Graph 社区寻求帮助。

停止负载均衡任务

停止负载均衡任务,请执行命令BALANCE DATA STOP

  • 如果没有正在执行的负载均衡任务,会返回错误。
  • 如果有正在执行的负载均衡任务,会返回停止的任务 ID(balance_id)。

BALANCE DATA STOP不会停止正在执行的子任务,而是取消所有后续子任务。用户可以执行命令BALANCE DATA <balance_id>检查停止的任务状态。

一旦所有子任务都完成或停止,用户可以再次执行命令BALANCE DATA

  • 如果前一个负载均衡任务的任何一个子任务失败,Nebula Graph 会重新启动之前的负载均衡任务。
  • 如果前一个负载均衡任务的任何一个子任务都没有失败,Nebula Graph 会启动一个新的的负载均衡任务。

重置负载均衡任务

如果停止负载均衡任务后重新执行仍然失败,可以尝试用命令BALANCE DATA RESET PLAN重置负载均衡任务,该操作会清空旧的任务。之后再使用BALANCE DATA命令,会新建负载均衡任务,而不是执行旧的任务。

移除 Storage 服务器

移除指定的 Storage 服务器来缩小集群规模,可以使用命令BALANCE DATA REMOVE <host_list>

示例

如果需要移除以下两台 Storage 服务器。

服务器名称 IP 地址 端口
storage3 192.168.0.8 9779
storage4 192.168.0.9 9779

请执行如下命令:

BALANCE DATA REMOVE 192.168.0.8:9779,192.168.0.9:9779;

Nebula Graph 将启动一个负载均衡任务,迁移 storage3 和 storage4 中的分片,然后将服务器从集群中移除。

Note

已下线节点状态会显示为 OFFLINE。该记录一天后删除,或更改 meta 配置项 removed_threshold_sec

均衡 leader 分布

BALANCE DATA只能均衡分片分布,不能均衡 Raft leader 分布。用户可以使用命令BALANCE LEADER均衡 leader 分布。

示例

nebula> BALANCE LEADER;

用户可以执行SHOW HOSTS检查结果。

nebula> SHOW HOSTS;
+-------------+------+----------+--------------+-----------------------------------+------------------------+
| Host        | Port | Status   | Leader count | Leader distribution               | Partition distribution |
+-------------+------+----------+--------------+-----------------------------------+------------------------+
| "storaged0" | 9779 | "ONLINE" | 3            | "basketballplayer:3"              | "basketballplayer:9"   |
| "storaged1" | 9779 | "ONLINE" | 3            | "basketballplayer:3"              | "basketballplayer:9"   |
| "storaged2" | 9779 | "ONLINE" | 3            | "basketballplayer:3"              | "basketballplayer:9"   |
| "storaged3" | 9779 | "ONLINE" | 3            | "basketballplayer:3"              | "basketballplayer:9"   |
| "storaged4" | 9779 | "ONLINE" | 3            | "basketballplayer:3"              | "basketballplayer:9"   |
| "Total"     |      |          | 15           | "basketballplayer:15"             | "basketballplayer:45"  |
+-------------+------+----------+--------------+-----------------------------------+------------------------+

Caution

在 Nebula Graph 2.6.2 中,Leader 切换会导致短时的大量请求错误(Storage Error E_RPC_FAILURE),处理方法见 FAQ


最后更新: March 7, 2023