雲原生基礎設施實踐:NebulaGraph 的 KubeBlocks 集成故事

像是 NebulaGraph 這類基礎設施上雲,通用的方法一般是將線下物理機替換成雲端的虛擬資源,依託各大雲服務廠商實現“服務上雲”。但還有一種選擇,就是依託雲數據基礎設施,將數據庫產品變成爲雲生態的一環,不只是提供自身的數據雲服務,還能同其他的數據庫一起分析挖掘業務數據價值。
在本篇分享中,讓你在瞭解何爲雲原生基礎設施之餘,可以獲得更多的 NebulaGraph 部署使用方法。又有新的使用姿勢了,下面一起來了解下這個集成過程以及相關的使用方法。

KubeBlocks 是什麼

在介紹之前,可能有了解雲生態的小夥伴,會好奇標題中的 “KubeBlocsk”是什麼?它帶有 Kube- 前綴,和雲原生什麼關係?

KubeBlocks 的名字源自 Kubernetes(K8s)和樂高積木(Blocks),致力於讓 K8s 上的數據基礎設施管理就像搭樂高積木一樣,既高效又有趣。

它是基於 Kubernetes 的雲原生數據基礎設施,爲用戶提供了關係型數據庫、NoSQL 數據庫、向量數據庫以及流計算系統的管理控制功能。

下面開始進入主菜,KubeBlocsk 對 NebulaGraph 的集成。別看本文篇幅不短,事實上集成過程非常便捷,三步就能完成本次集成實踐。

KubeBlocks 快速集成圖數據庫 NebulaGraph

因爲本身 KubeBlocks 是 K8s 生態的框架基礎設施,因此,你如果要基於 KubeBlocks 集成數據庫或者是計算引擎的話,本章節內容就是相關的分享。簡單來說,只要你熟悉 K8s,不需要學習任何新概念,像下面這樣,3 步就搞定一個數據庫的集成。

如果你不想了解集成過程,可以跳過本章節,直接進入到下一個章節的使用部分,瞭解如何在 KubeBlocks 上使用數據庫。

下面,講述本次 NebulaGraph 的集成過程,雖然本文以 NebulaGraph 爲例,但是集成過程是相似的,可以舉一反三。

1. NebulaGraph 的服務架構

第一步,我們需要理解集羣的組成,瞭解圖數據庫 NebulaGraph 的每個模塊作用,以及其配置啓動方式。

