1. 程式人生 > >Nebula 架構剖析系列(零)圖資料庫的整體架構設計

Nebula 架構剖析系列(零)圖資料庫的整體架構設計

Nebula Graph 是一個高效能的分散式開源圖資料庫,本文為大家介紹 Nebula Graph 的整體架構。

一個完整的 Nebula 部署叢集包含三個服務,即  Query Service,Storage Service 和 Meta Service。每個服務都有其各自的可執行二進位制檔案,這些二進位制檔案既可以部署在同一組節點上,也可以部署在不同的節點上。

Meta Service

上圖為 Nebula Graph 的架構圖,其右側為 Meta Service 叢集,它採用 leader / follower 架構。Leader 由叢集中所有的 Meta Service 節點選出,然後對外提供服務。Followers 處於待命狀態並從 leader 複製更新的資料。一旦 leader 節點 down 掉,會再選舉其中一個 follower 成為新的 leader。

Meta Service 不僅負責儲存和提供圖資料的 meta 資訊,如 schema、partition 資訊等,還同時負責指揮資料遷移及 leader 的變更等運維操作。

儲存計算分離

在架構圖中 Meta Service 的左側,為 Nebula Graph 的主要服務,Nebula 採用儲存與計算分離的架構,虛線以上為計算,以下為儲存。

儲存計算分離有諸多優勢,最直接的優勢就是,計算層和儲存層可以根據各自的情況彈性擴容、縮容。

儲存計算分離還帶來的另一個優勢:使水平擴充套件成為可能。

此外,儲存計算分離使得 Storage Service 可以為多種型別的個計算層或者計算引擎提供服務。當前 Query Service 是一個高優先順序的計算層,而各種迭代計算框架會是另外一個計算層。

無狀態計算層

現在我們來看下計算層,每個計算節點都執行著一個無狀態的查詢計算引擎,而節點彼此間無任何通訊關係。計算節點僅從 Meta Service 讀取 meta 資訊,以及和 Storage Service 進行互動。這樣設計使得計算層叢集更容易使用 K8s 管理或部署在雲上。

計算層的負載均衡有兩種形式,最常見的方式是在計算層上加一個負載均衡(balance),第二種方法是將計算層所有節點的 IP 地址配置在客戶端中,這樣客戶端可以隨機選取計算節點進行連線。 

每個查詢計算引擎都能接收客戶端的請求,解析查詢語句,生成抽象語法樹(AST)並將 AST 傳遞給執行計劃器和優化器,最後再交由執行器執行。

Shared-nothing 分散式儲存層

Storage Service 採用 shared-nothing 的分散式架構設計,每個儲存節點都有多個本地 KV 儲存例項作為物理儲存。Nebula 採用多數派協議 Raft 來保證這些 KV 儲存之間的一致性(由於 Raft 比 Paxo 更簡潔,我們選用了 Raft )。在 KVStore 之上是圖語義層,用於將圖操作轉換為下層 KV 操作。

圖資料(點和邊)是通過 Hash 的方式儲存在不同 Partition 中。這裡用的 Hash 函式實現很直接,即 vertex_id 取餘 Partition 數。在 Nebula Graph 中,Partition 表示一個虛擬的資料集,這些 Partition 分佈在所有的儲存節點,分佈資訊儲存在 Meta Service 中(因此所有的儲存節點和計算節點都能獲取到這個分佈資訊)。

附錄

Nebula Graph GitHub 地址:https://github.com/vesoft-inc/nebula  ,加入 Nebula Graph 交流群,請聯絡 Nebula Graph 官方小助手微訊號:NebulaGraphbot

Nebula Graph:一個開源的分散式圖資料庫。

GitHub:https://github.com/vesoft-inc/nebula

知乎:https://www.zhihu.com/org/nebulagraph/posts

微博:https://weibo.com/nebulagraph