圖資料庫|正反向邊的最終一致性——TOSS 介紹
本文首發於 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 小助手會拉你進群~~
- 一文了解 NebulaGraph 上的 Spark 專案
- 使用 MyBatis 操作 Nebula Graph 的實踐
- GraphX 圖計算實踐之模式匹配抽取特定子圖
- 圖資料庫|如何從零到一構建一個企業股權圖譜系統?
- GitHub 自動合併 pr 的機器人——auto-merge-bot
- 圖資料庫|正反向邊的最終一致性——TOSS 介紹
- Nebula Graph 在網易遊戲業務中的實踐
- Nebula Graph 在企查查的應用
- 基於 BDD 理論的 Nebula 整合測試框架重構(下篇)
- 圖資料庫 Nebula Graph 叢集通訊:從心跳說起
- 在 Spark 資料匯入中的一些實踐細節
- GraphX 在圖資料庫 Nebula Graph 的圖計算實踐
- 除錯 Docker 容器內部的 Nebula Graph 程序