開源大數(shù)據(jù)Meetup回顧 | 第四范式:現(xiàn)代存儲架構(gòu)下的系統(tǒng)優(yōu)化實(shí)踐
8月21日,白玉蘭開源聯(lián)合示說網(wǎng)主辦的“開源大數(shù)據(jù)技術(shù)線上meetup”特邀約大數(shù)據(jù)領(lǐng)域的前沿技術(shù)專家,就大數(shù)據(jù)存儲的關(guān)鍵技術(shù)、挑戰(zhàn)和當(dāng)前應(yīng)用展開交流討論,陣容強(qiáng)大、內(nèi)容全面。第四范式體系架構(gòu)科學(xué)家,高性能計算Team leader盧冕,一直專注于研發(fā)在異構(gòu)架構(gòu)下的系統(tǒng)優(yōu)化實(shí)踐和探索,我們根據(jù)盧冕講師的現(xiàn)場分享《現(xiàn)代存儲架構(gòu)下的系統(tǒng)優(yōu)化實(shí)踐》,整理成以下內(nèi)容。
一、前言
隨著存儲技術(shù)的發(fā)展,現(xiàn)代存儲架構(gòu)呈現(xiàn)出了前所未有的分級復(fù)雜性和功能上的革命(比如內(nèi)存數(shù)據(jù)持久化),因此也對上層軟件如何優(yōu)化提出了新的挑戰(zhàn)。
本次分享基于我們的實(shí)踐經(jīng)驗(yàn),從現(xiàn)代存儲架構(gòu)的概念、特征工程數(shù)據(jù)庫在PMem上的優(yōu)化、基于分級存儲架構(gòu)的Kafka優(yōu)化、MemArk技術(shù)社區(qū)這四個方面出發(fā),演示如何在現(xiàn)代存儲架構(gòu)下,通過創(chuàng)新性的技術(shù),比如持久化內(nèi)存數(shù)據(jù)結(jié)構(gòu)、分級存儲、冷熱數(shù)據(jù)分離等技術(shù)進(jìn)行系統(tǒng)優(yōu)化,以利用現(xiàn)代存儲架構(gòu)的特性。
一、現(xiàn)代存儲架構(gòu)
首先著眼于關(guān)鍵存儲技術(shù):硬件技術(shù)、軟件技術(shù),在此可劃分成外存和內(nèi)存。
1外存
例如SSD、硬盤,即數(shù)據(jù)可以在該設(shè)備上持久化。1956年已出現(xiàn)機(jī)械硬盤,NAND Flash在1989年開始首個專利申請。如今,Flash已經(jīng)發(fā)展迅猛、應(yīng)用廣泛,例如B+tree數(shù)據(jù)庫系統(tǒng)在1973年已繁榮發(fā)展。
2內(nèi)存
直接將數(shù)據(jù)存儲并且讀寫較快,但是掉電會造成數(shù)據(jù)丟失。內(nèi)存的典型技術(shù),例如SRAM、DRAM,其中SRAM用于CPU的cache,DDR、GDDR普遍應(yīng)用于計算機(jī)。由于追求高性能、高吞吐,特異化的內(nèi)存技術(shù)應(yīng)運(yùn)而生,例如,HBM2、GDDR6,上述都是高帶寬、高吞吐的內(nèi)存形態(tài),在家用機(jī)器上運(yùn)用較少,較多運(yùn)用在數(shù)據(jù)中心和大密度計算。
在2015年,數(shù)據(jù)可持久化和高性能易失性內(nèi)存出現(xiàn)在交匯融合,非易失性內(nèi)存技術(shù)由此進(jìn)入大眾視野。該技術(shù)是存儲架構(gòu)的革命性變化。
3非易失性內(nèi)存技術(shù)
2015年,英特爾和鎂光在工業(yè)界共同提出了3D XPoint,目的是為了把非易失性內(nèi)存技術(shù)落實(shí)到工業(yè)界,而不是僅限于學(xué)術(shù)界的模擬研究和討論。
2018年,英特爾把非易失性內(nèi)存技術(shù)實(shí)現(xiàn)了商業(yè)化,推出了傲騰持久內(nèi)存,這意味著非易失性內(nèi)存真正實(shí)現(xiàn)了落地,能圍繞商業(yè)化產(chǎn)品去做工業(yè)級應(yīng)用,而不是止步于紙上談兵。

