Nebula 架構剖析系列(零)圖數據庫的總體架構設計

Nebula Graph 是一個高性能的分佈式開源圖數據庫,本文爲你們介紹 Nebula Graph 的總體架構。git

一個完整的 Nebula 部署集羣包含三個服務,即  Query Service,Storage Service 和 Meta Service。每一個服務都有其各自的可執行二進制文件,這些二進制文件既能夠部署在同一組節點上,也能夠部署在不一樣的節點上。github

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 地址:github.com/vesoft-inc/…  ,加入 Nebula Graph 交流羣,請聯繫 Nebula Graph 官方小助手微信號:NebulaGraphbot

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

GitHub:github.com/vesoft-inc/…

知乎:www.zhihu.com/org/nebulag…

微博:weibo.com/nebulagraph

相關文章
相關標籤/搜索