圖資料庫|正反向邊的最終一致性——TOSS 介紹

語言: CN / TW / HK

本文首發於 Nebula Graph Community 公眾號

Nebula Graph v2.6 版本當中比較重要的特性之一便是 TOSS。通過本文,我將帶你全方位瞭解 TOSS 為何物。

從一條 GO 語句說起

眾所周知,邊分為無向邊跟有向邊兩種。所以當按有向邊去探索時,就可以按正向邊 / 反向邊做遍歷,Nebula Graph 也支援這種語義。比如:

go from "101" over known reversely yield known.kdate, id($$);

上述語句從點 101 開始反向的找所有的對應鄰邊。但,當用戶使用 Nebula 插入一條邊時,命令都類似於:

insert edge known(degree) VALUES "100" -> "101":(299792458);

上述語句看上去只寫了正向邊,並沒有輸入反向邊:這是因為在 Nebula 設計時,當用戶插入一條邊時,系統會默默地在後臺寫入一條反向邊。

聊聊 Nebula Graph 如何插入一條邊

以上文的那條 INSERT 語句為例,後臺的執行流程有:

  • Nebula Console 將 INSERT
    對應的 request 發給連線的 Nebula Graph Server;
  • Nebula Graph Server 收到後,根據正向邊的資訊對應補充出反向邊的資訊,並將這個 AddEdgeRequest 分別發往正反向邊對應的主機;
  • Nebula Storage Server 收到這個 AddEdgeRequest 後,在本地(通過 raft)插入對應的邊,並將結果返回給 Graph Server;
  • Nebula Graph Server 收到兩邊的結果後,返回給 Nebula Console;

流程圖如下:

這裡,對網路 / 分散式程式設計比較熟悉的同學可能現在就看出問題了:因為 Graph 對於兩個 Storage 的呼叫使用 RPC,那麼當

INSERT

操作執行的次數足夠多,就一定會遇到一邊 RPC 成功,另一邊 RPC 失敗(超時)的情況。換句話說,可能出現一個

INSERT

正向邊成功,反向邊失敗的情況。

這種結果會反饋給客戶端:如果使用者有正反向邊屬性一致的需求,就需要對 failed 的 request 做無限重試。但是 Nebula Graph 做為一個數據庫,將資料的原子性交由外部(客戶端)來保證還是不合適的。

於是,誕生了一個需求——保證正反向邊的原子性,即變更邊時,正反邊要麼同時變更成功,要麼同時變更失敗。這便是 TOSS(Transaction on storage side)的由來,用於保證對邊進行

INSERT

UPDATE

UPSERT

操作的最終一致性。

TOSS 使用方法

隨著 Nebula v2.6.0 的釋出,TOSS 功能已經上線。但基於效能和穩定性考慮,Nebula Graph 預設將該功能設為 default disable 狀態。有正反向邊一致性需求的小夥伴們可以在 Nebula Graph Server的配置中找到

enable_experimental_feature

這個選項,將它設為 true 並重啟 graphd。如下:

--enable_experimental_feature=true

那麼之後的 INSERT / UPDATE / UPSERT 就會有一致性的保證了。(跟之前一樣做 CREATE SPACE / CREATE EDGE / INSERT / UPDATE 即可,不需要額外操作)

注:開啟 TOSS 之後,只對增量資料有效,存量資料之前有過正反邊不一致時不會得到修正。

=================================================================================

Nebula 社群首屆徵文活動正式開啟啦 獎品豐厚,全場景覆蓋:擼碼機械鍵盤、手機無線充、健康小助手智慧手環,更有資料庫設計、知識圖譜實踐書籍等你來領,還有 Nebula 精緻周邊送不停

歡迎對 Nebula 有興趣、喜鑽研的小夥伴來書寫自己和 Nebula 有趣的故事呀~

交流圖資料庫技術?加入 Nebula 交流群請先 填寫下你的 Nebula 名片 ,Nebula 小助手會拉你進群~~