4現(xiàn)代存儲架構(gòu)金字塔
Computer Science課本中也會碰到過存儲架構(gòu)金字塔,其組織架構(gòu)較簡單。在課本上,底層是硬盤,中間是DRAM或者叫內(nèi)存,上面是cache。實(shí)際上,今天工業(yè)界存儲架構(gòu)金字塔已經(jīng)演化得非常復(fù)雜,它不再是課本上簡單的兩三級結(jié)構(gòu),已演化到六七級,此處還不包括異構(gòu)算力所帶來的存儲架構(gòu)。
如圖:金字塔下面藍(lán)色部分具有持久性,上面紅色部分是存儲介質(zhì)。最特殊的是,中間部分非易失性內(nèi)存或者持久內(nèi)存商品,這一部分在金字塔用兩種不同顏色已標(biāo)注。內(nèi)存數(shù)據(jù)的持久化特性具有革命性,是現(xiàn)今存儲架構(gòu)的顯著特點(diǎn)。

5非易失性內(nèi)存
下圖就是英特爾推出的傲騰持久內(nèi)存(PMem)第一代和第二代。該內(nèi)存條和普通的內(nèi)存條沒太大區(qū)別,可直接插在server上的內(nèi)存插槽里,但只能匹配英特爾CPU。

傲騰持久內(nèi)存的顯著特點(diǎn):
·大容量:單根容量可達(dá)到512 GB,在server上很容易把它配到T級別的容量,即1.5T或3T容量的PMem服務(wù)器配置。
·低成本:單位價格即每GB成本比普通DRAM低。如果從 server角度去思考問題,例如,如果用DRAM去跑3T的應(yīng)用,可能至少要七八臺機(jī)器;如果用PMem機(jī)器去跑,它只需要一臺機(jī)器。從機(jī)器數(shù)量和運(yùn)營成本節(jié)省角度而言,低成本特征顯著。
·高性能持久化:內(nèi)存數(shù)據(jù)持久化。把傳統(tǒng)軟件中的內(nèi)存數(shù)據(jù)做持久化,具有快速恢復(fù)的意義。此外,也可作為存儲,其性能相比較于HDD、SSD,性能優(yōu)勢明顯。
持久內(nèi)存的工作模式:Memory Mode,即內(nèi)存模式,持久內(nèi)存直接插到server上,對應(yīng)用程序是黑盒化的。整個server容量會變成持久內(nèi)存的容量,DRAM會變成持久內(nèi)存的一層cache。內(nèi)存容量就是整個PMem的容量,應(yīng)用程序不需要修改代碼便可直接使用,直接享受大容量低成本的好處。但是這種模式可能會造成幾個問題,存儲架構(gòu)的層級對程序員透明,程序員無法精確操控存儲架構(gòu)層級,從而無法去做細(xì)粒度優(yōu)化,例如cache層級優(yōu)化。為了克服以上問題,推了APP Direct Mode。在APP Direct Mode,可以看到從PMem到DRAM內(nèi)存整個存儲層級完全暴露在程序員視角下,程序員可以根據(jù)它的應(yīng)用去做定制化優(yōu)化,也能享受到持久化所帶來的好處。
綜上所述,現(xiàn)代存儲架構(gòu)的特點(diǎn):分級存儲架構(gòu)復(fù)雜且豐富。現(xiàn)今存儲層級已達(dá)5-7層,這會讓大眾在容量、性能和成本之間權(quán)衡利弊,即在容量、性能、成本之間取舍。挑戰(zhàn)在此也迎面而來,即做優(yōu)化。引入分級存儲、分級持久化等分級緩存算法來更好地做系統(tǒng)優(yōu)化。
在此強(qiáng)調(diào)的是:內(nèi)存數(shù)據(jù)持久化,這是革命性功能。如果把PMem當(dāng)做內(nèi)存使用,一旦機(jī)器掉電或者程序崩潰,只要做好了持久化工作,在下次重新上電時,數(shù)據(jù)還是會持久化在內(nèi)存中。優(yōu)勢就是內(nèi)存數(shù)據(jù)的快速恢復(fù)。現(xiàn)實(shí)生活中,像線上服務(wù),如果節(jié)點(diǎn)離線,數(shù)據(jù)要從外存或者從網(wǎng)絡(luò)中重新拉回來做內(nèi)存數(shù)據(jù)的構(gòu)建,這非常影響線上服務(wù)質(zhì)量。因?yàn)榫€上服務(wù)不允許長時間離線,若用持久內(nèi)存,它就會持久化。在掉線以后,該線上節(jié)點(diǎn)恢復(fù)。基于此,對現(xiàn)在傳統(tǒng)軟件最大挑戰(zhàn)是需要做持久化編程模型。
總而言之,分級存儲架構(gòu)和內(nèi)存數(shù)據(jù)持久化,需要做一些傳統(tǒng)軟件的系統(tǒng)優(yōu)化。

