您好,登錄后才能下訂單哦!
本篇文章為大家展示了如何進(jìn)行圖數(shù)據(jù)庫(kù)Nebula Graph 的數(shù)據(jù)模型和系統(tǒng)架構(gòu)設(shè)計(jì),內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過(guò)這篇文章的詳細(xì)介紹希望你能有所收獲。
下面主要介紹 Nebula Graph 的數(shù)據(jù)模型和系統(tǒng)架構(gòu)設(shè)計(jì)。
Nebula Graph 采用易理解的有向?qū)傩詧D來(lái)建模,也就是說(shuō),在邏輯上,圖由兩種圖元素構(gòu)成:頂點(diǎn)和邊。
在 Nebula Graph 中頂點(diǎn)由標(biāo)簽 tag
和對(duì)應(yīng) tag
的屬性組構(gòu)成, tag
代表頂點(diǎn)的類型,屬性組代表 tag
擁有的一種或多種屬性。一個(gè)頂點(diǎn)必須至少有一種類型,即標(biāo)簽,也可以有多種類型。每種標(biāo)簽有一組相對(duì)應(yīng)的屬性,我們稱之為 schema
。
如上圖所示,有兩種 tag
頂點(diǎn):player 和 team。player 的 schema
有三種屬性 ID
(vid),Name
(sting)和 Age
(int);team 的 schema
有兩種屬性 ID
(vid)和 Name
(string)。
和 Mysql 一樣,Nebula Graph 是一種強(qiáng) schema 的數(shù)據(jù)庫(kù),屬性的名稱和數(shù)據(jù)類型都是在數(shù)據(jù)寫入前確定的。
在 Nebula Graph 中邊由類型和邊屬性構(gòu)成,而 Nebula Graph 中邊均是有向邊,有向邊表明一個(gè)頂點(diǎn)( 起點(diǎn) src
)指向另一個(gè)頂點(diǎn)( 終點(diǎn) dst
)的關(guān)聯(lián)關(guān)系。此外,在 Nebula Graph 中我們將邊類型稱為 edgetype
,每一條邊只有一種edgetype
,每種 edgetype
相應(yīng)定義了這種邊上屬性的 schema
。
回到上面的圖例,圖中有兩種類型的邊,一種為 player 指向 player 的 like 關(guān)系,屬性為 likeness (double);另一種為 player 指向 team 的 serve 關(guān)系,兩個(gè)屬性分別為 start_year (int) 和 end_year (int)。
需要說(shuō)明的是,起點(diǎn)1 和終點(diǎn)2 之間,可以同時(shí)存在多條相同或者不同類型的邊。
由于超大規(guī)模關(guān)系網(wǎng)絡(luò)的節(jié)點(diǎn)數(shù)量高達(dá)百億到千億,而邊的數(shù)量更會(huì)高達(dá)萬(wàn)億,即使僅存儲(chǔ)點(diǎn)和邊兩者也遠(yuǎn)大于一般服務(wù)器的容量。因此需要有方法將圖元素切割,并存儲(chǔ)在不同邏輯分片 partition
上。Nebula Graph 采用邊分割的方式,默認(rèn)的分片策略為哈希散列,partition 數(shù)量為靜態(tài)設(shè)置并不可更改。
在 Nebula Graph 中,每個(gè)頂點(diǎn)被建模為一個(gè) key-value
,根據(jù)其 vertexID(或簡(jiǎn)稱 vid)哈希散列后,存儲(chǔ)到對(duì)應(yīng)的 partition 上。
一條邏輯意義上的邊,在 Nebula Graph 中將會(huì)被建模為兩個(gè)獨(dú)立的 key-value
,分別稱為 out-key
和 in-key
。out-key 與這條邊所對(duì)應(yīng)的起點(diǎn)存儲(chǔ)在同一個(gè) partition 上,in-key 與這條邊所對(duì)應(yīng)的終點(diǎn)存儲(chǔ)在同一個(gè) partition 上。
Nebula Graph 包括四個(gè)主要的功能模塊,分別是存儲(chǔ)層、元數(shù)據(jù)服務(wù)、計(jì)算層和客戶端。
在 Nebula Graph 中存儲(chǔ)層對(duì)應(yīng)進(jìn)程是 nebula-storaged
,其核心為基于 Raft(用來(lái)管理日志復(fù)制的一致性算法) 協(xié)議的分布式 Key-valueStorage
。目前支持的主要存儲(chǔ)引擎為「Rocksdb」和「HBase」。Raft 協(xié)議通過(guò) leader/follower
的方式,來(lái)保持?jǐn)?shù)據(jù)之間的一致性。Nebula Storage 主要增加了以下功能和優(yōu)化:
Parallel Raft:允許多臺(tái)機(jī)器上的相同 partiton-id 組成一個(gè) Raft group
。通過(guò)多組 Raft group 實(shí)現(xiàn)并發(fā)操作。
Write Path & batch:Raft 協(xié)議的多機(jī)器間同步依賴于日志 id 順序性,這樣的吞吐量 throughput
較低。通過(guò)批量和亂序提交的方式可以實(shí)現(xiàn)更高的吞吐量。
Learner:基于異步復(fù)制的 learner。當(dāng)集群中增加新的機(jī)器時(shí),可以將其先標(biāo)記為 learner,并異步從 leader/follower
拉取數(shù)據(jù)。當(dāng)該 learner 追上 leader 后,再標(biāo)記為 follower,參與 Raft 協(xié)議。
Load-balance:對(duì)于部分訪問壓力較大的機(jī)器,將其所服務(wù)的 partition 遷移到較冷的機(jī)器上,以實(shí)現(xiàn)更好的負(fù)載均衡。
Metaservice 對(duì)應(yīng)的進(jìn)程是 nebula-metad
,其主要的功能有:
用戶管理:Nebula Graph 的用戶體系包括 Goduser
, Admin
, User
, Guest
四種。每種用戶的操作權(quán)限不一。
集群配置管理:支持上線、下線新的服務(wù)器。
圖空間管理:增持增加、刪除圖空間,修改圖空間配置(Raft副本數(shù))
Schema 管理:Nebula Graph 為強(qiáng) schema 設(shè)計(jì)。
通過(guò) Metaservice 記錄 Tag 和 Edge 的屬性的各字段的類型。支持的類型有:整型 int, 雙精度類型 double, 時(shí)間數(shù)據(jù)類型 timestamp, 列表類型 list等;
多版本管理,支持增加、修改和刪除 schema,并記錄其版本號(hào)
TTL 管理,通過(guò)標(biāo)識(shí)到期回收 time-to-live
字段,支持?jǐn)?shù)據(jù)的自動(dòng)刪除和空間回收
MetaService 層為有狀態(tài)的服務(wù),其狀態(tài)持久化方法與 Storage 層一樣通過(guò) KVStore
方式存儲(chǔ)。
計(jì)算層對(duì)應(yīng)的進(jìn)程是 nebula-graphd
,它由完全對(duì)等無(wú)狀態(tài)無(wú)關(guān)聯(lián)的計(jì)算節(jié)點(diǎn)組成,計(jì)算節(jié)點(diǎn)之間相互無(wú)通信。**Query Engine **層的主要功能,是解析客戶端發(fā)送 nGQL 文本,通過(guò)詞法解析 Lexer
和語(yǔ)法解析 Parser
生成執(zhí)行計(jì)劃,并通過(guò)優(yōu)化后將執(zhí)行計(jì)劃交由執(zhí)行引擎,執(zhí)行引擎通過(guò) MetaService 獲取圖點(diǎn)和邊的 schema,并通過(guò)存儲(chǔ)引擎層獲取點(diǎn)和邊的數(shù)據(jù)。Query Engine 層的主要優(yōu)化有:
異步和并發(fā)執(zhí)行:由于 IO 和網(wǎng)絡(luò)均為長(zhǎng)時(shí)延操作,需采用異步及并發(fā)操作。此外,為避免單個(gè)長(zhǎng) query 影響后續(xù) query,Query Engine 為每個(gè) query 設(shè)置單獨(dú)的資源池以保證服務(wù)質(zhì)量 QoS。焦作國(guó)醫(yī)胃腸醫(yī)院:https://www.jianshu.com/p/b8966d1a468e
計(jì)算下沉:為避免存儲(chǔ)層將過(guò)多數(shù)據(jù)回傳到計(jì)算層占用寶貴的帶寬,條件過(guò)濾 where
等算子會(huì)隨查詢條件一同下發(fā)到存儲(chǔ)層節(jié)點(diǎn)。
執(zhí)行計(jì)劃優(yōu)化:雖然在關(guān)系數(shù)據(jù)庫(kù) SQL 中執(zhí)行計(jì)劃優(yōu)化已經(jīng)經(jīng)歷了長(zhǎng)時(shí)間的發(fā)展,但業(yè)界對(duì)圖查詢語(yǔ)言的優(yōu)化研究較少。Nebula Graph 對(duì)圖查詢的執(zhí)行計(jì)劃優(yōu)化進(jìn)行了一定的探索,包括執(zhí)行計(jì)劃緩存和上下文無(wú)關(guān)語(yǔ)句并發(fā)執(zhí)行。
Nebula Graph 提供 C++、Java、Golang 三種語(yǔ)言的客戶端,與服務(wù)器之間的通信方式為 RPC,采用的通信協(xié)議為 Facebook-Thrift。用戶也可通過(guò) Linux 上 console 實(shí)現(xiàn)對(duì) Nebula Graph 操作。Web 訪問方式目前在開發(fā)過(guò)程中。
上述內(nèi)容就是如何進(jìn)行圖數(shù)據(jù)庫(kù)Nebula Graph 的數(shù)據(jù)模型和系統(tǒng)架構(gòu)設(shè)計(jì),你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。