掃二維碼與項(xiàng)目經(jīng)理溝通
我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問(wèn)/技術(shù)咨詢/運(yùn)營(yíng)咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
作者:翰明 2022-01-21 08:36:25
云計(jì)算
云原生 Garner預(yù)測(cè),到2022年,所有數(shù)據(jù)庫(kù)中有75%將部署或遷移至云平臺(tái)。另外一家權(quán)威機(jī)構(gòu)IDC也預(yù)測(cè),在2025年,超過(guò)50%的數(shù)據(jù)庫(kù)將部署在公有云上,而中國(guó)則會(huì)達(dá)到驚人的70%以上。

右江網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)!從網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、自適應(yīng)網(wǎng)站建設(shè)等網(wǎng)站項(xiàng)目制作,到程序開發(fā),運(yùn)營(yíng)維護(hù)。創(chuàng)新互聯(lián)成立于2013年到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來(lái)保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)。
Garner預(yù)測(cè),到2022年,所有數(shù)據(jù)庫(kù)中有75%將部署或遷移至云平臺(tái)。另外一家權(quán)威機(jī)構(gòu)IDC也預(yù)測(cè),在2025年,超過(guò)50%的數(shù)據(jù)庫(kù)將部署在公有云上,而中國(guó)則會(huì)達(dá)到驚人的70%以上。云數(shù)據(jù)庫(kù)經(jīng)過(guò)多年發(fā)展,經(jīng)歷從Cloud-Hosted (云托管)到 Cloud Native(云原生)模式的轉(zhuǎn)變。
Cloud-Hosted:基于市場(chǎng)和業(yè)界的云需求,大部分廠商選擇了云托管作為演進(jìn)的第一步。這種模式將不再需要用戶線下自建IDC,而是依托于云提供商的標(biāo)準(zhǔn)化資源將數(shù)據(jù)倉(cāng)庫(kù)進(jìn)行移植并提供高度托管,從而解放了用戶對(duì)底層硬件的管理成本和靈計(jì)劃資源的約束。
Cloud-Native:然而隨著更多的業(yè)務(wù)向云上遷移,底層計(jì)算和存儲(chǔ)一體的資源綁定,導(dǎo)致用戶在使用的過(guò)程中依然需要考量不必要的資源浪費(fèi),如計(jì)算資源增加會(huì)要求存儲(chǔ)關(guān)聯(lián)增加,導(dǎo)致無(wú)效成本。用戶開始期望云資源能夠?qū)?shù)據(jù)倉(cāng)庫(kù)進(jìn)行更為細(xì)粒度的資源拆解,即對(duì)計(jì)算,存儲(chǔ)的能力進(jìn)行解耦并拆分成可售賣單元,以滿足業(yè)務(wù)的資源編排。到這里,云原生的最大化價(jià)值才被真正凸顯,我們不在著重于打造存算平衡的數(shù)據(jù)倉(cāng)庫(kù),而是面向用戶業(yè)務(wù),允許存在大規(guī)模的計(jì)算或存儲(chǔ)傾斜,將業(yè)務(wù)所需要的資源進(jìn)行獨(dú)立部署,并按照最小單位進(jìn)行售賣。這一刻我們真正的進(jìn)入了數(shù)據(jù)倉(cāng)庫(kù)云原生時(shí)代。
阿里云在2021云棲大會(huì)上,預(yù)告了全新云原生架構(gòu)的數(shù)據(jù)倉(cāng)庫(kù)【1】。本文介紹了云原生數(shù)據(jù)倉(cāng)庫(kù)產(chǎn)品AnalyticDB PostgreSQL(以下簡(jiǎn)稱ADB PG)從Cloud-Hosted到Cloud-Native的演進(jìn)探索,探討為了實(shí)現(xiàn)真正的資源池化和靈活售賣的底層設(shè)計(jì)和思考,涵蓋內(nèi)容包括產(chǎn)品的架構(gòu)設(shè)計(jì),關(guān)鍵技術(shù),性能結(jié)果,效果實(shí)現(xiàn)和后續(xù)計(jì)劃幾方面。(全文閱讀時(shí)長(zhǎng)約為10分鐘)
為了讓用戶可以快速的適配到云數(shù)據(jù)倉(cāng)庫(kù),目前我們采用的是云上MPP架構(gòu)的設(shè)計(jì)理念,將協(xié)調(diào)節(jié)點(diǎn)和計(jì)算節(jié)點(diǎn)進(jìn)行獨(dú)立部署,但承載于單個(gè)ECS上,實(shí)現(xiàn)了計(jì)算節(jié)點(diǎn)存儲(chǔ)計(jì)算一體的部署設(shè)計(jì),該設(shè)計(jì)由于設(shè)計(jì)架構(gòu)和客戶側(cè)自建高度適配,可快速并無(wú)損的將數(shù)倉(cāng)業(yè)務(wù)遷移至云上,對(duì)于早期的云適配非常友好且滿足了資源可平行擴(kuò)展的主要訴求。隨著云原生的進(jìn)一步演進(jìn),我們提供了全新的存算分離架構(gòu),將產(chǎn)品進(jìn)一步拆分為服務(wù)層、計(jì)算層和共享存儲(chǔ)層,架構(gòu)圖如下:
Master協(xié)調(diào)節(jié)點(diǎn):保存全局的schema信息,并實(shí)現(xiàn)了全局事務(wù)管理;行存引擎:用來(lái)保存元數(shù)據(jù)信息,這里的元數(shù)據(jù)信息主要指共享存儲(chǔ)文件的可見性信息,包括兩個(gè)部分:
基于行存我們可以繼承PG的本地事務(wù)能力,在增刪改查的同時(shí),與PG的事務(wù)能力完全兼容;
本地緩存:通過(guò)引入存儲(chǔ)團(tuán)隊(duì)的DADI來(lái)實(shí)現(xiàn)高性能的本地緩存,DADI全稱是Alibaba Cloud Data Accelerator for Disaggregated Infrastructure,相比開源產(chǎn)品,性能有數(shù)量級(jí)的提升;
共享存儲(chǔ):我們借鑒了ClickHouse的一些關(guān)鍵設(shè)計(jì),在存儲(chǔ)層實(shí)現(xiàn)了一個(gè)基于MergeTree的行列混存,此外我們對(duì)共享存儲(chǔ)基于文件接口做了一層統(tǒng)一訪問(wèn)接口,同時(shí)高度適配了OSS和HDFS 兩種形態(tài)的分布式文件系統(tǒng);
當(dāng)我們?cè)诩軜?gòu)設(shè)計(jì)的時(shí)候,和同樣源自Greenplum的HAWQ對(duì)比,HAWQ把元數(shù)據(jù)都保存在master,在每次寫的時(shí)候,把修改的元數(shù)據(jù)帶到master來(lái)更新,讀的時(shí)候,先從master讀取需要的元數(shù)據(jù),然后在執(zhí)行計(jì)劃里面把元數(shù)據(jù)都帶上,這樣segment就能拿到對(duì)應(yīng)的元數(shù)據(jù), 同時(shí)segment可以完全無(wú)狀態(tài)。但是這個(gè)設(shè)計(jì)會(huì)帶來(lái)2個(gè)核心問(wèn)題:
1. 元數(shù)據(jù)膨脹導(dǎo)致master成為瓶頸。
2. 受限于元數(shù)據(jù)的性能,無(wú)法支持高并發(fā)的實(shí)時(shí)寫入。而我們不這樣設(shè)計(jì)做的原因是我們希望在未來(lái)能夠支持高并發(fā)的任務(wù),ADB PG大概花了2年多的時(shí)間,將Greenplum的單點(diǎn)master架構(gòu)拓展為multi-master,核心是為了解決高并發(fā)實(shí)時(shí)寫入的問(wèn)題,如果把元數(shù)據(jù)都保存在master上會(huì)帶來(lái)如問(wèn)題:1. master上面的元數(shù)據(jù)存儲(chǔ)和訪問(wèn)容易形成單點(diǎn)瓶頸2. 需要對(duì)ADB PG的執(zhí)行層做大量的重構(gòu),實(shí)現(xiàn)在執(zhí)行計(jì)劃里面把元數(shù)據(jù)都帶上,這會(huì)急劇的增加查詢計(jì)劃本身的帶寬,這個(gè)對(duì)于高并發(fā)的小查詢非常不友好。所以我們改進(jìn)了架構(gòu),將元數(shù)據(jù)分散到segment,規(guī)避并實(shí)現(xiàn)了:
1. master的存儲(chǔ)和讀寫都不會(huì)成為瓶頸
2. 無(wú)需對(duì)執(zhí)行層做重構(gòu),將元數(shù)據(jù)分散減少單次查詢的帶寬壓力。
3. 將segment上的元數(shù)據(jù)放到分布式kv上,解決擴(kuò)縮容的元數(shù)據(jù)搬遷問(wèn)題。
共享存儲(chǔ)使用OSS的原因在于,隨著單個(gè)用戶業(yè)務(wù)數(shù)據(jù)不斷增長(zhǎng),需要一個(gè)可持續(xù)發(fā)展的存儲(chǔ)方案,而OSS的低存儲(chǔ)成本,高可用性和數(shù)據(jù)持久性是最好的選擇。
|
維度 |
OSS |
ESSD云盤(PL1) |
|
成本 |
0.56元/GB/月 |
2元/GB/月 |
|
高可用 |
99.995% |
99.975% |
|
數(shù)據(jù)持久性 |
99.9999999999%(12個(gè)9) |
99.9999999%(9個(gè)9) |
使用OSS的另外一個(gè)好處在于按需付費(fèi),用戶不需要預(yù)制存儲(chǔ)空間大小,存了多少數(shù)據(jù),付多少錢,數(shù)據(jù)刪除后即不再收費(fèi);ESSD云盤通常需要根據(jù)數(shù)據(jù)計(jì)算存儲(chǔ)水位,無(wú)法做到將存儲(chǔ)資源真正的按需供應(yīng),而且無(wú)法自動(dòng)縮容,這些都違背了我們?cè)圃脑O(shè)計(jì)理念。但同時(shí)OSS的劣勢(shì)在于RT:
|
維度 |
OSS |
ESSD云盤(PL1) |
|
RT |
50 ms |
200us |
為了解決OSS的RT問(wèn)題,我們?yōu)橛?jì)算節(jié)點(diǎn)配置了一定比例的本地盤,用來(lái)做訪問(wèn)加速。此外,我們?cè)O(shè)計(jì)了一個(gè)高性能的行列混存,借鑒了ClickHouse mergetree存儲(chǔ)的核心思想,以有序?yàn)楹诵?,文件?nèi)絕對(duì)有序,文件與文件大致相對(duì)有序,通過(guò)merge的異步操作,實(shí)現(xiàn)文件和并和排序,基于有序,我們?cè)谖募?nèi)設(shè)計(jì)了3層的統(tǒng)計(jì)信息,并做了大量的IO裁剪優(yōu)化。
下面我們對(duì)每個(gè)技術(shù)點(diǎn)做進(jìn)一步介紹。
為了實(shí)現(xiàn)快速的彈性伸縮,我們的方式是數(shù)據(jù)在共享存儲(chǔ)上hash bucket來(lái)組織,擴(kuò)縮容后通過(guò)一致性hash把計(jì)算節(jié)點(diǎn)和bucket做重新映射,為了解決bucket與segment分配的均勻性,并降低擴(kuò)縮容后cache失效的影響,我們對(duì)傳統(tǒng)的一致性hash算法做了改進(jìn),支持?jǐn)U縮容時(shí)的動(dòng)態(tài)映射。
把數(shù)據(jù)根據(jù)hash bucket分成多個(gè)分片,按分片粒度在擴(kuò)縮容的重新映射對(duì)象存儲(chǔ)上的數(shù)據(jù)。如果擴(kuò)容計(jì)算節(jié)點(diǎn)超過(guò)分片個(gè)數(shù)的時(shí)候,只能重分布數(shù)據(jù)。為了解決這個(gè)問(wèn)題,我們支持hash bucket可以后臺(tái)分裂和合并,避免重新分布數(shù)據(jù)。
上述是擴(kuò)縮容時(shí)“數(shù)據(jù)”的重現(xiàn)映射,而描述數(shù)據(jù)文件可見性的元數(shù)據(jù),由于保存在行表中,我們還是使用了Greenplum的數(shù)據(jù)重分布策略,不同的是,為了加速元數(shù)據(jù)的重分布,我們做了并行化分布等優(yōu)化。我們以擴(kuò)容為例進(jìn)一步細(xì)化擴(kuò)容的流程:
結(jié)合ECS資源池化,網(wǎng)卡并行加載和docker鏡像預(yù)熱等技術(shù),16節(jié)點(diǎn)內(nèi)端到端的耗時(shí)接近1分鐘。
分層存儲(chǔ)的實(shí)現(xiàn)如下:
如上圖所示,我們把存儲(chǔ)的資源分成3層,包括內(nèi)存、本地盤和共享存儲(chǔ)。內(nèi)存:主要負(fù)責(zé)行存訪問(wèn)加速,并負(fù)責(zé)文件統(tǒng)計(jì)信息的緩存;本地盤:作為行存的持久化存儲(chǔ),并作為遠(yuǎn)端共享存儲(chǔ)的本地加速器;遠(yuǎn)端的共享存儲(chǔ):作為數(shù)據(jù)的持久化存儲(chǔ)。
寫入流程如下:
我們?cè)趯懭氲臅r(shí)候,是按照bucket對(duì)segment上的數(shù)據(jù)做了進(jìn)一步劃分,這里會(huì)帶來(lái)小文件的問(wèn)題。為了解決小文件問(wèn)題,我們做了下面幾點(diǎn)優(yōu)化:
1. Group flush:一批寫入的數(shù)據(jù),可以通過(guò)group flush寫到同一個(gè)OSS文件,我們的OSS文件采用了ORC格式,不同bucket寫入到對(duì)應(yīng)strip;
2. 流水線異步并行:編碼攢批,排序是典型的cpu密集型任務(wù),上傳到oss是典型的網(wǎng)絡(luò)IO密集型任務(wù),我們會(huì)把這2種任務(wù)類型并行起來(lái),在上傳oss的任務(wù)作為異步任務(wù)執(zhí)行,同時(shí)對(duì)下一批數(shù)據(jù)編碼排序,加快寫入性能。
因?yàn)檫h(yuǎn)端持久化存儲(chǔ)提供了12個(gè)9的持久性,所以只有保存元數(shù)據(jù)的行存才有WAL日志和雙副本來(lái)保證可靠性,數(shù)據(jù)本身寫穿到共享存儲(chǔ),無(wú)需WAL日志和多副本,由于減少了WAL日志和WAL日志的主備同步,又通過(guò)異步并行和攢批,在批量寫入場(chǎng)景,我們寫入性能做到了基本與ECS彈性存儲(chǔ)版本性能持平。
讀取流程如下:
為了解決讀OSS帶來(lái)的延遲,我們也引入了DADI幫忙我們實(shí)現(xiàn)緩存管理和封裝了共享文件的訪問(wèn),讀文件的時(shí)候,首先會(huì)判斷是否本地有緩存,如果有則直接從本地磁盤讀,沒有才會(huì)去 OSS讀,讀到后會(huì)緩存在本地。寫的時(shí)候會(huì)直寫OSS,并回寫本地磁盤,回寫是一個(gè)異步操作。對(duì)于本地緩存數(shù)據(jù)的淘汰我們也通過(guò)DADI來(lái)管理,他會(huì)根據(jù)LRU/LFU策略來(lái)自動(dòng)淘汰冷數(shù)據(jù)。
由于事務(wù)是使用PG的行存實(shí)現(xiàn),所以與ADB PG的事務(wù)完全兼容,帶來(lái)的問(wèn)題是,我們?cè)跀U(kuò)縮容的時(shí)候需要重新分布這部分?jǐn)?shù)據(jù),我們重新設(shè)計(jì)了這塊數(shù)據(jù)的重分布機(jī)制,通過(guò)預(yù)分區(qū),并行拷貝,點(diǎn)對(duì)點(diǎn)拷貝等技術(shù),極大縮短了擴(kuò)縮容時(shí)間。
總結(jié)一下性能優(yōu)化點(diǎn):? 通過(guò)本地行存表實(shí)現(xiàn)事務(wù)ACID,支持?jǐn)?shù)據(jù)塊級(jí)別的并發(fā);
我們?cè)贔ile Metadata中保存了共享存儲(chǔ)文件相關(guān)的信息,它的結(jié)構(gòu)如下:
|
字段 |
類型 |
說(shuō)明 |
|
table_oid |
Int32 |
表的oid |
|
hash_bucket_id |
Int16 |
hash_bucket的id |
|
level |
Int16 |
邏輯文件所處的merge級(jí)別,0表示delta文件 |
|
physical_file_id |
Int64 |
邏輯文件對(duì)應(yīng)的oss物理文件id |
|
stripe_id |
Int64 |
邏輯文件對(duì)應(yīng)的oss物理文件中的stripe id |
|
Total_count |
int32 |
邏輯文件總共具有的行數(shù),包括被刪除行數(shù) |
Hash bucket:是為了在擴(kuò)縮容的時(shí)候搬遷數(shù)據(jù)的時(shí)候,能夠按照bucket來(lái)掃描,查詢的時(shí)候,也是一個(gè)bucket跟著一個(gè)bucket;Level:是merge tree的層次,0層代表實(shí)時(shí)寫入的數(shù)據(jù),這部分?jǐn)?shù)據(jù)在合并的時(shí)候有更高的權(quán)重;Physical file id:是文件對(duì)應(yīng)的id,64字節(jié)是因?yàn)樗辉倥csegment關(guān)聯(lián),不再只需要保證segment內(nèi)table的唯一性,需要全局唯一;Stripe id:是因?yàn)橐粋€(gè)oss文件可以包含多個(gè)bucket 的文件,以stripe為單位,方便在segment一次寫入的多個(gè)bucket合并到一個(gè)oss文件中。避免oss小文件,導(dǎo)致性能下降,和oss小文件爆炸;Total count:是文件行數(shù),這也是后臺(tái)合并的一個(gè)權(quán)重,越大合并的權(quán)重越低 。
Visibility bitmap記錄了被刪除的文件信息
|
字段 |
類型 |
說(shuō)明 |
|
physical_file_id |
Int64 |
邏輯文件對(duì)應(yīng)的oss物理文件id |
|
stripe_id |
Int32 |
邏輯文件對(duì)應(yīng)的oss物理文件中的stripe id |
|
start_row |
Int32 |
delete_bitmap對(duì)應(yīng)的起始行號(hào),每32k行對(duì)應(yīng)一個(gè)delete_bitmap |
|
hash_bucket_id |
Int16 |
hash_bucket的id |
|
delete_count |
Int32 |
該delete_bitmap總共記錄刪除了多少行 |
|
bitmap |
bytea |
delete_bitmap的具體數(shù)值,壓縮存儲(chǔ) |
Start_row對(duì)應(yīng)32k對(duì)應(yīng)一個(gè)delete bitmap。這個(gè)32000 4k,行存使用的32k的page可以保存7條記錄。Delete count是被刪除的數(shù)量。我們無(wú)需訪問(wèn)oss,可以直接得到需要merge的文件,避免訪問(wèn)oss帶來(lái)的延遲,另外oss對(duì)于訪問(wèn)的吞吐也有限額,避免頻繁訪問(wèn)導(dǎo)致觸發(fā)oss的限流。
Mergetree的結(jié)構(gòu)如上圖左側(cè)所示,核心是通過(guò)后臺(tái)merge的方式,把小文件merge成有序的大文件,并且在merge的時(shí)候,我們可以對(duì)數(shù)據(jù)重排,例如數(shù)據(jù)的有序特性做更多的優(yōu)化,參考后續(xù)的有序感知優(yōu)化。與leveldb的不同在于:
1. 0層實(shí)時(shí)寫入的會(huì)做合并,不同bucket的文件會(huì)合并成大文件,不同bucket會(huì)落到對(duì)應(yīng)的stripe;
2. Merge會(huì)跨層把符合merge的文件做多路歸并,文件內(nèi)嚴(yán)格有序,但是文件間大致有序,層數(shù)越高,文件越大,文件間的overlap越小。
每個(gè)文件我們使用了行列混存的格式,右側(cè)為行列混存的具體的存儲(chǔ)格式,我們是在ORC的基礎(chǔ)上做了大量?jī)?yōu)化。
ORC文件:一個(gè)ORC文件中可以包含多個(gè)stripe,每一個(gè)stripe包含多個(gè)row group,每個(gè)row group包含固定條記錄,這些記錄按照列進(jìn)行獨(dú)立存儲(chǔ)。
Postscript:包括文件的描述信息PostScript、文件meta信息(包括整個(gè)文件的統(tǒng)計(jì)信息,數(shù)據(jù)字典等)、所有stripe的信息和文件schema信息。
stripe:stripe是對(duì)行的切分,組行形成一個(gè)stripe,每次讀取文件是以行組為單位的,保存了每一列的索引和數(shù)據(jù)。它由index data,row data和stripe footer組成。
File footer:保存stripe的位置、每一個(gè)列的在該stripe的統(tǒng)計(jì)信息以及所有的stream類型和位置。
Index data:保存了row group級(jí)別的統(tǒng)計(jì)信息。
Data stream:一個(gè)stream表示文件中一段有效的數(shù)據(jù),包括索引和數(shù)據(jù)兩類。索引stream保存每一個(gè)row group的位置和統(tǒng)計(jì)信息,數(shù)據(jù)stream包括多種類型的數(shù)據(jù),具體需要哪幾種是由該列類型和編碼方式?jīng)Q定,下面以integer和string 2種類型舉例說(shuō)明:
對(duì)于一個(gè)Integer字段,會(huì)同時(shí)使用一個(gè)比特流和整形流。比特流用于標(biāo)識(shí)某個(gè)值是否為null,整形流用于保存該整形字段非空記錄的整數(shù)值。
String類型字段,ORC writer在開始時(shí)會(huì)檢查該字段值中不同的內(nèi)容數(shù)占非空記錄總數(shù)的百分比不超過(guò)0.8的話,就使用字典編碼,字段值會(huì)保存在一個(gè)比特流,一個(gè)字節(jié)流及兩個(gè)整形流中。比特流也是用于標(biāo)識(shí)null值的,字節(jié)流用于存儲(chǔ)字典值,一個(gè)整形流用于存儲(chǔ)字典中每個(gè)詞條的長(zhǎng)度,另一個(gè)整形流用于記錄字段值。如果不能用字典編碼,ORC writer會(huì)知道這個(gè)字段的重復(fù)值太少,用字典編碼效率不高,ORC writer會(huì)使用一個(gè)字節(jié)流保存String字段的值,然后用一個(gè)整形流來(lái)保存每個(gè)字段的字節(jié)長(zhǎng)度。
在ORC文件中保存了三個(gè)層級(jí)的統(tǒng)計(jì)信息,分別為文件級(jí)別、stripe級(jí)別和row group級(jí)別。而提升存儲(chǔ)性能的核心是減少IO,我們基于ORC的統(tǒng)計(jì)信息和索引實(shí)現(xiàn)各種下推,幫助我們實(shí)現(xiàn)IO裁剪。例如Projection下推,我們只會(huì)掃描需要物化的列。Agg下推中,我們會(huì)直接把需要的min,max,sum,unique從統(tǒng)計(jì)信息或者索引中讀取即可返回,避免了對(duì)data stream的解壓。對(duì)于predicate,我們還支持把filter下推,通過(guò)統(tǒng)計(jì)信息直接做過(guò)濾,直接跳過(guò)不符合的條件的stripe,我們支持各種操作符,以及in/not in,以及表達(dá)式的等價(jià)轉(zhuǎn)換。
此外我們針對(duì)存儲(chǔ)格式對(duì)性能還做了下面的優(yōu)化:1. 零拷貝:為了把ORC的數(shù)據(jù)類型轉(zhuǎn)換成PG數(shù)據(jù)類型,我們對(duì)于定長(zhǎng)類型的做值拷貝,變長(zhǎng)類型直接轉(zhuǎn)換成PG的datum做指針引用。2. Batch Scan:面向column采用batch scan,替代逐行訪問(wèn)而是先掃完一列,再掃下一列,這樣對(duì)CPU cache更加友好。3. 支持Seek read:方便過(guò)濾命中情況下的跳轉(zhuǎn)。
DADI幫助我們實(shí)現(xiàn)2個(gè)能力,一個(gè)是高效的緩存管理,另外一個(gè)是統(tǒng)一存儲(chǔ)訪問(wèn)。在了解DADI之前,我們可以首先看一下,DADI與開源解決方案從RT與throughput 2個(gè)維度做了對(duì)比測(cè)試:
|
維度 |
RT |
Throughput |
||
|
產(chǎn)品 |
DADI |
Alluxio-Fuse |
DADI |
Alluxio-Fuse |
|
命中內(nèi)存 |
6~7 us |
408 us |
單線程: 4.0 GB/s四線程: 16.2 GB/s |
2.5 GB/s |
|
命中磁盤 |
127 us |
435 us |
四線程: 541 MB/s |
0.63 GB/s |
從中看到,DADI相比開源解決方案alluxio在內(nèi)存命中的場(chǎng)景RT上有數(shù)量級(jí)的提升,在throughput上也有明顯的優(yōu)勢(shì)。在命中磁盤的場(chǎng)景,也有明顯的性能優(yōu)勢(shì),在部分分析場(chǎng)景下,我們會(huì)頻繁但是少量讀取文件統(tǒng)計(jì)信息,這些統(tǒng)計(jì)信息我們會(huì)緩存在本地,這個(gè)優(yōu)勢(shì)帶來(lái)整體性能的較大提升。
DADI在緩存命中場(chǎng)景下的性能優(yōu)勢(shì),可以參考下面的架構(gòu):
DADI SDK:通過(guò)標(biāo)準(zhǔn)讀寫接口訪問(wèn)存儲(chǔ),通過(guò)緩存是否命中,選擇短路讀(short circuit read),還是IPC進(jìn)程通信訪問(wèn)Local DADI Service,或者訪問(wèn)遠(yuǎn)端的DADI Service,對(duì)應(yīng)分布式緩存服務(wù),作為lib庫(kù)嵌入ADB PG的讀寫進(jìn)程;Cache Instance:管理本地緩存,緩存文件抽象成虛擬塊設(shè)備來(lái)訪問(wèn),數(shù)據(jù)在memory和本次磁盤的冷熱以block為單位管理。
這里的核心設(shè)計(jì)在于:
4. 極低的資源使用。內(nèi)存:DADI Service使用的內(nèi)存在100~200M,原因在于基于共享內(nèi)存的IPC實(shí)現(xiàn),hash表等數(shù)據(jù)結(jié)構(gòu),避免多進(jìn)程架構(gòu)下內(nèi)存膨脹, 精簡(jiǎn)的編碼方式,1個(gè)內(nèi)存頁(yè)16k 對(duì)應(yīng) 4byte的管理結(jié)構(gòu);CPU:Local DADI Service在磁盤打滿的時(shí)候單核CPU使用20%左右。CPU的使用在SDK這邊,SDK與Local DADI Service通信很少。
此外為了更好的發(fā)揮DADI在命中內(nèi)存的優(yōu)勢(shì),我們結(jié)合行列混存做了以下優(yōu)化:
ADB PG云原生版本也同樣支持向量化執(zhí)行引擎,核心還是通過(guò)攢批的方式提高數(shù)據(jù)在CPU cache的命中率,通過(guò)codegen減少函數(shù)調(diào)用次數(shù),減少?gòu)?fù)雜計(jì)算指令跳轉(zhuǎn),通過(guò)SIMD指令加速計(jì)算,通過(guò)內(nèi)存池管理,降低算子間的內(nèi)存拷貝,更多信息可以參考【3】。
數(shù)據(jù)的有序主要用在2個(gè)方面,基于有序的IO裁剪,另外一個(gè)是盡量減少計(jì)算過(guò)程中的排序,IO裁剪在行列混存以及有較多的討論,這里主要討論第二點(diǎn),這里我們做的主要工作有:
我們通過(guò)下列方法來(lái)生成sort scan的算子,查詢SQL解析生成AST后,會(huì)根據(jù)一系列啟發(fā)式規(guī)則做變換生成物理執(zhí)行計(jì)劃:
此外就是sort scan算子的實(shí)現(xiàn),存儲(chǔ)層面只能保證文件內(nèi)嚴(yán)格有序,文件的大致有序,我們通過(guò)多路歸并的算法來(lái)實(shí)現(xiàn)。這里的問(wèn)題在于sort scan的多路歸并需要一條條讀取數(shù)據(jù),與向量化的batch scan與文件的批量讀沖突,我們通過(guò)CBO來(lái)選主最優(yōu)的執(zhí)行計(jì)劃。
ADB PG是MPP架構(gòu),能夠充分發(fā)揮節(jié)點(diǎn)間并行計(jì)算能力,云原生版本由于對(duì)數(shù)據(jù)按bucket做了切分,能幫助我們?cè)诠?jié)點(diǎn)內(nèi)實(shí)現(xiàn)更細(xì)粒度的并行,我們以join為例說(shuō)明:
左邊是沒有節(jié)點(diǎn)內(nèi)并行的join的執(zhí)行計(jì)劃,會(huì)起2個(gè)進(jìn)程,一個(gè)做hash join的build,另外一個(gè)做probe,右邊是節(jié)點(diǎn)內(nèi)做了并行,我們會(huì)根據(jù)segment所分配的bucket來(lái)做并行,例如上圖每個(gè)bucket的數(shù)據(jù)都可以并行的去做計(jì)算,由于數(shù)據(jù)是按照bucket做的劃分,join key是分布健的時(shí)候,節(jié)點(diǎn)內(nèi)并行也能完美命中l(wèi)ocal join的優(yōu)化。
計(jì)算資源擴(kuò)容(節(jié)點(diǎn)數(shù))2->44->88->1616->128
用時(shí)<1min<1min<1min<7min
為了測(cè)試性能,我們使用了4*4C規(guī)格的實(shí)例,ADB PG的新版云原生與存儲(chǔ)彈性版本做了性能對(duì)比測(cè)試。
測(cè)試表選用scale factor = 500的TPC-H lineitem表。通過(guò)同時(shí)執(zhí)行不同并發(fā)數(shù)的copy命令,測(cè)得命令執(zhí)行時(shí)間,用總數(shù)據(jù)量除以命令執(zhí)行時(shí)間,得到吞吐量。
|
ADB PG 彈性存儲(chǔ) |
ADB PG新版云原生 |
|||||
|
并發(fā)數(shù) |
1 |
4 |
8 |
1 |
4 |
8 |
|
COPY |
48MB/s |
77MB/s |
99MB/s |
45MB/s |
156MB/s |
141MB/s |
在單并發(fā)下新版本與存儲(chǔ)彈性版本的性能差不多,主要在于資源都沒有滿;
在4并發(fā)下新版本的吞吐是存儲(chǔ)彈性的2倍,原因在于使用lineitem表都定義了sort key,新版本在寫入數(shù)據(jù)無(wú)需寫WAL日志,另外攢批加上流水線并行相比彈性存儲(chǔ)版本先寫入,再merge,merge的時(shí)候也需要寫額外的WAL有一定優(yōu)勢(shì);
在8并發(fā)下新版本與4并發(fā)差不多,主要由于4C 4并發(fā)已經(jīng)把CPU用滿,所以再提升并發(fā)也沒有提升。
為了全面的測(cè)試讀性能,我們針對(duì)3種場(chǎng)景做了測(cè)試:全內(nèi)存:使用的是TPCH sf為10的數(shù)據(jù)集,會(huì)生成10G的測(cè)試數(shù)據(jù)集。全本地磁盤緩存:使用的是TPCH sf為500的數(shù)據(jù)集,會(huì)生成500GB的測(cè)試數(shù)據(jù)集。一半緩存,一半OSS:使用的是TPCH sf為2000的數(shù)據(jù)集,會(huì)生成2000GB的測(cè)試數(shù)據(jù)集。(本地磁盤緩存960GB)測(cè)試結(jié)果如下(縱軸為RT單位ms)
全內(nèi)存
全本地磁盤緩存
一半本地緩存,一半OSS
從上述測(cè)試結(jié)果來(lái)看:
AnalyticDB PostgreSQL新版云原生是充分的將物理資源進(jìn)行了池化,將存儲(chǔ)和計(jì)算能力單元化進(jìn)行分配,實(shí)現(xiàn)靈活的部署。這個(gè)特性為使用者提供極致的性價(jià)比,做到了算力的最優(yōu)分配,同時(shí)降低用戶使用的門檻,讓用戶專注于業(yè)務(wù)而無(wú)需將大量精力放在算力和存儲(chǔ)的規(guī)劃上,實(shí)現(xiàn)體驗(yàn)升級(jí)。
在上述存儲(chǔ)分離的架構(gòu)上,我們后續(xù)主要有3個(gè)大的方向:
在云原生升級(jí)我們主要有2個(gè)重點(diǎn)方向:
云原生版本將于2022年2月正式商業(yè)化發(fā)布,想要更多信息可以訪問(wèn)產(chǎn)品網(wǎng)站https://www.aliyun.com/product/gpdb
【1】 http://click.aliyun.com/m/1000307639/
【2】 https://developer.aliyun.com/article/838806?groupCode=analyticdb4postgresql&share_source=wechat_qr
【3】 https://developer.aliyun.com/article/783182

我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問(wèn)/技術(shù)咨詢/運(yùn)營(yíng)咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流