NebulaGraph 是一款开源分布式图数据库,凭借高可用、可扩展、易运维、高性能等特性,NebulaGraph 已被美团、京东、快手和腾讯等多家企业选用,应用于数据治理、实时推荐、反欺诈、风险控制等多种场景。
数据库的部署和运维是常见的用户痛点。对于开源数据库,上手难度则更高,因为用户往往需要自己不断摸索如何完成这些事情,这也对开源数据库的流行度带来不利的影响。因此,开源数据库社区中往往都会有开发者贡献各种各样的部署和运维方式,而对于 NebulaGraph 这样有专门的图查询语言和更加复杂的分布式架构,意味着新用户要面对更陡峭的学习曲线。为了解决这个问题, NebulaGraph 社区提供了多种使用 Operator 部署数据库的方式。KubeBlocks 就作为其中之一,在 K8s 的环境中对部署和使用 NebulaGraph 就提供了非常有益的补充。
一、理解 Nebula 架构的基础上,3步实现集成
KubeBlocks 作为 K8s 生态的框架基础设施,熟悉 K8s 的开发者无需了解新概念即可快速上手,3 步即可集成一个新的数据库。
1. 理解 NeublaGraph 架构
这一步,我们需要理解集群的组成,了解每个模块的配置启动方式。如图 1 所示,一个 NebulaGraph 集群由内核(core)和客户端(client)两大部分组成。其中内核有三个组件,分别是:
- Meta 服务:由 nebula-metad 进程提供,负责数据管理,例如 Schema 操作、集群管理和用户权限管理等;
- Graph 服务:由 nebula-graphd 进程提供,负责处理计算请求;
- Storage 服务:由 nebula-storaged 进程提供,负责存储数据。
图 1. NebulaGraph 架构图 (来源:Nebula)
2. 创建集群模板
这一步,我们需要定义集群拓扑,配置和版本等信息。KubeBlocks Addon 支持多种扩展方式,目前主流的是 Helm 方式。我们需要创建一个 NebulaGraph 的 Helm chart,并增加以下模板文件:
- ClusterDefinition.yaml:用于定义集群拓扑,组件配置和组件启动脚本。根据第一步的分析,我们知道 NebulaGraph 集群是一个多组件的形态,需要 3 个内核组件,和 1 个客户端组件。
- ClusterVersion.yaml:用于定义版本信息,例如每个组件的 docker images。目前支持的 NebulaGraph 版本是 Nebula 3.5.0。每个 ClusterDefinition 可关联多个 ClusterVersion。未来 NebulaGraph 发布新版本后,我们只需添加新的 ClusterVersion 文件即可。
这一步,我们可以快速地在本地环境调试 Helm chart,校验正确性。
图 2. Nebula Helm Chart PR
3. 添加 Addon 配置
我们只需再添加大约 30 行 yaml 代码,就可以将新添加的 NebulaGraph 配置为 KubeBlocks 的 Addon,非常方便。
图 3. Nebula Addon PR
欢迎大家参考具体的 PR:
如果开发者希望将其它的数据库接入 KubeBlocks,可以参考 KubeBlocks 开源 repository 中已有的其它数据库的代码。目前 KubeBlocks 已经支持了非常丰富的数据库架构和部署形态,如 MySQL、Redis、MongoDB 等,包括多种使用主备复制架构和基于 Paxos/Raft 的分布式架构。
🚀插播一则预告:
小猿姐已经约了 KubeBlocks 开发同学安排 Addon 系列教程,手把手教你快速集成到 KubeBlocks。
二、如何在 KubeBlocks 上体验 NebulaGraph 集群
你可以通过以下方式在 KubeBlocks 上体验 NebulaGraph 集群。
1. 安装 kbcli 和 KubeBlocks
请安装最新版的 kbcli 和 KubeBlocks。
参考文档:
2. 激活 Addon
安装了最新版本的 KubeBlocks 后,可以看到 Nebula 已经出现在 KubeBlocks 的 Addon 列表中。
2.1 查看 Addon 列表
kbcli addon list
可以看到 Nebula 出现在列表中,但是默认并没有激活。
图 4. KubeBlocks Addon 列表
说明:
如果没有找到 nebula addon,请检查安装版本,确保已安装新版本的 kbcli 和 KubeBlocks。
2.2 激活 Nebula Addon
kbcli addon enable nebula
2.3 校验 Addon 是否激活
因为网络原因,激活 Addon 可能需要一点时间,可通过如下 addon describe 命令查看是否激活成功。若状态显示 Enabled
则激活成功。
kbcli addon describe nebula
3. 创建 NebulaGraph 集群
3.1 创建 NebulaGraph 集群
激活 Addon 后,我们可以像创建 MySQL、PostgreSQL 集群一样,快速创建一个 NebulaGraph 集群。
kbcli cluster create mynebula --cluster-definition nebula
其中
mynebula
是集群名称,可以替换为你想要的集群名。--cluster-definition
指定了从哪个预定义的集群模版开始创建,我们选择 nebula。
3.2 查看集群的组成。
可以看到如下结果:
kbcli cluster list-components mynebula
>
NAME NAMESPACE CLUSTER TYPE IMAGE
nebula-console default mynebula nebula-console docker.io/vesoft/nebula-storaged:v3.5.0
nebula-graphd default mynebula nebula-graphd docker.io/vesoft/nebula-storaged:v3.5.0
nebula-metad default mynebula nebula-metad docker.io/vesoft/nebula-storaged:v3.5.0
nebula-storaged default mynebula nebula-storaged docker.io/vesoft/nebula-storaged:v3.5.0
一个 NebulaGraph 集群由 4 个组件组成,包括 console、graphd、metad 和 storaged,与前文介绍的 NebulaGraph 架构呼应。
3.3 查看集群的各个实例
可以看到每个组件各自有多少实例,每个实例是什么规格。
kbcli cluster list-instances mynebula
>
NAME NAMESPACE CLUSTER COMPONENT STATUS ROLE ACCESSMODE AZ CPU(REQUEST/LIMIT) MEMORY(REQUEST/LIMIT) STORAGE NODE CREATED-TIME
mynebula-nebula-console-65844d578b-vf9kz default mynebula nebula-console Running <none> <none> <none> 1 / 1 1Gi / 1Gi data:20Gi kind-control-plane/172.19.0.2 Jul 09,2023 17:03 UTC+0800
mynebula-nebula-graphd-0 default mynebula nebula-graphd Running <none> <none> <none> 1 / 1 1Gi / 1Gi data:20Gi kind-control-plane/172.19.0.2 Jul 09,2023 17:03 UTC+0800
mynebula-nebula-metad-0 default mynebula nebula-metad Running <none> <none> <none> 1 / 1 1Gi / 1Gi data:20Gi kind-control-plane/172.19.0.2 Jul 09,2023 17:03 UTC+0800
mynebula-nebula-storaged-0 default mynebula nebula-storaged Running <none> <none> <none> 1 / 1 1Gi / 1Gi data:20Gi kind-control-plane/172.19.0.2 Jul 09,2023 17:03 UTC+0800
3.4 查看集群状态
若 Status 为 Running
则表示集群已经创建成功。
kbcli cluster list mynebula
>
NAME NAMESPACE CLUSTER-DEFINITION VERSION TERMINATION-POLICY STATUS CREATED-TIME
mynebula default nebula nebula-v3.5.0 Delete Running Jul 09,2023 17:03 UTC+0800
3.5 查看当前数据和分布状态
连接集群后,可通过 show hosts
命令查看当前数据和分布状态。
kbcli cluster connect mynebula
>
Connect to instance mynebula-nebula-console-65844d578b-vf9kz
Welcome!
(root@nebula) [(none)]> SHOW HOSTS;
+------------------------------------------------------------------------------------------+------+----------+--------------+----------------------+------------------------+---------+
| Host | Port | Status | Leader count | Leader distribution | Partition distribution | Version |
+------------------------------------------------------------------------------------------+------+----------+--------------+----------------------+------------------------+---------+
| "mynebula-nebula-storaged-0.mynebula-nebula-storaged-headless.default.svc.cluster.local" | 9779 | "ONLINE" | 0 | "No valid partition" | "No valid partition" | "3.5.0" |
+------------------------------------------------------------------------------------------+------+----------+--------------+----------------------+------------------------+---------+
Got 1 rows (time spent 7.119ms/9.574125ms)
Sun, 09 Jul 2023 08:53:00 UTC
更多 NebulaGraph Statement 可参考 Nebula 官方文档。
4. 运维 NebulaGraph 集群
当集群状态为 Running 后,可以登录集群查看信息,并进行常见的运维操作,例如 hscale
、vscale
、volume-expand
、start
、stop
等。
下面以水平扩缩容(hscale)为例,展示对 NebulaGraph 集群的运维过程。可通过kbcli的hscale 命令对集群的指定组件扩缩容。例如,将 nebula-storaged 组件扩展为 3 个节点。
kbcli cluster hscale mynebula --components nebula-storaged --replicas 3
通过kbcli cluster list mynebula命令再次查看集群状态,可以看到状态变更为 HorizontalScaling
。
NAME NAMESPACE CLUSTER-DEFINITION VERSION TERMINATION-POLICY STATUS CREATED-TIME
mynebula default nebula nebula-v3.5.0 Delete HorizontalScaling Jul 09,2023 17:03 UTC+0800
等待几十秒后,扩容成功,再次查看实例信息,可以看到已经有 3 个 nebula-storaged 节点。
kbcli cluster list-instances mynebula
>
NAME NAMESPACE CLUSTER COMPONENT STATUS ROLE ACCESSMODE AZ CPU(REQUEST/LIMIT) MEMORY(REQUEST/LIMIT) STORAGE NODE CREATED-TIME
mynebula-nebula-console-65844d578b-vf9kz default mynebula nebula-console Running <none> <none> <none> 1 / 1 1Gi / 1Gi data:20Gi kind-control-plane/172.19.0.2 Jul 09,2023 17:03 UTC+0800
mynebula-nebula-graphd-0 default mynebula nebula-graphd Running <none> <none> <none> 1 / 1 1Gi / 1Gi data:20Gi kind-control-plane/172.19.0.2 Jul 09,2023 17:03 UTC+0800
mynebula-nebula-metad-0 default mynebula nebula-metad Running <none> <none> <none> 1 / 1 1Gi / 1Gi data:20Gi kind-control-plane/172.19.0.2 Jul 09,2023 17:03 UTC+0800
mynebula-nebula-storaged-0 default mynebula nebula-storaged Running <none> <none> <none> 1 / 1 1Gi / 1Gi data:20Gi kind-control-plane/172.19.0.2 Jul 09,2023 17:03 UTC+0800
mynebula-nebula-storaged-1 default mynebula nebula-storaged Running <none> <none> <none> 1 / 1 1Gi / 1Gi data:20Gi kind-control-plane/172.19.0.2 Jul 09,2023 17:46 UTC+0800
mynebula-nebula-storaged-2 default mynebula nebula-storaged Running <none> <none> <none> 1 / 1 1Gi / 1Gi data:20Gi kind-control-plane/172.19.0.2 Jul 09,2023 17:47 UTC+0800
再次连接 NebulaGraph 集群,查看存储节点信息,可以看到新增的两个节点也已经可用,状态为online
。
kbcli cluster connect mynebula
>
Connect to instance mynebula-nebula-console-65844d578b-vf9kz
Welcome!
(root@nebula) [(none)]> SHOW HOSTS
+------------------------------------------------------------------------------------------+------+----------+--------------+----------------------+------------------------+---------+
| Host | Port | Status | Leader count | Leader distribution | Partition distribution | Version |
+------------------------------------------------------------------------------------------+------+----------+--------------+----------------------+------------------------+---------+
| "mynebula-nebula-storaged-0.mynebula-nebula-storaged-headless.default.svc.cluster.local" | 9779 | "ONLINE" | 0 | "No valid partition" | "No valid partition" | "3.5.0" |
| "mynebula-nebula-storaged-1.mynebula-nebula-storaged-headless.default.svc.cluster.local" | 9779 | "ONLINE" | 0 | "No valid partition" | "No valid partition" | "3.5.0" |
| "mynebula-nebula-storaged-2.mynebula-nebula-storaged-headless.default.svc.cluster.local" | 9779 | "ONLINE" | 0 | "No valid partition" | "No valid partition" | "3.5.0" |
+------------------------------------------------------------------------------------------+------+----------+--------------+----------------------+------------------------+---------+
Got 3 rows (time spent 1.971ms/5.443458ms)
Sun, 09 Jul 2023 10:00:06 UTC
未来我们还会逐步集成 NebulaGraph 的备份/恢复、监控、参数变更等能力。想要了解更多 kbcli支持的运维命令,请参考 CLI 文档。
三、用开源的方式解决开源的问题
KubeBlocks 对在 K8s 的环境中部署和使用 NebulaGraph 提供了非常有益的补充,属于“用开源的方式解决开源的问题”。我们可以方便地通过 KubeBlocks 的 Addon 预先定义好 NebulaGraph 所需的各类软硬件配置参数和资源项目,通过自动化的方式帮助用户处理部署和启动过程中的一些可能令人头大的细节。用户只需要几行命令,就可以在几分钟内拉起一个 NebulaGraph 集群,开始图数据库使用之旅。
小猿姐说
文字版集成过程看完觉得不够过瘾、不够刺激?小猿姐邀请了开发同学到本周六的 meetup 现场为你亲自讲解🤩
当然还有 KubeBlocks 核心开发者和 NebulaGraph PD 来分享 K8s Operator 如何设计以及 NebulaGraph 的使用秘籍。现场还备好了周边、茶歇~动动手指,提交报名,小猿姐和社区小伙伴们等你来哟~
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。