PMem在學(xué)術(shù)界非常火熱,今年在丹麥舉行的國際頂級數(shù)據(jù)庫學(xué)術(shù)會議VLDB就有兩個專門收錄PMem相關(guān)論文的research sessions,共有8篇paper,出現(xiàn)了井噴。這些paper有工業(yè)界的影子,例如第一篇論文是做SSD的廠商。從工業(yè)界的角度來看,加之英特爾的推介,包括像第四范式、阿里巴巴也在做積極探索。在工業(yè)界,在接下來的1-2年內(nèi),PMem會普遍進(jìn)入數(shù)據(jù)中心采購名單,會迎來非常大規(guī)模應(yīng)用熱潮。

6第四范式在現(xiàn)代存儲架構(gòu)上一些技術(shù)實(shí)踐
對內(nèi):面向AI流程的優(yōu)化。這里有兩種用法:Memory Mode(為了低成本擴(kuò)容)和HyperPS(針對推理的參數(shù)服務(wù)器)。
對外:除了對內(nèi)部產(chǎn)品優(yōu)化,也開始對外開源,目的是把核心技術(shù)往外推,讓更多企業(yè)開發(fā)者能夠意識到異構(gòu)多級存儲、現(xiàn)代存儲架構(gòu)上帶來的優(yōu)化工作,也可以推進(jìn)持久內(nèi)存的普及。
對內(nèi)+對外:(已開源工作)。VLDB 2021:主要是針對特征工程數(shù)據(jù)庫,做基于PMem的優(yōu)化,核心持久化跳表即將合入PMDK核心庫,這在國內(nèi)是領(lǐng)先的。基于Pafka的Kafka優(yōu)化:10x性能提升,且無需修改代碼。還有一些打算開源、正在開發(fā)中的工作,例如OpenEmbedding,就是針對訓(xùn)練的參數(shù)服務(wù)器,它是和TensorFlow整合,方便快捷,包括向量、Elasticsearch、PMemStore、OpenMLDB,OpenMLDB就是已經(jīng)開源的特征工程數(shù)據(jù)庫。這兩者整合起來,會在明年進(jìn)行開源。另一方面,第四范式和英特爾也在打造代化存儲架構(gòu)的技術(shù)社區(qū)MemArk。

7面向AI全流程的異構(gòu)存儲優(yōu)化
從第四范式的產(chǎn)品角度看,主要包含了離線訓(xùn)練和在線推理。在離線訓(xùn)練中,對內(nèi)存消耗量會特別高,所以會做低成本擴(kuò)容工作,使用PMem做內(nèi)存擴(kuò)容。在線推理中,因?yàn)樗鼘π阅芤蟾撸谐志没枨螅詴肁D Mode在參數(shù)服務(wù)器、特征功能數(shù)據(jù)庫、消息隊(duì)列方面去做優(yōu)化。
PMem具體如何使用?其實(shí)是取決于實(shí)際情況去做優(yōu)化。

二、特征工程數(shù)據(jù)庫在PMem上的優(yōu)化
下圖講了特征工程數(shù)據(jù)庫用在哪里。

