在文章《Nebula 架构剖析系列(一)图数据库的存储设计》中,咱们提过度布式图存储的管理由 Meta Service 来统一调度,它记录了全部 partition 的分布状况,以及当前机器的状态。当 DBA 增减机器时,只须要经过 console 输入相应的指令,Meta Service 便可以生成整个 Balance 计划并执行。而之因此没有采用彻底自动 Balance 的方式,主要是为了减小数据搬迁对于线上服务的影响,Balance 的时机由用户本身控制。git
在本文中咱们将着重讲解在存储层如何实现数据和服务的负载平衡。github
简单回顾一下,Nebula Graph 的服务可分为 graph,storage,meta。本文主要描述对于存储层(storage)的数据和服务的 balance。这些都是经过 Balance 命令来实现的:Balance 命令有两种,一种须要迁移数据,命令为 BALANCE DATA
;另外一种不须要迁移数据,只改变 partition 的 raft-leader 分布(负载均衡),命令为 BALANCE LEADER
。shell
集群数据迁移数据库
Step 1:准备工做segmentfault
在图数据库 Nebula Graph 中, Balance 主要用来 balance leader 和 partition,只涉及 leader 和 partition 在机器之间转移,不会增长或者减小 leader 和 partition 的数量。bash
上线新机器并启动相应的 Nebula 服务后,storage 会自动向 meta 注册。Meta 会计算出一个新的 partition 分布,而后经过 remove partition和 add partition 逐步将数据从老机器搬迁到新的机器上。这个过程所对应的命令是 BALANCE DATA
,一般数据搬迁是个比较漫长的过程。架构
但 BALANCE DATA 仅改变了数据和副本在机器之间的均衡分布,leader(和对应的负载) 是不会改变的,所以还须要经过命令BALANCE LEADER
来实现负载的均衡。这个过程也是经过 meta 实现的。负载均衡
如下举例说明 BALANCE DATA
的使用方式。本例将从 3 个实例(进程)扩展到 8 个实例(进程):分布式
部署一个 3 副本的集群,1个 graphd,1个 metad,3 个 storaged(具体部署方式请参考集群部署文:https://zhuanlan.zhihu.com/p/80335605),经过 SHOW HOSTS
命令能够看到集群的状态信息:url
按照集群部署文档部署好 3 副本集群以后,用 SHOW HOSTS
命令查看下如今集群状况:
nebula> SHOW HOSTS ================================================================================================ | Ip | Port | Status | Leader count | Leader distribution | Partition distribution | ================================================================================================ | 192.168.8.210 | 34600 | online | 0 | No valid partition | No valid partition | ------------------------------------------------------------------------------------------------ | 192.168.8.210 | 34700 | online | 0 | No valid partition | No valid partition | ------------------------------------------------------------------------------------------------ | 192.168.8.210 | 34500 | online | 0 | No valid partition | No valid partition | ------------------------------------------------------------------------------------------------ Got 3 rows (Time spent: 5886/6835 us)
SHOW HOSTS
返回结果解释:
expired_threshold_sec
来修改,当前默认值是 10 分钟。能够看到 _Leader distribution_ 和 _Partition distribution_ 暂时都没有数据。
建立一个名为 test 的图空间,包含 100 个 partition,每一个 partition 有 3 个副本。
nebula> CREATE SPACE test (PARTITION_NUM=100, REPLICA_FACTOR=3)
片刻后,使用 SHOW HOSTS
命令显示集群的分布。
nebula> SHOW HOSTS ================================================================================================ | Ip | Port | Status | Leader count | Leader distribution | Partition distribution | ================================================================================================ | 192.168.8.210 | 34600 | online | 0 | test: 0 | test: 100 | ------------------------------------------------------------------------------------------------ | 192.168.8.210 | 34700 | online | 52 | test: 52 | test: 100 | ------------------------------------------------------------------------------------------------ | 192.168.8.210 | 34500 | online | 48 | test: 48 | test: 100 | ------------------------------------------------------------------------------------------------
如上,建立包含 100 个 partitio_n 和 3 个 _replica 图空间以后,3 个实例的_Leader distribution_ 和 _Partition distribution _有了对应的数值,对应的 _Partition distribution_都为 100。固然,这样的 learder 分布还不均匀。
启动 5 个新 storaged 实例进行扩容。启动完毕后,使用 SHOW HOSTS
命令查看新的状态:
nebula> SHOW HOSTS ================================================================================================ | Ip | Port | Status | Leader count | Leader distribution | Partition distribution | ================================================================================================ | 192.168.8.210 | 34600 | online | 0 | test: 0 | test: 100 | ------------------------------------------------------------------------------------------------ | 192.168.8.210 | 34900 | online | 0 | No valid partition | No valid partition | ------------------------------------------------------------------------------------------------ | 192.168.8.210 | 35940 | online | 0 | No valid partition | No valid partition | ------------------------------------------------------------------------------------------------ | 192.168.8.210 | 34920 | online | 0 | No valid partition | No valid partition | ------------------------------------------------------------------------------------------------ | 192.168.8.210 | 44920 | online | 0 | No valid partition | No valid partition | ------------------------------------------------------------------------------------------------ | 192.168.8.210 | 34700 | online | 52 | test: 52 | test: 100 | ------------------------------------------------------------------------------------------------ | 192.168.8.210 | 34500 | online | 48 | test: 48 | test: 100 | ------------------------------------------------------------------------------------------------ | 192.168.8.210 | 34800 | online | 0 | No valid partition | No valid partition | ------------------------------------------------------------------------------------------------
上新实例以后,集群由原来 3 个实例变成了 8 个实例。上图数据库 icon 为蓝色的图示为新增的 5 个实例,此时因为仅仅加入了集群,新实例的状态为 Online,但此时_Leader distribution_ 和 Partition distribution 并无数值,说明还不会参与服务。
运行 BALANCE DATA
命令。
nebula> BALANCE DATA ============== | ID | ============== | 1570761786 | --------------
若是当前集群有新机器加入,则会生成一个新的计划 ID。对于已经平衡的集群,重复运行 BALANCE DATA
不会有任何新操做。若是当前有正在执行的计划,那会显示当前计划的 ID。
也可经过 BALANCE DATA $id
查看这个 balance 的具体执行进度。
nebula> BALANCE DATA 1570761786 =============================================================================== | balanceId, spaceId:partId, src->dst | status | =============================================================================== | [1570761786, 1:1, 192.168.8.210:34600->192.168.8.210:44920] | succeeded | ------------------------------------------------------------------------------- | [1570761786, 1:1, 192.168.8.210:34700->192.168.8.210:34920] | succeeded | ------------------------------------------------------------------------------- | [1570761786, 1:1, 192.168.8.210:34500->192.168.8.210:34800] | succeeded | ------------------------------------------------------------------------------- ...//这里省略一些。如下一行为例 ------------------------------------------------------------------------------- | [1570761786, 1:88, 192.168.8.210:34700->192.168.8.210:35940] | succeeded | ------------------------------------------------------------------------------- | Total:189, Succeeded:170, Failed:0, In Progress:19, Invalid:0 | 89.947090% | ------------------------------------------------------------------------------- Got 190 rows (Time spent: 5454/11095 us)
BALANCE DATA $id
返回结果说明:
以 1570761786, 1:88, 192.168.8.210:34700->192.168.8.210:35940
为例:
第二列表示当前 task 的运行状态,有 4 种状态
最后对全部 task 运行状态的统计,部分 partition 还没有完成迁移。
BALANCE DATA STOP
命令用于中止已经开始执行的 balance data 计划。若是没有正在运行的 balance 计划,则会返回错误提示。若是有正在运行的 balance 计划,则会返回计划对应的 ID。
因为每一个 balance 计划对应若干个 balance task,
BALANCE DATA STOP
不会中止已经开始执行的 balance task,只会取消后续的 task,已经开始的 task 将继续执行直至完成。
用户能够在 BALANCE DATA STOP
以后输入 BALANCE DATA $id
来查看已经中止的 balance 计划状态。
全部已经开始执行的 task 完成后,能够再次执行 BALANCE DATA
,从新开始 balance。若是以前中止的计划中有失败的 task,则会继续执行以前的计划,若是以前中止的计划中全部 task 都成功了,则会新建一个 balance 计划并开始执行。
大多数状况下,搬迁数据是个比较漫长的过程。可是搬迁过程不会影响已有服务。如今能够经过 SHOW HOSTS
查看运行后的 partition 分布。
nebula> SHOW HOSTS ================================================================================================ | Ip | Port | Status | Leader count | Leader distribution | Partition distribution | ================================================================================================ | 192.168.8.210 | 34600 | online | 3 | test: 3 | test: 37 | ------------------------------------------------------------------------------------------------ | 192.168.8.210 | 34900 | online | 0 | test: 0 | test: 38 | ------------------------------------------------------------------------------------------------ | 192.168.8.210 | 35940 | online | 0 | test: 0 | test: 37 | ------------------------------------------------------------------------------------------------ | 192.168.8.210 | 34920 | online | 0 | test: 0 | test: 38 | ------------------------------------------------------------------------------------------------ | 192.168.8.210 | 44920 | online | 0 | test: 0 | test: 38 | ------------------------------------------------------------------------------------------------ | 192.168.8.210 | 34700 | online | 35 | test: 35 | test: 37 | ------------------------------------------------------------------------------------------------ | 192.168.8.210 | 34500 | online | 24 | test: 24 | test: 37 | ------------------------------------------------------------------------------------------------ | 192.168.8.210 | 34800 | online | 38 | test: 38 | test: 38 | ------------------------------------------------------------------------------------------------ Got 8 rows (Time spent: 5074/6488 us)
_Partition distribution _相近,partition 总数 300 不变且 partition 已均衡的分布至各个实例。
若是有运行失败的 task,可再次运行 BALANCE DATA
命令进行修复。若是屡次运行仍没法修复,请与社区联系 GitHub。
BALANCE DATA
仅能 balance partition,可是 leader 分布仍然不均衡,这意味着旧实例的服务较重,而新实例的服务能力未获得充分使用。运行 BALANCE LEADER
从新分布 Raft leader:
nebula> BALANCE LEADER
片刻后,使用 SHOW HOSTS
命令查看,此时 Raft leader 已均匀分布至全部的实例。
nebula> SHOW HOSTS ================================================================================================ | Ip | Port | Status | Leader count | Leader distribution | Partition distribution | ================================================================================================ | 192.168.8.210 | 34600 | online | 13 | test: 13 | test: 37 | ------------------------------------------------------------------------------------------------ | 192.168.8.210 | 34900 | online | 12 | test: 12 | test: 38 | ------------------------------------------------------------------------------------------------ | 192.168.8.210 | 35940 | online | 12 | test: 12 | test: 37 | ------------------------------------------------------------------------------------------------ | 192.168.8.210 | 34920 | online | 12 | test: 12 | test: 38 | ------------------------------------------------------------------------------------------------ | 192.168.8.210 | 44920 | online | 13 | test: 13 | test: 38 | ------------------------------------------------------------------------------------------------ | 192.168.8.210 | 34700 | online | 12 | test: 12 | test: 37 | ------------------------------------------------------------------------------------------------ | 192.168.8.210 | 34500 | online | 13 | test: 13 | test: 37 | ------------------------------------------------------------------------------------------------ | 192.168.8.210 | 34800 | online | 13 | test: 13 | test: 38 | ------------------------------------------------------------------------------------------------ Got 8 rows (Time spent: 5039/6346 us)
如上, BALANCE LEADER
成功执行后,新增的实例和原来的实例(对应上图 icon 蓝色和黑色图示)的 _Leader distribution_相近, 全部实例已均衡,此外,也能够看到 Balance 命令只涉及 leader 和 partition 在物理机器上的转移,并无增长或者减小 leader 和 partition。
Nebula Graph 支持指定须要下线的机器进行批量缩容。语法为 BALANCE DATA REMOVE $host_list
,例如:BALANCE DATA REMOVE 192.168.0.1:50000,192.168.0.2:50000
,将指定移除 192.168.0.1:50000,192.168.0.2:50000 两台机器。
若是移除指定机器后,不知足副本数要求(例如剩余机器数小于副本数),Nebula Graph 将拒绝本次 balance 请求,并返回相关错误码。
上面讲了如何从 3 个实例变成 8个实例的集群,若是你对上文有疑问,记得在本文的评论区留言哈。咱们如今看看上面迁移的过程,_192.168.8.210:34600_ 这个实例的状态变化。
说明:有颜色为红色说明对应的数值发生变化,若是数值不变,则为黑色。
最后是 Nebula 的 GitHub 地址,欢迎你们试用,有什么问题能够向咱们提 issue。GitHub 地址:https://github.com/vesoft-inc/nebula