圖 1: Nebula Graph 的架構圖(來源:https://github.com/vesoft-inc/nebula)

如上圖所示,完整的 NebulaGraph 系統是由內核和周邊工具組成,包括不限於 nebula-console、nebula-python、nebula-java 等客戶端。而其中的內核 Core 部分主要由三大服務組成,分別是:

  • Meta Service:由 nebula-metad 進程提供,負責元數據管理,例如 Schema 操作、集羣管理和用戶權限管理等。如果集羣部署的話,多個 metad 之間通過 raft 保證數據一致性;
  • Graph Service:由 nebula-graphd 進程提供,負責處理計算請求;
  • Storage Service:由 nebula-storaged 進程提供,負責存儲數據。

2. 創建集羣模板

在這一步,定義下集羣拓撲、配置和版本等信息。

KubeBlocks Addon 支持多種擴展方式,目前主流的擴展方式是 Helm。因此,這裏採用 Helm 方式來搞定相關部署配置:

創建一個 NebulaGraph 的 Helm Chart,並增加以下模板文件:

  • clusterdefinition.yaml:用來定義集羣拓撲、組件配置和組件啓動腳本。根據第一步的分析,我們知道 NebulaGraph 集羣是一個多組件的形態,如果我們要正常使用圖數據的話,需要用到 3 個內核組件,和 1 個客戶端組件。因此,在這個文件中,組件配置中需要包括 4 個組件,後面使用實踐部分會講到,這裏不做贅述;
  • clusterversion.yaml:用來定義版本信息,例如:每個組件的 Docker Images。在本次實踐中,支持的是 NebulaGraph v3.5.0 版本。此外,一個 clusterdefinition.yaml 文件可以關聯多個 clusterversion.yaml 文件。因此,後續即使 NebulaGraph 發佈了新版本,我們只用添加新的 clusterversion.yaml 文件就好。

搞定模版後,來快速地在本地環境調試下 Helm Chart,來校驗正確性。

3. 添加 Addon 配置

最後,只用再添加大約 30 行 YAML 代碼,就可以將新添加的 NebulaGraph 配置爲 KubeBlocks 的 addon,非常方便。

就這樣,三個步驟,就完成了 KubeBlocks 對 NebulaGraph 的集成。

附上相關的 PR 方便你做參考,整個過程非常簡單:

圖 2. NebulaGraph Helm Chart PR

圖 3. NebulaGraph Addon PR

當然,如果你想在 KubeBlocks 上集成其他數據,一統你的那些數據庫們,可以參考上面的思路。按照官方說法:“目前 KubeBlocks 已經支持了非常豐富的數據庫架構和部署形態,如 MySQL、Redis、MongoDB 等,包括多種使用主備複製架構和基於 Paxos/Raft 的分佈式架構”。

下面,來說說如何在 KubeBlocks 上使用圖數據庫 NebulaGraph。

如何在 KubeBlocks 上使用 NebulaGraph

你可以通過以下方式在 KubeBlocks 上體驗 NebulaGraph 集羣。

1. 安裝 kbcli 和 KubeBlocks

安裝最新版的 kbcli 和 KubeBlocks,下面是參考文檔:

2. 激活 Addon

安裝了最新版本的 KubeBlocks 後,可以看到 NebulaGraph 已經出現在 KubeBlocks 的 addon 列表中。

下面命令可以查看到所有的 addon:

kbcli addon list

執行之後,我們可以看到 nebula 已經出現在列表中,但是它的狀態是 Disabled。爲了有效地控制服務資源,KubeBlocks 默認不會激活相關 addon 服務,只激活了幾個主流數據庫。

注: 如果在列表中,沒有找到 nebula addon,請檢查下你安裝的軟件版本,確保已安裝新版本的 kbcli 和 KubeBlocks。

因爲 nebula 服務處於未激活的狀態,下面我們來激活下服務:

執行下面命令:

kbcli addon enable nebula

因爲網絡原因, 激活 Addon 可能需要一點時間, 可通過如下 addon describe 命令查看是否激活成功。

kbcli addon describe nebula
Name:               nebula
Description:        NebulaGraph is an Apache 2.0 licensed distributed graph database.
Labels:             kubeblocks.io/provider=community
Type:               Helm
Status:             Enabled
Auto-install:       false

若狀態顯示 Enabled 則表示服務已經激活成功。

3. 創建 NebulaGraph 集羣

  1. 創建 NebulaGraph 集羣

激活我們的 nebula 服務後,我們可以像創建 MySQL、PostgreSQL 集羣一樣,快速創建一個 NebulaGraph 集羣,這裏我們管它叫“mynebula”。像下面一樣,一行命令搞定集羣創建:

kbcli cluster create mynebula --cluster-definition nebula

其中:

  • mynebula 是集羣名稱, 可以替換爲你想要的集羣名。
  • --cluster-definition 指定了從哪個預定義的集羣模板開始創建,我們選擇 nebula。
  1. 查看集羣的各個組件

list-components 命令可查看集羣的組件信息:

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 個組件組成,包括 nebula-console、nebula-graphd、nebula-metad、和 nebula-storaged,這也和前文介紹的 NebulaGraph 服務架構相呼應。

  1. 查看集羣的各個實例

list-instances 命令用來查看實例信息:

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
  1. 查看集羣狀態

list 命令用來查看集羣整體狀態:

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

若顯示 Status 爲 Running,表示集羣已經創建成功並正在運行。

  1. 連接集羣后,就可以像其他部署方式一樣正常使用 NebulaGraph 的圖服務了。像用 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 服務了。進階使用的話,可以參考官方的文檔:https://docs.nebula-graph.com.cn/3.5.0/

  1. 運維 Nebula Graph Cluster

當集羣狀態爲 Running 後,你可以登錄集羣查看信息,並進行常見的運維操作,像是擴縮容、服務啓停:hscalevscalevolume-expandstartstop 等操作。

下面,以水平擴縮容 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 支持的運維命令,可翻閱文檔:https://kubeblocks.io/docs/preview/user_docs/cli

豐富 NebulaGraph 生態

熟悉 NebulaGraph 周邊生態的小夥伴,可能知道在 KubeBlocks 之前,NebulaGraph 對接了 Spark 和 Flink 生態,主要對接大數據生態,從而方便大家使用大數據的計算引擎。而這次,NebulaGraph 往雲原生這邊邁了一步,通過在 KubeBlocks 的集成,希望能給社區的大家帶來更加豐富的生態環境。
正如本次完成集成工作的內核研發 @xtcylist 所說:“用開源的方式解決開源的問題”,我們希望聯合和上下游的開源生態,構建更完善的 NebulaGraph 圖生態。而他同樣認爲“數據庫全部容器化部署是大趨勢;全部 K8s 化部署也是一個比較熱的預言。”。

因此,擁抱未來,NebulaGraph 先在 KubeBlocks 上進行了集成工作。如果你想要加入,完善 NebulaGraph 的生態,歡迎留言交流你的看法。


謝謝你讀完本文 (///▽///)

歡迎前往 GitHub 來閱讀 NebulaGraph 源碼,或是嘗試用它解決你的業務問題 yo~ GitHub 地址:https://github.com/vesoft-inc/nebula 想要交流圖技術和其他想法,請前往論壇:https://discuss.nebula-graph.com.cn/

想要了解更多 KubeBlocks 和 NebulaGraph 的集成故事,歡迎來本週六的 meetup 同我們線下面對面交流~分享現場更有 NebulaGraph 繞坑祕籍放送 🧐 報名傳送門:https://3393206724443.huodongxing.com/event/1711136721400

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章