從第四范式的角度,它大部分用于決策場景。例如,反欺詐、反洗錢以及推薦系統(tǒng)。
如下圖,左邊是Off-line Training,右邊是On-line Inference。那么Off-line Training的特征在哪里?其實(shí)就在這OpenMLDB, 當(dāng)在線請求產(chǎn)生一條數(shù)據(jù)記錄時,它就會去做一個實(shí)時的特征抽取,產(chǎn)生額外的有用的特征,然后這個特征抽取會為 On-line Inference系統(tǒng)去做模型推理,所以它是在線場景下關(guān)鍵組件。因?yàn)樗窃诰€系統(tǒng),所以它有強(qiáng)的時間限制,延時不能太高。在此,我們更關(guān)注于OpenMLDB怎么去做性能優(yōu)化以及做持久內(nèi)存優(yōu)化。

接下來著重介紹什么是特征(features)。特征在決策類場景中非常重要,一般從在線請求中產(chǎn)生的數(shù)據(jù)并不能直接去用來做推理,而是需要進(jìn)一步做特征抽取。例如,我們需要拿到當(dāng)前交易產(chǎn)生之前10秒、1分鐘、5分鐘內(nèi)產(chǎn)生的交易做多的商店信息,這些都是通過實(shí)時的特征抽取拿到的而不能提前計算出來。所以這些基于時間窗口的實(shí)時特征抽取,就是在線特征工程。

Future Extraction會有挑戰(zhàn):
第一,它大部分的特征不能被提前算好,例如一個交易,要算當(dāng)前這個點(diǎn)往前推的時間窗口里面的信息,可能一分鐘或者一小時或者幾天的時間信息。這跟當(dāng)前發(fā)生的時間狀態(tài)是有關(guān)系的,所以不能去做提前處理。
第二,特征抽取會基于很多個時間窗口,計算量會比較高。
第三,此時會有很多特征產(chǎn)生,為了做在線推理,傳統(tǒng)商業(yè)數(shù)據(jù)庫并不能滿足需求,一個是隨著時間窗口的增長,Latency會增長得非常快,那么它性能很快就會超過幾十個milliseconds,這可能會影響到線上服務(wù)質(zhì)量,這種情況下它就不符合線上服務(wù)需求。
綜上所述,我們需要去開發(fā)一個專門面向人工智能決策場景的特征工程數(shù)據(jù)庫。

在這個大背景下,對于第四范式而言,OpenMLDB的設(shè)計包含兩方面:第一,它提供FEQL引擎,F(xiàn)EQL引擎提供了FEQL語法,F(xiàn)EQL語法類似于SQL-like language。但是它可以更好地支持,比如基于時間窗口的特征抽取。第二,從存儲引擎角度來講,使用了雙層跳表結(jié)構(gòu),去支持專門為時間窗口查詢來做一些優(yōu)化。

FEQL語法與SQL基本相似。除了有如Time_Window比較特殊的、專門給時間窗口查詢做的語法,也會針對此類語法做優(yōu)化。

底層的存儲引擎結(jié)構(gòu)是雙層的 Skiplist。

基于這些優(yōu)化,OpenMLDB它本身相比較于其他的database,就具有非常大的性能優(yōu)勢。同樣與前面的DB-X、DB-Y相比,性能優(yōu)勢非常大,它性能上的 Latency,延遲能符合線上服務(wù)的需求。

基于OpenMLDB,我們DRAM版本的OpenMLDB也看到兩大痛點(diǎn):
第一,是因?yàn)镺penMLDB是為了線上推理用的,線上推理為了達(dá)到高性能的一般數(shù)據(jù)和索引都會放在內(nèi)存當(dāng)中,為了能夠及時響應(yīng),這對內(nèi)存需求會特別高。運(yùn)用一個實(shí)際的銀行反欺詐業(yè)務(wù)場景,這里只有三個月的數(shù)據(jù)量,該數(shù)據(jù)可能需要占用10TB,如果用普通DRAM去搭建,成本很高。而且部分客戶反映,他們并不是為了性能而去擴(kuò)展設(shè)備數(shù)量、機(jī)器資源,而只是為了能兜住內(nèi)存容量,他們需要配備可能十幾臺機(jī)器,才能去兜住OpenMLDB。
第二,OpenMLDB都有把 data通過snapshot或者binlog這種方式,也就是Sync到磁盤、外部存儲,去做數(shù)據(jù)備份。那么當(dāng)這個操作發(fā)生時,它就會對延遲性能帶來很大影響。因?yàn)榇蟛糠植僮鞫紩趦?nèi)存中,但是當(dāng) Sync操作發(fā)生時,就會涉及到磁盤,由此產(chǎn)生長尾的延遲效應(yīng)。
OpenMLDB是為了在線服務(wù)所設(shè)計的,需要保證線上服務(wù)質(zhì)量,不允許線上的節(jié)點(diǎn)過長時間離線。在這種背景下,如果節(jié)點(diǎn)離線,則需要從網(wǎng)絡(luò)磁盤中去重新拉回來去構(gòu)建內(nèi)存數(shù)據(jù),由此恢復(fù)的時間會比較長。

