新聞中心
以“升艙”之名,談?wù)勗圃鷶?shù)據(jù)倉庫AnalyticDB的核心技術(shù)
原創(chuàng)
作者: 阿里開發(fā)者 2022-07-27 09:43:51
云計(jì)算
云原生 本文從升艙背景,數(shù)倉技術(shù)演進(jìn),業(yè)務(wù)需求出發(fā),首先介紹了阿里云云原生數(shù)據(jù)倉庫AnalyticDB的整體架構(gòu),使用場(chǎng)景與生態(tài)集成,產(chǎn)品形態(tài)與硬件平臺(tái)支持,然后逐一介紹了自研向量化執(zhí)行引擎,多態(tài)化存儲(chǔ)引擎,自適應(yīng)優(yōu)化器,多租戶資源隔離和云原生架構(gòu)升級(jí)等升艙中用到的核心技術(shù)。

創(chuàng)新互聯(lián)服務(wù)項(xiàng)目包括白山網(wǎng)站建設(shè)、白山網(wǎng)站制作、白山網(wǎng)頁制作以及白山網(wǎng)絡(luò)營(yíng)銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,白山網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到白山省份的部分城市,未來相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
作者 | 恒義
?背景
說到升艙,我們首先想到的是飛機(jī)經(jīng)濟(jì)艙升級(jí)到商務(wù)艙、頭等艙。阿里云企業(yè)級(jí)云原生數(shù)據(jù)倉庫AnalyticDB(以下簡(jiǎn)稱ADB)[1]在幫助以金融機(jī)構(gòu)為主的行業(yè)數(shù)字化轉(zhuǎn)型和傳統(tǒng)數(shù)倉升級(jí)項(xiàng)目中,也引用了“升艙(倉)”這個(gè)概念。
長(zhǎng)期以來,企業(yè)級(jí)數(shù)據(jù)倉庫構(gòu)建主要以Teradata、Oracle、DB2、Vertica、Greenplum等為主,這些系統(tǒng)一方面功能完備,穩(wěn)定可靠,另一方面成本高,部分有專用硬件限制,同時(shí)需要應(yīng)對(duì)業(yè)務(wù)幾何級(jí)數(shù)據(jù)量規(guī)模增長(zhǎng)。以Hadoop生態(tài)為代表的的大數(shù)據(jù)系統(tǒng)主要解決了數(shù)據(jù)分析的大規(guī)模數(shù)據(jù)量問題,在功能完備性,易用性和維護(hù)性上與這些傳統(tǒng)數(shù)倉相比,還是有差距。所以大部分金融機(jī)構(gòu)都是在保留已有MPP數(shù)倉核心業(yè)務(wù)的基礎(chǔ)上,嘗試部署Hadoop系統(tǒng)用于創(chuàng)新業(yè)務(wù)探索,同時(shí)解決數(shù)據(jù)增長(zhǎng)帶來的成本問題。近年來,一方面國(guó)外涌現(xiàn)出了以AWS Redshift,Snowflake,Google BigQuery,Azure Synapse為代表的云原生數(shù)倉(公共云形態(tài)),有對(duì)傳統(tǒng)數(shù)倉和Hadoop系統(tǒng)線下形態(tài)的替代和革命之勢(shì)。另一方面隨著上述傳統(tǒng)數(shù)倉大廠在國(guó)內(nèi)技術(shù)市場(chǎng)投入的減少,疊加政策等因素,同時(shí)金融、運(yùn)營(yíng)商等行業(yè)面臨數(shù)據(jù)規(guī)模增長(zhǎng),數(shù)字化轉(zhuǎn)型,和傳統(tǒng)數(shù)倉升級(jí)需求,需要選型下一代數(shù)據(jù)管理和分析系統(tǒng),另外由于國(guó)內(nèi)外市場(chǎng)和政策的區(qū)別,我國(guó)金融、運(yùn)營(yíng)商、政務(wù)等行業(yè)的數(shù)倉構(gòu)建,主要以混合云為主。在此背景下,企業(yè)級(jí)云原生數(shù)據(jù)倉庫AnalyticDB提出了升艙計(jì)劃,旨在承擔(dān)和幫助金融、運(yùn)營(yíng)商、政務(wù)等行業(yè)構(gòu)建下一代數(shù)據(jù)管理和分析系統(tǒng),以應(yīng)對(duì)不斷增長(zhǎng)的數(shù)據(jù)規(guī)模,業(yè)務(wù)數(shù)字化轉(zhuǎn)型,和傳統(tǒng)數(shù)倉替換升級(jí)需求。7月19日,“千倉萬庫,輕云直上——阿里云數(shù)據(jù)庫升艙計(jì)劃實(shí)戰(zhàn)峰會(huì)”即將在線上召開。
產(chǎn)品介紹
整體架構(gòu)
AnalyticDB PostgreSQL版(簡(jiǎn)稱ADB)在開源Greenplum[2]和PostgreSQL[3]基礎(chǔ)上進(jìn)行自主研發(fā),語法層面對(duì)兩者保持兼容,功能層面為開源Greenplum超集,同時(shí)兼容大部分Oracle、Teradata語法與功能,支持業(yè)務(wù)應(yīng)用以盡可能少的改造工作量對(duì)已有數(shù)倉業(yè)務(wù)進(jìn)行遷移升級(jí)。其整體架構(gòu)如下圖:
?圖1 整體架構(gòu)
ADB由協(xié)調(diào)節(jié)點(diǎn)和計(jì)算節(jié)點(diǎn)兩大組件構(gòu)成,協(xié)調(diào)節(jié)點(diǎn)負(fù)責(zé)全局事務(wù)管理,全局元數(shù)據(jù)存儲(chǔ),SQL解析,重寫,優(yōu)化,執(zhí)行計(jì)劃生成與調(diào)度,計(jì)算節(jié)點(diǎn)主要包含執(zhí)行引擎和存儲(chǔ)引擎,其中執(zhí)行引擎既支持Greenplum/PostgreSQL功能強(qiáng)大的原生引擎,又支持?jǐn)?shù)據(jù)分析場(chǎng)景性能優(yōu)化的自研向量化引擎,多態(tài)化存儲(chǔ)引擎則支持本地行存堆表、列存壓縮表,和外部表,以及基于存儲(chǔ)計(jì)算分離架構(gòu)下的云原生表。協(xié)調(diào)節(jié)點(diǎn)和計(jì)算節(jié)點(diǎn)通過雙副本保障高可用,同時(shí)通過水平和垂直擴(kuò)展提供計(jì)算和存儲(chǔ)資源的線性擴(kuò)容。
ADB與阿里云生態(tài)系統(tǒng)高度集成,支持以O(shè)SS為備份存儲(chǔ)介質(zhì)的分布式一致性備份恢復(fù)(包括全量和增量備份),同時(shí)支持通過DBS備份到NAS,HDFS等第三方存儲(chǔ)介質(zhì)。對(duì)于存儲(chǔ)在OSS上的ORC,Parquet,JSON,CSV格式用戶數(shù)據(jù),和MaxCompute上的用戶表和分區(qū),支持并行高速并行導(dǎo)入加載到本地,或者通過列過濾、謂詞下推直接對(duì)OSS上的數(shù)據(jù)進(jìn)行數(shù)據(jù)湖分析。在云原生架構(gòu)形態(tài)下,云原生表則在計(jì)算節(jié)點(diǎn)本地則只有緩存數(shù)據(jù)(計(jì)算節(jié)點(diǎn)無狀態(tài)化),全量數(shù)據(jù)存儲(chǔ)在低成本的OSS上。
使用場(chǎng)景與生態(tài)集成
上面描述了ADB的整體架構(gòu)和內(nèi)部組件,傳統(tǒng)數(shù)倉遷移替換,或者構(gòu)建下一代數(shù)據(jù)管理分析系統(tǒng),除了要具備高可用易擴(kuò)展的分布式系統(tǒng)架構(gòu)和功能完備性能出眾的內(nèi)核引擎外,還需要有開放的生態(tài)集成和管理工具配套。下圖從數(shù)據(jù)同步,到數(shù)據(jù)加工,再到數(shù)據(jù)查詢分析,端到端描述了ADB在數(shù)據(jù)處理各個(gè)階段的生態(tài)集成,配套工具和場(chǎng)景支持能力。
圖2 使用場(chǎng)景與生態(tài)集成
1、數(shù)據(jù)同步階段,數(shù)據(jù)通過實(shí)時(shí)寫入或批量加載方式入庫,形成ODS(Operational Data Model)層。典型的數(shù)據(jù)源包括:MySQL/SQL Server/PostgreSQL/Oracle等OLTP業(yè)務(wù)數(shù)據(jù)庫,業(yè)務(wù)App產(chǎn)生的實(shí)時(shí)數(shù)據(jù),在OSS/MaxCompute/Hadoop上的歸檔或原始數(shù)據(jù),以及來自Kafka/Flink等的流式數(shù)據(jù)。ADB通過MVCC,兩階段提交(2PC),和全局事務(wù)管理(GTM)機(jī)制提供分布式事務(wù)能力(默認(rèn)隔離級(jí)別Read Committed),同時(shí)在實(shí)時(shí)寫入場(chǎng)景支持Upsert覆蓋寫(Insert on Conflict,功能等同于Oracle的Merge Into),批量導(dǎo)入場(chǎng)景支持外表,文件,自定義程序輸出等多種并行高速加載。
2、數(shù)據(jù)加工階段,在庫中對(duì)ODS層數(shù)據(jù)進(jìn)行加工,形成CDM(Common Data Model)和ADS(Application Data Service)層,典型操作包括INSERT INTO SELECT, CREATE TABLE AS等。3、數(shù)據(jù)查詢分析階段,按業(yè)務(wù)需求對(duì)庫中數(shù)據(jù)進(jìn)行查詢分析,或供下游系統(tǒng)消費(fèi)處理,典型的查詢分析場(chǎng)景包括交互式分析,BI報(bào)表,數(shù)據(jù)類業(yè)務(wù)應(yīng)用等。ADB既通過存儲(chǔ)引擎索引排序等特性支持高并發(fā)低延時(shí)的多維度點(diǎn)查范圍查場(chǎng)景,也通過向量化執(zhí)行引擎,CBO自適應(yīng)優(yōu)化器,列式存儲(chǔ)支持大數(shù)據(jù)量多表關(guān)聯(lián)聚合的復(fù)雜分析場(chǎng)景。
產(chǎn)品形態(tài)與硬件平臺(tái)
ADB除了在公共云提供國(guó)內(nèi)和國(guó)際站的SaaS服務(wù)外,也通過阿里云飛天企業(yè)版(ApsaraStack)和敏捷版(DBStack)支持混合云輸出,滿足線下部署需求。與部分傳統(tǒng)數(shù)倉需要專有硬件平臺(tái)不同,ADB本身支持x86通用硬件部署,同時(shí)也支持Arm架構(gòu),以及國(guó)產(chǎn)化鯤鵬平臺(tái),海光處理器,麒麟系統(tǒng)等。通用硬件和國(guó)產(chǎn)化平臺(tái)的支持,也是金融等領(lǐng)域數(shù)倉升級(jí)的重要參考因素。
核心技術(shù)
通過上面概括性的產(chǎn)品介紹,我們對(duì)ADB的整體架構(gòu),使用場(chǎng)景與生態(tài)工具,產(chǎn)品形態(tài)與硬件平臺(tái)支持有了基本了解。下面進(jìn)一步深入到其在“升艙”項(xiàng)目中的部分硬核技術(shù),包括自研向量化執(zhí)行引擎,多態(tài)化存儲(chǔ)引擎,基于代價(jià)的自適應(yīng)優(yōu)化器,租戶間不同實(shí)例和租戶內(nèi)不同負(fù)載的資源隔離,以及存儲(chǔ)計(jì)算分離形態(tài)的云原生架構(gòu)。
向量化執(zhí)行引擎
PostgreSQL在上世紀(jì)八十年代誕生時(shí)數(shù)倉分析OLAP場(chǎng)景尚未出現(xiàn),其主要用于處理OLTP場(chǎng)景,執(zhí)行引擎是Record-Oriented(Tuple-at-a-time)的火山模型,Greenplum在PostgreSQL基礎(chǔ)上構(gòu)建了MPP分布式數(shù)據(jù)庫,在執(zhí)行引擎層引入了Motion節(jié)點(diǎn),使得集群中每個(gè)計(jì)算節(jié)點(diǎn)都能像單機(jī)PostgreSQL一樣運(yùn)行,共同完成由協(xié)調(diào)節(jié)點(diǎn)下發(fā)的SQL分布式執(zhí)行計(jì)劃,最終通過協(xié)調(diào)節(jié)點(diǎn)匯總返回查詢結(jié)果,通過分布式并行執(zhí)行大大提升了單機(jī)PostgreSQL的性能瓶頸。但在每個(gè)計(jì)算節(jié)點(diǎn)執(zhí)行引擎內(nèi)部,依然是PostgreSQL原生的Record-Oriented模型(即每個(gè)算子每次處理一條記錄),該執(zhí)行模型對(duì)與以點(diǎn)查或少數(shù)據(jù)量處理場(chǎng)景為主的TP場(chǎng)景沒有問題,但對(duì)于以大數(shù)據(jù)量處理場(chǎng)景為主的OLAP場(chǎng)景,單條記錄處理的開銷較大,綜合性能和效率較低。后期基于Postgres構(gòu)建的數(shù)據(jù)分析系統(tǒng),如Redshift,Vertica,Vectorwise(準(zhǔn)確來說是基于Postgres的前身Ingres),都對(duì)PG原有執(zhí)行引擎進(jìn)行了替換改造,Redshift主要是基于Code Generation(JIT, Just-in-Time Compilation)和Vectorized Scan,Vectorwise則是純粹的向量化執(zhí)行。PostgreSQL 11也支持了表達(dá)式的JIT[4],用以加速SQL中的表達(dá)式處理。
ADB在保留原生Greenplum/PostgreSQL引擎的同時(shí),自研了Block-Oriented(Batch-at-a-time)向量化執(zhí)行引擎,用于處理大數(shù)據(jù)量分析場(chǎng)景。下圖以兩邊關(guān)聯(lián)后做聚合的簡(jiǎn)單SQL為例,做了兩者對(duì)比。
圖3 執(zhí)行模型:Record-Oriented V.S. Block-Orientend對(duì)比Record-Oriented通過getNext()接口每次獲取和處理一條記錄,Block-Orientend模式通過getNextBlock()接口每次獲取一批記錄,同時(shí)每個(gè)執(zhí)行算子綜合運(yùn)用向量化(Vectorization)[5]和即時(shí)編譯(JIT)[6]技術(shù),對(duì)這一批記錄執(zhí)行相同處理邏輯,從以下收益出發(fā),獲得更高效的資源使用,更快的執(zhí)行性能:
- 每次讀取和使用相同邏輯處理一批記錄數(shù)據(jù),能獲得更高的CPU指令和數(shù)據(jù)緩存命中率[7]。
- 從一次函數(shù)調(diào)用處理一條記錄,到一次函數(shù)調(diào)用處理一批數(shù)據(jù),同時(shí)JIT則直接避免了函數(shù)調(diào)用,總體函數(shù)調(diào)用次數(shù)和開銷[8]減少。
- 內(nèi)存的分配回收,也從每條記錄的分配回收,到每批記錄的分配和回收,整體減少內(nèi)存分配回收次數(shù)和碎片管理開銷[9]。
- 在按批處理模型下,代碼實(shí)現(xiàn)能更好地以向量化方式實(shí)現(xiàn),一方面有利于CPU進(jìn)行數(shù)據(jù)預(yù)取,另一方面盡可能減少程序的條件跳轉(zhuǎn)(來自if...else...,switch等分支判斷)和無條件跳轉(zhuǎn)(來自函數(shù)調(diào)用),讓CPU獲得更好的指令流水線執(zhí)行[10],減少分支預(yù)測(cè)[11]失敗,同時(shí)也有利于編譯器生成SIMD[12]指令,提高執(zhí)行效率。
下圖分別展示了ADB Vectorization在分組聚合SQL場(chǎng)景進(jìn)行算Hash,桶尋址,求Sum步驟的列式向量化執(zhí)行示例,和JIT在掃描過濾SQL場(chǎng)景進(jìn)行表達(dá)式計(jì)算的示例。
圖4 Vectorization與JIT實(shí)現(xiàn)示例
向量化按批讀取和處理的行為,在本批次中讓需要處理的數(shù)據(jù)和處理指令都駐留在CPU L1/L2 Cache中,在緩存命中情況下性能為從內(nèi)存讀取的10~30倍[13],同時(shí)對(duì)該批次數(shù)據(jù)進(jìn)行相同指令的處理,也能讓CPU更好的流水線執(zhí)行,減少CPU Hazards[14]。JIT代碼生成針對(duì)表達(dá)式處理場(chǎng)景,則直接避免了解釋執(zhí)行模式下的函數(shù)高頻函數(shù)調(diào)用(Function Calls)。
多態(tài)化存儲(chǔ)引擎
PostgreSQL原生存儲(chǔ)引擎為堆表(Heap Table)[15],主要為OLTP場(chǎng)景,核心組件包含默認(rèn)8KB為單位行級(jí)MVCC的數(shù)據(jù)頁P(yáng)age,緩存管理器Buffer Manager,和預(yù)寫日志W(wǎng)AL,以及以Btree為主的索引。Greenplum基于PostgreSQL構(gòu)建了分布式數(shù)據(jù)庫,主要為OLAP場(chǎng)景,在存儲(chǔ)層主要做了如下技術(shù)改造:
1.協(xié)調(diào)節(jié)點(diǎn)新增全局元數(shù)據(jù)和全局事務(wù)狀態(tài)管理,以支持分布式架構(gòu)下在協(xié)調(diào)節(jié)點(diǎn)的事務(wù)管理,SQL解析和執(zhí)行計(jì)劃生成等需要讀取元數(shù)據(jù)系統(tǒng)表的操作。
2.新增分布式架構(gòu)下表的水平分布機(jī)制(支持哈希,隨機(jī)和復(fù)制分布策略,對(duì)業(yè)務(wù)層透明),以及節(jié)點(diǎn)內(nèi)部垂直分區(qū)機(jī)制(支持范圍和列表分區(qū),后續(xù)高版本PostgreSQL自身也增加了分區(qū)機(jī)制)。兩者結(jié)合支持更大的數(shù)據(jù)規(guī)模和查詢過濾效率。
3.對(duì)行存堆表由默認(rèn)頁大小由8KB設(shè)置為32KB,以獲得數(shù)據(jù)分析場(chǎng)景更好的掃描效率。
4.新增列存壓縮表,相比PostgreSQL原生的行存堆表,通過列裁剪和壓縮,進(jìn)一步提升分析場(chǎng)景的掃描效率。另外列存表的元組(Tuple) ID保持與堆表一致為48位,可以直接適配PostgreSQL現(xiàn)有索引機(jī)制(包括Btree,Brin,GIN,GiST等)進(jìn)行指定列值的索引掃描,加速點(diǎn)查場(chǎng)景。另外利用支持MVCC事務(wù)隔離機(jī)制的行存堆表作為列存的元數(shù)據(jù)輔助表,一來用于列存數(shù)據(jù)的尋址,二來引入Delete Bitmap通過標(biāo)記刪除的方式讓列存在追加寫的基礎(chǔ)上支持了更新和刪除,同時(shí)列存數(shù)據(jù)也間接有了MVCC和事務(wù)隔離能力。
5.引入了PXF外表,用于訪問HDFS,Hive,MySQL,PostgreSQL等外部系統(tǒng)。
ADB在Greenplum基礎(chǔ)上,對(duì)本地列存壓縮表和行存堆表進(jìn)行了進(jìn)一步增強(qiáng)(包括列存排序合并,排序加速計(jì)算,MIN&MAX粗糙過濾,實(shí)時(shí)物化視圖,自動(dòng)Analyze/Vacuum/Merge,Upsert等),對(duì)外表則新增了對(duì)阿里云OSS和MaxCompute的并行導(dǎo)入及數(shù)據(jù)湖分析能力,同時(shí)新增了云原生存儲(chǔ)計(jì)算分離表(云原生架構(gòu)產(chǎn)品形態(tài)下支持),存儲(chǔ)按需計(jì)費(fèi),靈活彈性擴(kuò)縮,支持?jǐn)?shù)據(jù)共享。下圖為ADB多態(tài)化存儲(chǔ)引擎概覽。
圖5 多態(tài)化存儲(chǔ)引擎
下面就ADB在存儲(chǔ)引擎層的部分自研能力做進(jìn)一步技術(shù)探討。
稀疏索引
Min&Max Skip Index是ADB在Greenplum列存上新增的第一個(gè)自研特性,類似于PostgreSQL9.5開始支持的BRIN,簡(jiǎn)單來說為列存表相應(yīng)列數(shù)據(jù)的每個(gè)存儲(chǔ)塊(如varblock)記錄該存儲(chǔ)塊中所有數(shù)據(jù)的最小值(MIN)和最大值(MAX),掃描時(shí)將過濾條件與每個(gè)存儲(chǔ)塊的MIN和MAX比較,過濾掉一定不包含該過濾條件存儲(chǔ)塊。對(duì)于可能包含該過濾條件的存儲(chǔ)塊,則進(jìn)行具體數(shù)據(jù)讀取,解壓,掃描,比較,獲得具體的匹配記錄。目前主流列存均提供該項(xiàng)能力(如Redshift的Zone Maps[16],ClickHouse的Skip Indexes[17]),這里不做過多展開。ADB除了記錄了每個(gè)存儲(chǔ)塊的MIN&MAX,也記錄了多個(gè)連續(xù)存儲(chǔ)塊總體的MIN&MAX,起到進(jìn)一步快速過濾的效果。
排序合并
排序是列存引擎的關(guān)鍵能力,主流列存在建表時(shí)都支持定義排序鍵(如Redshift的Compound Sort Key[18]和Interleaved Sort Key[19],Snowflake的Clustering Key[20], ClickHouse的Order By[21]),支持手工或者后臺(tái)自動(dòng)合并排序,以獲得高效的掃描過濾。同時(shí)上面講的MIN&MAX Skip Index必須要依靠排序才能真正發(fā)揮作用(除非數(shù)據(jù)在寫入時(shí)就天然有序),試想數(shù)據(jù)無序情況下每個(gè)存儲(chǔ)塊的最大值最小值范圍可能都包含過濾條件,比較下來能Skip掉的數(shù)據(jù)塊很少,也就相當(dāng)于MIN&MAX Skip Index沒有作用。
ADB在列存排序能力上支持組合排序(對(duì)應(yīng)上述Redshift的Compound Sort)和多維排序(對(duì)應(yīng)上述Redshift的Interleaved Sort,目前Databricks的Delta Lake[22]也有該能力),兩者的區(qū)別和使用場(chǎng)景可以參考Redshift的這篇Blog[23],這里不做詳細(xì)展開。通常新寫進(jìn)來的數(shù)據(jù)為無序狀態(tài),ADB針對(duì)組合排序支持后臺(tái)自動(dòng)排序合并(多維排序可在ETL步驟中執(zhí)行multisort


咨詢
建站咨詢
