<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          字節(jié)跳動(dòng)自研萬(wàn)億級(jí)圖數(shù)據(jù)庫(kù)ByteGraph及其應(yīng)用與挑戰(zhàn)

          共 3843字,需瀏覽 8分鐘

           ·

          2022-07-01 02:45


          本文約3000字,建議閱讀6分鐘

          本文將介紹字節(jié)跳動(dòng)自研的圖數(shù)據(jù)庫(kù)ByteGraph及其在字節(jié)內(nèi)部的應(yīng)用和挑戰(zhàn)。


          [ 導(dǎo)讀 ] 作為一種基礎(chǔ)的數(shù)據(jù)結(jié)構(gòu),圖數(shù)據(jù)的應(yīng)用場(chǎng)景無(wú)處不在,如社交、風(fēng)控、搜廣推、生物信息學(xué)中的蛋白質(zhì)分析等。如何高效地對(duì)海量的圖數(shù)據(jù)進(jìn)行存儲(chǔ)、查詢、計(jì)算及分析,是當(dāng)前業(yè)界熱門的方向。本文將介紹字節(jié)跳動(dòng)自研的圖數(shù)據(jù)庫(kù)ByteGraph及其在字節(jié)內(nèi)部的應(yīng)用和挑戰(zhàn)。


          本文將圍繞以下五點(diǎn)展開(kāi):
          • 了解圖數(shù)據(jù)庫(kù)
          • 適用場(chǎng)景介紹舉例
          • 數(shù)據(jù)模型和查詢語(yǔ)言
          • ByteGraph架構(gòu)與實(shí)現(xiàn)
          • 關(guān)鍵問(wèn)題分析

          01、了解圖數(shù)據(jù)庫(kù)

          目前,字節(jié)內(nèi)部有如下表三款自研的圖數(shù)據(jù)產(chǎn)品。


          1. 對(duì)比圖數(shù)據(jù)庫(kù)與關(guān)系數(shù)據(jù)庫(kù)

          圖模型的基本元素包括點(diǎn)、邊和屬性。舉例:張三的好友所在的公司有多少名員工?傳統(tǒng)關(guān)系型數(shù)據(jù)庫(kù)需要多表join,而圖作為半結(jié)構(gòu)化數(shù)據(jù),在圖上進(jìn)行遍歷和屬性的過(guò)濾會(huì)更加高效。

          2. 什么是圖數(shù)據(jù)庫(kù)?

          近五年來(lái),圖數(shù)據(jù)庫(kù)在領(lǐng)域內(nèi)熱度上升趨勢(shì)非常明顯,各個(gè)大廠與開(kāi)源社區(qū)都推出了自己的圖數(shù)據(jù)庫(kù)。用戶規(guī)模比較大、有一定影響力的查詢語(yǔ)言包括Cypher、Apache開(kāi)源項(xiàng)目的Gremlin等。從集群規(guī)模來(lái)看,過(guò)往有單機(jī)數(shù)據(jù)庫(kù),現(xiàn)在大多圖數(shù)據(jù)庫(kù)都具備分布式能力,這就需要考慮數(shù)據(jù)的防丟失問(wèn)題、主副本之間的一致性、多臺(tái)機(jī)器數(shù)據(jù)上的shard問(wèn)題。

          部分圖數(shù)據(jù)庫(kù)把圖數(shù)據(jù)庫(kù)與圖計(jì)算引擎二者合并在一起,目前字節(jié)內(nèi)部采用的暫時(shí)分離的兩套系統(tǒng)。

          02、適用場(chǎng)景介紹舉例

          1. ByteGraph適用的業(yè)務(wù)數(shù)據(jù)模型

          ByteGraph初始立項(xiàng)是在2018年,主要目的是對(duì)頭條的用戶行為及好友關(guān)系進(jìn)行存儲(chǔ)來(lái)替換Mysql;2019年6月承接對(duì)抖音用戶關(guān)系的數(shù)據(jù)存儲(chǔ)任務(wù),接著在字節(jié)內(nèi)部各種微服務(wù)重承接了相關(guān)業(yè)務(wù)。

          2. 已上線業(yè)務(wù)場(chǎng)景分類

          目前有1.5萬(wàn)臺(tái)物理機(jī),服務(wù)于600+業(yè)務(wù)集群。


          03、數(shù)據(jù)模型和查詢語(yǔ)言

          1. 有向?qū)傩詧D建模

          目前來(lái)看,圖數(shù)據(jù)庫(kù)通常有兩大類,一種是屬性圖,另一種是RDF圖。屬性圖在節(jié)點(diǎn)和邊上有屬性表,從某種角度上講,它仍帶有關(guān)系數(shù)據(jù)庫(kù)的基本特性,類似表結(jié)構(gòu)的形式,實(shí)際是采用Key-Value形式來(lái)存儲(chǔ)的,如用戶A關(guān)注了用戶B,用戶C點(diǎn)贊了某個(gè)視頻等,則會(huì)把關(guān)注的時(shí)間、點(diǎn)贊時(shí)間、評(píng)論的內(nèi)容等以不同的有向邊存儲(chǔ)在屬性圖中,用圖來(lái)描述業(yè)務(wù)邏輯。


          2. Gremlin查詢語(yǔ)言接口

          選用Gremlin語(yǔ)言是考慮到之后方便對(duì)圖計(jì)算、圖數(shù)據(jù)庫(kù)二者進(jìn)行融合,本身是圖靈完備的圖遍歷語(yǔ)言,相較于Cypher等類SQL語(yǔ)言,對(duì)于善用Python的數(shù)據(jù)分析師更容易上手。

          舉例:寫(xiě)一條用戶A所有一跳好友中滿足粉絲數(shù)量大于100的子集。首先定位用戶A在圖中的點(diǎn),其次求一跳查詢中的所有鄰居,判斷入度鄰居整體數(shù)量是否大于100,拉取滿足條件的所有用戶。


          04、ByteGraph架構(gòu)與實(shí)現(xiàn)

          1. ByteGraph整體架構(gòu)

          ByteGraph整體架構(gòu)分為查詢引擎層(Graph Query Engine,下文簡(jiǎn)稱GQ)、存儲(chǔ)引擎層(Graph Storage Engine,下文簡(jiǎn)稱GS)和磁盤(pán)存儲(chǔ)層三層,整體上計(jì)算和存儲(chǔ)分離,每層由多個(gè)進(jìn)程實(shí)例組成集群。


          2. ByteGraph讀寫(xiě)流程

          拿“讀流程”舉例,請(qǐng)求獲取用戶A的一跳鄰居。首先一個(gè)查詢進(jìn)來(lái)后,從client端隨機(jī)挑選一個(gè)查詢層響應(yīng),對(duì)應(yīng)到GQ2上,獲取對(duì)應(yīng)的數(shù)據(jù)存放的位置是哪一臺(tái)機(jī)器,接著把請(qǐng)求給到GS1,檢查數(shù)據(jù)是否在該層以及是否為最新數(shù)據(jù),如果不在則去KV store把所需數(shù)據(jù)拉取至GS1 緩存中。


          3. ByteGraph實(shí)現(xiàn):GQ

          GQ同MySQL的SQL層一樣,負(fù)責(zé)查詢的解析和處理,其中的“處理”可以分為下述三個(gè)步驟:

          • Parser階段:利用遞歸下降解析器將查詢語(yǔ)言解析為一個(gè)查詢語(yǔ)法樹(shù)。
          • 生成查詢計(jì)劃:將Parser階段得到的查詢語(yǔ)法樹(shù)按照查詢優(yōu)化策略(RBO&CBO)轉(zhuǎn)換為執(zhí)行計(jì)劃。
          • 執(zhí)行查詢計(jì)劃:理解GS數(shù)據(jù)分Partition的邏輯,找到相應(yīng)數(shù)據(jù)并下推部分算子,保證網(wǎng)絡(luò)開(kāi)銷不會(huì)太大,最后合并查詢結(jié)果,完成查詢計(jì)劃。

          RBO主要基于Gremlin開(kāi)源實(shí)現(xiàn)中的自帶優(yōu)化規(guī)則、針對(duì)字節(jié)應(yīng)用中的算子下推、自定義的算子優(yōu)化(fusion)三大規(guī)則。CBO本質(zhì)上是對(duì)每個(gè)點(diǎn)的出入度做統(tǒng)計(jì),把代價(jià)用方程量化表示。


          對(duì)于不同支持場(chǎng)景使用不同策略,圖分區(qū)算法的選擇與workload強(qiáng)相關(guān),圖分區(qū)算法能有效減少網(wǎng)絡(luò)通信次數(shù)。

          • Brute force哈希分區(qū):即根據(jù)起點(diǎn)和邊的類型進(jìn)行一致性哈希分區(qū),可以大部分查詢場(chǎng)景需求,尤其是一度查詢場(chǎng)景。
          • 知識(shí)圖譜場(chǎng)景點(diǎn)、邊類型極多,但每種類型邊數(shù)量相對(duì)較少,此時(shí)根據(jù)邊類型進(jìn)行哈希分區(qū),將同種邊類型數(shù)據(jù)分布在一個(gè)分區(qū)內(nèi)。
          • 社交場(chǎng)景:更容易出現(xiàn)大V,利用facebook于2016年提出的social hash算法,通過(guò)離線計(jì)算盡量將有關(guān)聯(lián)的數(shù)據(jù)放置在同一分片內(nèi),降低延遲。

          4. ByteGraph實(shí)現(xiàn):GS


          • 存儲(chǔ)結(jié)構(gòu)

          單個(gè)Partition定義為一個(gè)起點(diǎn)+一種特定的邊類型扇出的一跳鄰居。在GS中,將一個(gè)Partition按照排序鍵(可顯式設(shè)置或系統(tǒng)默認(rèn)維護(hù))組織成Btree。每棵Btree都有獨(dú)立的WAL序列,獨(dú)立維護(hù)自增logid。這種設(shè)計(jì)有利于支持GNN場(chǎng)景,做分布式采樣。

          Edge Page、Meta Page分別是位于Btree中的葉子結(jié)點(diǎn)、非葉子結(jié)點(diǎn)(充當(dāng)index作用),分別用于存儲(chǔ)圖中的邊數(shù)據(jù)和指向子節(jié)點(diǎn)的Key。Meta page長(zhǎng)度是固定的,但是一個(gè)meta page會(huì)放多少edge page是可配的,通常配置為2000一片。如上圖,Partition在磁盤(pán)中將每個(gè)page都存儲(chǔ)為一個(gè)獨(dú)立的鍵值對(duì)(下文簡(jiǎn)稱KV対)。meta page的key是起點(diǎn)+邊類型,edge page的key存在meta page中實(shí)現(xiàn)對(duì)特定edge page的查找。

          單機(jī)內(nèi)存引擎整體采用hash map的結(jié)構(gòu),partition和page按需加載到內(nèi)存中,根據(jù)LRU策略(Least Recent Used),swap到磁盤(pán);某個(gè)page被修改后,WAL同步寫(xiě)到磁盤(pán),page會(huì)插入到dirty鏈表中,考慮當(dāng)前機(jī)器狀態(tài),異步寫(xiě)回。


          • 日志管理:單個(gè)起點(diǎn)+邊類型組成一棵Btree,每個(gè)結(jié)點(diǎn)是一個(gè)KV對(duì)。

          每棵Btree單一寫(xiě)者,防止并發(fā)寫(xiě)入導(dǎo)致不完整;每棵樹(shù)都有獨(dú)立的WAL日志流,且寫(xiě)入請(qǐng)求處理流程中只寫(xiě)入WAL,并修改內(nèi)存中數(shù)據(jù),compaction時(shí)再將數(shù)據(jù)落盤(pán),解決由于每個(gè)KV對(duì)可能由多條邊組成而導(dǎo)致的寫(xiě)放大。即使內(nèi)存數(shù)據(jù)丟失,仍可通過(guò)更新后的logid在磁盤(pán)上進(jìn)行WAL的查詢并寫(xiě)入。

          • 緩存實(shí)現(xiàn):根據(jù)不同場(chǎng)景及當(dāng)下cpu的開(kāi)銷有不同策略。

          圖原生緩存:相對(duì)于Memcached等直接緩存二進(jìn)制數(shù)據(jù)而言,能更好的理解圖的語(yǔ)義,并支持一度查詢中的部分計(jì)算下推功能。

          高性能LRU Cache:支持緩存逐出,且逐出的頻率和觸發(fā)閾值可調(diào);采用numa aware和cpu cacheline aware設(shè)計(jì),提高性能;支持Intel AEP等新硬件。

          Write-through cache:支持多種與底層存儲(chǔ)同步數(shù)據(jù)的模式,可以每次寫(xiě)入或定時(shí)落盤(pán);支持定期與底層存儲(chǔ)校驗(yàn)數(shù)據(jù),防止數(shù)據(jù)過(guò)舊;支持負(fù)緩存等常見(jiàn)優(yōu)化策略。

          緩存與存儲(chǔ)分離:當(dāng)數(shù)據(jù)規(guī)模不變、請(qǐng)求流量增大的情況下,緩存與存儲(chǔ)分離的模式可以快速擴(kuò)容緩存以提高服務(wù)能力。

          05、關(guān)鍵問(wèn)題分析

          1. 索引

          • 局部索引:給定一個(gè)起點(diǎn)和邊類型,對(duì)邊上的屬性構(gòu)建索引

          特點(diǎn):邊上元素皆可做索引項(xiàng),能夠加速查詢,提高屬性過(guò)濾和排序性能;但會(huì)額外維護(hù)一份索引數(shù)據(jù),與對(duì)應(yīng)的原數(shù)據(jù)使用同一條日志流,保證一致性。

          • 全局索引:目前只支持點(diǎn)的屬性全局索引,即指定一個(gè)屬性值查詢出對(duì)應(yīng)的點(diǎn)。

          數(shù)據(jù)存儲(chǔ)在不同機(jī)器上,索引數(shù)據(jù)的一致性使用分布式事務(wù)解決。

          2. 熱點(diǎn)讀寫(xiě)

          • 熱點(diǎn)讀

          場(chǎng)景舉例:某熱點(diǎn)視頻被頻繁刷新,查看其點(diǎn)贊數(shù)量。

          應(yīng)用機(jī)制:GQ層采用多個(gè)bgdb并發(fā)處理同一熱點(diǎn)的讀請(qǐng)求,單節(jié)點(diǎn)緩存命中讀性能可達(dá)20萬(wàn)以上;GS層采用copy on write(即先拷貝,再寫(xiě)入并替換)保證讀寫(xiě)、讀讀均可并發(fā)。

          • 熱點(diǎn)寫(xiě)

          場(chǎng)景舉例:某熱點(diǎn)視頻短時(shí)間內(nèi)被瘋狂轉(zhuǎn)發(fā)、點(diǎn)贊。

          問(wèn)題溯源:?jiǎn)螜C(jī)cpu使用率被拉高,磁盤(pán)寫(xiě)入iops有上限,當(dāng)客戶端寫(xiě)入qps>磁盤(pán)iops時(shí),就會(huì)發(fā)生請(qǐng)求排隊(duì)。

          應(yīng)對(duì)機(jī)制:采用group commit機(jī)制,即將多個(gè)寫(xiě)入請(qǐng)求組合至一個(gè)batch寫(xiě)入KV,再批量返回,降低磁盤(pán)層iops的上限。



          3. 輕重查詢資源分配

          將輕重查詢的資源池分離,輕查詢走light線程池,負(fù)責(zé)數(shù)量多的小查詢;重查詢則走h(yuǎn)eavy線程池,負(fù)責(zé)數(shù)量少的重查詢。當(dāng)heavy線程池空閑時(shí),輕查詢也可走。


          4. 高可用

          • 城域網(wǎng)雙機(jī)房,如國(guó)內(nèi)的兩個(gè)機(jī)房,延遲較低。follow一寫(xiě)多讀策略,備機(jī)房把寫(xiě)流量轉(zhuǎn)入主機(jī)房,只有主機(jī)房會(huì)把WAL更新到KV存儲(chǔ)上。
          • 廣域網(wǎng)容災(zāi)部署,如新加坡和美國(guó)的兩臺(tái)機(jī)器,延遲較高。follow了mysql的思想,每次寫(xiě)入在本地寫(xiě)入成功后,會(huì)被轉(zhuǎn)化為binlog,再發(fā)送給其他單元;并通過(guò)hybrid logical clock保證各單元對(duì)于一條邊的操作順序一致性。


          5. 離線在線數(shù)據(jù)流融合


          導(dǎo)入存量數(shù)據(jù)、寫(xiě)入在線數(shù)據(jù),將二者集成在公司內(nèi)部數(shù)據(jù)平臺(tái)進(jìn)行離線數(shù)據(jù)分析,具體流程如圖。

          編輯:于騰凱

          校對(duì):林亦霖





          瀏覽 39
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  狠狠躁日日躁夜夜躁A片2022 | 亚洲一区二区精品 | 黄色小说片五月 | 97福利| 国产精品777777 |