因此,在該種情況下需要用PMem優(yōu)化OpenMLDB。
PMem的用法有多種:數(shù)據(jù)和 index放在DRAM,log Snapshot存在外存。其中最簡單的用法是把PMem當(dāng)成memory mode,這種用法可以通過大容量解決成本問題,但無法享受內(nèi)存數(shù)據(jù)持久化帶來的快速恢復(fù)優(yōu)勢。
所以需要進(jìn)一步通過AD mode做OpenMLDB優(yōu)化,在這種優(yōu)化情況下,整個系統(tǒng)數(shù)據(jù)庫架構(gòu)將發(fā)生改變,DRAM版本的OpenMLDB,需要將log Snapshot持久化到外部存儲上。
在這種模式下,由于整個內(nèi)存具有持久化功能,所以不需要將數(shù)據(jù)持久化到外存上。內(nèi)部的Skiplist跳表數(shù)據(jù)結(jié)構(gòu)具有持久化功能,數(shù)據(jù)會整體持久化在內(nèi)存中。
顯然,這有諸多優(yōu)勢,第一,沒有 Sync的過程。第二,掉電后數(shù)據(jù)會立即從內(nèi)存中恢復(fù),無需漫長的時間恢復(fù)。

然而,這會遇到一個問題:如何保證持久化、語義的正確性和高效性。
其中最主要問題就是做Compare-And-Swap操作,在很多系統(tǒng)中去做無鎖的并發(fā)情況,其實(shí)在 OpenMLDB里面也應(yīng)用。在PMem環(huán)境下,CAS操作其實(shí)并不具有持久化語義。在多線程情況下,它會對Data inconsitency造成問題。
舉個例子,第一個Thread進(jìn)行Compare-And-Swap操作,第二個Thread基于計算出來的 t值做特征工程計算,然后把計算出來的特征進(jìn)行flush。t1的值本來也應(yīng)該被flush到 PMem,但可能在這個點(diǎn)掉電或者程序崩潰。在這種情況下,f1計算出來的特征被刷到了持久內(nèi)存當(dāng)中,然而原來的數(shù)據(jù)t1反而沒有,這就造成了data inconsistency。

為了解決Compare-And-Swap問題,提出了Persistent-Compare-And-Swap。解決的思路是進(jìn)行flush on read操作,每次做read時都去做持久化操作,能從根本上解決正確性問題。但是它會引入比較大的overhead,因?yàn)閷γ恳粋€read都進(jìn)行flush顯然不對,某些read根本無需這樣做。
在此情況下,本文引入smart pointer技術(shù),即智能指針。在x86的架構(gòu)上,內(nèi)存地址要求八字節(jié)對齊,指針?biāo)赶虻牡刂返淖詈笕灰恢笔?。將三位的最后一位作為dirty的 flag,用于標(biāo)記數(shù)據(jù)是否已被flush,如果已被flush,就無需再做 flush操作。基于該技術(shù),可以做 persistent 操作,同時避免無效的、多余的、多次的flush持久化操作。

對于FEDB,本文使用真實(shí)的銀行反欺詐數(shù)據(jù),數(shù)據(jù)共有10TB,這里是一些優(yōu)化過的不同版本。(在Paper里面稱FEDB,開源以后叫open MLDB,所以表格里還是FEDB。)
首先,從性能角度來看,相較于這些傳統(tǒng)的這種數(shù)據(jù)庫,不管是DRAM版本的FEDB還是PMem版本的FEDB,都會達(dá)到相當(dāng)好的性能。

