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 地址:??,加入 Nebula Graph 交流群,請聯系 Nebula Graph 官方小助手微信號:NebulaGraphbot

Nebula Graph:一個開源的分布式圖數據庫。

GitHub:

知乎:

微博:

posted @ 2019-10-14 16:55 NebulaGraph 閱讀(...) 評論(...) 編輯 收藏