共計(jì) 2268 個(gè)字符,預(yù)計(jì)需要花費(fèi) 6 分鐘才能閱讀完成。
行業(yè)資訊
數(shù)據(jù)庫(kù)
Nebula Graph 在大規(guī)模數(shù)據(jù)量級(jí)下的實(shí)踐和定制化開發(fā)是怎么樣的
這篇文章將為大家詳細(xì)講解有關(guān) Nebula Graph 在大規(guī)模數(shù)據(jù)量級(jí)下的實(shí)踐和定制化開發(fā)是怎么樣的,文章內(nèi)容質(zhì)量較高,因此丸趣 TV 小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。
圖數(shù)據(jù)在社交推薦、多跳實(shí)時(shí)計(jì)算、風(fēng)控和安全等領(lǐng)域有可期待的前景。如何用圖數(shù)據(jù)庫(kù)高效存儲(chǔ)和查詢大規(guī)模異構(gòu)圖數(shù)據(jù),是一個(gè)重大挑戰(zhàn)。本文描述了開源分布式圖數(shù)據(jù)庫(kù)
Nebula Graph 實(shí)踐中遇到的問(wèn)題,并通過(guò)深度定制,實(shí)現(xiàn):大數(shù)據(jù)集存儲(chǔ)、小時(shí)級(jí)全量導(dǎo)入、多版本控制、秒級(jí)回滾、毫秒級(jí)訪問(wèn)等特性。
背景
為大眾所熟知的圖數(shù)據(jù)庫(kù)大多在大數(shù)據(jù)集合上束手無(wú)策,如:Neo4j 的社區(qū)版本,采用 Cypher 語(yǔ)言,由單機(jī)單副本提供服務(wù),廣泛應(yīng)用于圖譜領(lǐng)域。互聯(lián)網(wǎng)公司只能在小數(shù)據(jù)集合下使用,還要解決
Neo4j 多副本一致性容災(zāi)的問(wèn)題。
JanusGraph 雖然通過(guò)外置元數(shù)據(jù)管理、kv 存儲(chǔ)和索引的方式解決了大數(shù)據(jù)集合存儲(chǔ)問(wèn)題,但其存在廣為詬病的性能問(wèn)題。我們看到大部分圖數(shù)據(jù)庫(kù)在對(duì)比性能時(shí)都會(huì)提到和 JanusGraph 相比有幾十倍以上的性能提升。
面臨大數(shù)據(jù)量挑戰(zhàn)的互聯(lián)網(wǎng)公司,普遍走向了自研之路,為了貼合業(yè)務(wù)需求,僅支持有限的查詢語(yǔ)義。國(guó)內(nèi)主流互聯(lián)網(wǎng)公司如何解決圖數(shù)據(jù)庫(kù)的挑戰(zhàn)呢:
螞蟻金服:
金融級(jí)圖數(shù)據(jù)庫(kù),通過(guò)自定義類語(yǔ)言為業(yè)務(wù)方提供服務(wù),全量計(jì)算下推,提供毫秒級(jí)延時(shí)。主要應(yīng)用于以下場(chǎng)景:
金融風(fēng)控場(chǎng)景:萬(wàn)億級(jí)邊資金網(wǎng)絡(luò),存儲(chǔ)實(shí)時(shí)交易信息,實(shí)時(shí)欺詐檢測(cè)。
推薦場(chǎng)景:股票證券推薦。
螞蟻森林:萬(wàn)億級(jí)的圖存儲(chǔ)能力,低延時(shí)強(qiáng)一致關(guān)系數(shù)據(jù)查詢更新。
GNN:用于小時(shí)級(jí) GNN 訓(xùn)練。嘗試動(dòng)態(tài)圖 GNN 在線推理。
iGraph 是圖索引及查詢系統(tǒng),存儲(chǔ)用戶的行為信息,是阿里數(shù)據(jù)中臺(tái)四駕馬車之一。通過(guò) Gremlin 語(yǔ)言為業(yè)務(wù)方提供電商圖譜實(shí)時(shí)查詢。
ByteGraph 通過(guò)在 kv 上增加統(tǒng)一 cache 層,關(guān)系數(shù)據(jù)拆分為 B+ 樹以應(yīng)對(duì)高效的邊訪問(wèn)和采樣,類似 Facebook 的 TAO [6]。
…
架構(gòu)圖實(shí)踐從哪里開始呢?
我們選擇從
Nebula Graph[4] 開始我們的圖數(shù)據(jù)庫(kù)之旅,其吸引我們的有以下幾點(diǎn):
數(shù)據(jù)集分片,每條邊獨(dú)立存儲(chǔ),超大規(guī)模數(shù)據(jù)集存儲(chǔ)潛力。
定制強(qiáng)一致存儲(chǔ)引擎,具有計(jì)算下推和 MMP 優(yōu)化的潛力。
創(chuàng)始團(tuán)隊(duì)有豐富的圖數(shù)據(jù)庫(kù)經(jīng)驗(yàn),大數(shù)據(jù)集合下模型抽象思路經(jīng)過(guò)驗(yàn)證。
實(shí)踐中的問(wèn)題內(nèi)存爆炸
本質(zhì)上這是一個(gè)性能 VS 資源的問(wèn)題,數(shù)據(jù)規(guī)模龐大的應(yīng)用中,內(nèi)存占用是一個(gè)不容忽視的問(wèn)題。RocksDB 內(nèi)存由三部分構(gòu)成:block cache、index 和 bloom filter、iter pined block。
block cache 優(yōu)化:采用全局 LRU cache,控制機(jī)器上所有 rocksdb 實(shí)例的 cache 占用。
bloom filter 優(yōu)化:一條邊被設(shè)計(jì)為一個(gè) kv 存入到 rocksdb,如果全部 key 保存 bloom filter,每個(gè) key 占用 10bit 空間,那么整個(gè) filter 內(nèi)存占用遠(yuǎn)超機(jī)器內(nèi)存。觀察到我們大部分的請(qǐng)求模式是獲取某一個(gè)點(diǎn)的邊列表,因此采用 prefix bloom filter;索引到點(diǎn)屬性這一層實(shí)際上即可以對(duì)大多數(shù)請(qǐng)求進(jìn)行加速。經(jīng)過(guò)這個(gè)優(yōu)化,單機(jī) filter 所占用內(nèi)存在 G 這個(gè)級(jí)別,大多數(shù)請(qǐng)求訪問(wèn)速度并未明顯降低。
多版本控制
實(shí)踐中,圖數(shù)據(jù)需要進(jìn)行快速回滾,定期全量導(dǎo)入,自動(dòng)訪問(wèn)最新版本數(shù)據(jù)。我們把數(shù)據(jù)源大致可以分為兩種類型:
周期性數(shù)據(jù):比如,按天計(jì)算相似用戶列表,導(dǎo)入后數(shù)據(jù)生效。
歷史數(shù)據(jù) + 實(shí)時(shí)數(shù)據(jù):比如,歷史數(shù)據(jù)按天刷新,和實(shí)時(shí)寫入的數(shù)據(jù)進(jìn)行合并成為全量數(shù)據(jù)。
如下是數(shù)據(jù)在 rocksdb 的存儲(chǔ)模型:
vertex 存儲(chǔ)格式
edge 存儲(chǔ)格式
其中實(shí)時(shí)寫入的數(shù)據(jù) version 記錄為時(shí)間戳。離線導(dǎo)入的數(shù)據(jù) version 需要自己指定。我們將該字段和離線導(dǎo)入模塊聯(lián)合使用,用三個(gè)配置項(xiàng)進(jìn)行版本控制:reserve_versions(需要保留的版本列表)、active_version(用戶請(qǐng)求訪問(wèn)到的版本號(hào))、max_version(保留某個(gè)版本之后數(shù)據(jù),把歷史數(shù)據(jù)和實(shí)時(shí)寫入數(shù)據(jù)進(jìn)行合并)。這樣可以高效管理離線數(shù)據(jù)和在線數(shù)據(jù),不再使用的數(shù)據(jù)在下一次 compaction 中被清除出磁盤。
通過(guò)這樣的方式,業(yè)務(wù)代碼可以無(wú)感更新數(shù)據(jù)版本,并做到了秒級(jí)回滾。
舉例:
保留 3 個(gè)版本,激活其中一個(gè)版本:
alter edge friend reserve_versions = 1 2 3 active_version = 1
數(shù)據(jù)源為歷史數(shù)據(jù) + 實(shí)時(shí)導(dǎo)入數(shù)據(jù)。
alter edge friend max_version = 1592147484
快速批量導(dǎo)入
實(shí)踐中導(dǎo)入大量數(shù)據(jù)是常規(guī)操作,如果不經(jīng)任何優(yōu)化,將需要導(dǎo)入的數(shù)據(jù)轉(zhuǎn)為請(qǐng)求發(fā)給圖數(shù)據(jù)庫(kù),不僅嚴(yán)重影響線上請(qǐng)求,而且大數(shù)據(jù)量導(dǎo)入耗時(shí)超過(guò)一天。對(duì)導(dǎo)入速度進(jìn)行優(yōu)化迫在眉睫。業(yè)界解決這個(gè)問(wèn)題一般采用 SST Ingest 方式 [5]。我們也是采用類似方式,通過(guò)例行調(diào)度 spark 任務(wù),離線生成磁盤文件。然后數(shù)據(jù)節(jié)點(diǎn)拉取自己所需要的數(shù)據(jù),并 ingest 到數(shù)據(jù)庫(kù)中,之后進(jìn)行版本切換控制請(qǐng)求訪問(wèn)最新版本數(shù)據(jù)。
整個(gè)過(guò)程導(dǎo)入速度快,約數(shù)個(gè)小時(shí)內(nèi)完成全部過(guò)程。計(jì)算過(guò)程主要離線完成,對(duì)圖數(shù)據(jù)庫(kù)請(qǐng)求影響小。
關(guān)于 Nebula Graph 在大規(guī)模數(shù)據(jù)量級(jí)下的實(shí)踐和定制化開發(fā)是怎么樣的就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。