基于 PMem版本優(yōu)化有諸多優(yōu)勢:
一是long tail latency方面。黃色柱子和藍(lán)色柱子分別代表了DRAM版本和典型的PMem版本,在 TP-99999標(biāo)準(zhǔn)下的long tail latency,大概有20%的性能改進(jìn)。
二是 recovery time方面。基于DRAM需要6個小時才能完成一個完整的鏡像恢復(fù),但如果基于內(nèi)存做持久化OpenMLDB,只需一分鐘就能從內(nèi)存重新恢復(fù)。其次,從CPU的角度來看,節(jié)省了一半左右的成本投入。

三、基于分級存儲架構(gòu)的Kafka優(yōu)化
Kafka廣泛用于大數(shù)據(jù)處理、人工智能,主要用于消息傳輸日志的搜集。Kafka架構(gòu)具有高性能、高可擴(kuò)展、高可用的特性。然而,由于它的logo文件需要做持久化,所以當(dāng)壓力上來時,無論是latency還是super都會受限于存儲設(shè)備。
Pafka是Kafka的優(yōu)化版本,Pafka版本在存儲方面進(jìn)行了優(yōu)化。首先,由于整體上基于Kafka架構(gòu),所以客戶業(yè)務(wù)代碼是零遷移成本,他們無需做任何改造,即可零成本遷移到Kafka平臺上,使用持久內(nèi)存的Pafka可當(dāng)做持久設(shè)備。它可打破性能瓶頸,在成本和性能上都有大幅度的提升。

從具體實(shí)現(xiàn)角度來講,本來是通過這個文件 channel去存儲到外部存儲HDD或者SSD上,現(xiàn)在是通過PMDK將Kafka的 broker和 SEGMENT的存儲,,將它賦能為可存儲在PMem上。
在此,引入 MixChannel的概念,它不僅可存儲在單一介質(zhì),還可以存儲在PMem或者存儲在第二級的外存上。例如,考慮到PMem的容量比較小,可以同時用 PMem和SSD或者HDD。
怎樣把容量都用起來,保證一定的性能優(yōu)勢?在此引入分級存儲的概念,然后引入數(shù)據(jù)遷移策略,將冷熱數(shù)據(jù)分開存儲,希望大部分熱數(shù)據(jù)的讀寫能落到PMem上,冷數(shù)據(jù)落到速度比較慢的存儲設(shè)備上。這個特性會在0.2.0版本中引入,在這個月底或者下個月初發(fā)布。現(xiàn)在的0.1.1版本全部存在PMem上。

0.1.1版本使用PMem做整個Kafka的性能兜底,是性能優(yōu)化的表現(xiàn)。相比于 HDD或者SSD,它具有非常大的性能優(yōu)勢,例如SATA SSD,可以達(dá)到將近20倍的性能改善。

Pafka工作是下半年的重點(diǎn)工作,目前0.1.1版本已經(jīng)開源,可以去試用,包括跟其他partner的合作,也已開始測試性能。0.1.1版本引入了PMem作為持久化介質(zhì),但并沒有真正引入分級存儲的概念。在0.2.0版本,會引入分級存儲和數(shù)據(jù)遷移機(jī)制,能夠在性能和容量上達(dá)到權(quán)衡,希望在數(shù)據(jù)量要求比較大的場景下,也能達(dá)到加速效果。

四、MenArk社區(qū)
該社區(qū)由第四范式主導(dǎo)創(chuàng)立,英特爾是贊助者之一。MenArk社區(qū)主要關(guān)注先進(jìn)的存儲架構(gòu)技術(shù),基于現(xiàn)代化存儲架構(gòu)為一些流行的開源軟件做系統(tǒng)性優(yōu)化。例如,Kafka、數(shù)據(jù)庫系統(tǒng)、社區(qū),將來都會去做優(yōu)化工作。MenArk社區(qū)是一個開放性社區(qū),歡迎合作伙伴的加入。同時,在此可以查看開源項(xiàng)目,主要包括:Kafka、OpenMLDB、PMems。
