在剛剛結(jié)束的烏鎮(zhèn)世界互聯(lián)網(wǎng)大會(huì)上,阿里云自主研發(fā)的POLARDB云原生數(shù)據(jù)庫(kù)當(dāng)選世界互聯(lián)網(wǎng)領(lǐng)先科技成果,憑實(shí)力站上C位。這個(gè)”包管“了北京市每天800萬人次的公交出行的下一代分布式數(shù)據(jù)庫(kù)到底有多強(qiáng)大?我們請(qǐng)阿里云智能數(shù)據(jù)庫(kù)事業(yè)部總經(jīng)理鳴嵩跟大家一起聊聊。
POLARDB 是阿里云自主研發(fā)的下一代云原生分布式數(shù)據(jù)庫(kù)。POLARDB 100%兼容MySQL、PostgreSQL等開源數(shù)據(jù)庫(kù),高度兼容Oracle語(yǔ)法,使用RDS服務(wù)的客戶不需要修改應(yīng)用代碼,可以一鍵遷移到POLARDB,體驗(yàn)更大的容量,更高的性能,更低的成本,和更靈活的彈性。目前POLARDB是阿里云增速最快的數(shù)據(jù)庫(kù)產(chǎn)品,廣泛應(yīng)用于互聯(lián)網(wǎng)金融、政府便民工程、新零售、教育、游戲、社交直播等行業(yè)。
作為基于計(jì)算與存儲(chǔ)分離架構(gòu)的新一代云原生數(shù)據(jù)庫(kù),POLARDB的計(jì)算節(jié)點(diǎn)里主要實(shí)現(xiàn)了 SQL 解析和優(yōu)化、以及查詢并行執(zhí)行與無鎖高性能事務(wù)處理,計(jì)算節(jié)點(diǎn)之間通過高吞吐的物理復(fù)制協(xié)議同步內(nèi)存狀態(tài)。而存儲(chǔ)層基于分布式文件系統(tǒng)PolarFS,通過ParallelRaft共識(shí)算法實(shí)現(xiàn)多數(shù)據(jù)副本間的強(qiáng)一致性,在存儲(chǔ)層進(jìn)行存儲(chǔ)引擎的多版本頁(yè)管理來支持全集群跨計(jì)算節(jié)點(diǎn)的Snapshot Isolation隔離級(jí)別。
基于計(jì)算與存儲(chǔ)分離的先進(jìn)架構(gòu)
計(jì)算節(jié)點(diǎn)與存儲(chǔ)節(jié)點(diǎn)之間通過理解數(shù)據(jù)庫(kù)語(yǔ)義的智能互聯(lián)協(xié)議將filter和projection等算子從計(jì)算層下推到存儲(chǔ)層執(zhí)行。為了保證事務(wù)和查詢語(yǔ)句的低延遲,同時(shí)降低計(jì)算節(jié)點(diǎn)之間狀態(tài)同步的延遲,計(jì)算節(jié)點(diǎn)和存儲(chǔ)節(jié)點(diǎn)之間使用25Gb高速RDMA網(wǎng)絡(luò)互聯(lián),采用Bypasskernel的用戶態(tài)網(wǎng)絡(luò)協(xié)議層進(jìn)行通訊?;谟?jì)算與存儲(chǔ)分離的先進(jìn)架構(gòu),POLARDB可以從1個(gè)計(jì)算節(jié)點(diǎn)(2個(gè)CPU核)彈性伸縮到16個(gè)計(jì)算節(jié)點(diǎn)(最高達(dá)到1000核)的事務(wù)擴(kuò)展能力,單實(shí)例存儲(chǔ)容量從10GB按使用量彈性擴(kuò)展到100TB。
計(jì)算節(jié)點(diǎn)與存儲(chǔ)節(jié)點(diǎn)分離的架構(gòu)設(shè)計(jì)給POLARDB帶來了實(shí)時(shí)的水平擴(kuò)展能力。由于單個(gè)數(shù)據(jù)庫(kù)實(shí)例的計(jì)算能力有限,傳統(tǒng)的做法是通過搭建多個(gè)數(shù)據(jù)庫(kù)副本來分擔(dān)壓力,從而提供數(shù)據(jù)庫(kù)Scale out 的擴(kuò)展能力。然而,這種做法需要存儲(chǔ)多份全量數(shù)據(jù),并且頻繁同步日志數(shù)據(jù)造成了過高的網(wǎng)絡(luò)開銷。此外,在傳統(tǒng)數(shù)據(jù)庫(kù)集群上,增加副本需要同步所有增量數(shù)據(jù),這帶來了同步延遲上漲的問題。
POLARDB 將數(shù)據(jù)庫(kù)文件以及Redo log 等日志文件存放在共享存儲(chǔ)設(shè)備上,確保主實(shí)例和所有副本共享同一份全量數(shù)據(jù)和增量日志數(shù)據(jù)。節(jié)點(diǎn)間只需要同步內(nèi)存里的元數(shù)據(jù)信息,通過MVCC機(jī)制的保證,就能支持跨節(jié)點(diǎn)讀取數(shù)據(jù)的一致性,非常巧妙地解決了主實(shí)例和副本之間的數(shù)據(jù)同步問題,大大節(jié)約了跨節(jié)點(diǎn)的網(wǎng)絡(luò)開銷,降低副本間的同步延遲。
提升事務(wù)性能 POLARDB內(nèi)核層面優(yōu)化揭秘
為了提高事務(wù)性能,POLARDB 在內(nèi)核層面進(jìn)行了大量?jī)?yōu)化。把一系列性能瓶頸用無鎖(lockless)算法以及各種并行優(yōu)化算法進(jìn)行改造,減少甚至消除各種鎖之間的相互沖突,大大增加了系統(tǒng)的scalability 能力。同時(shí),我們依托處理雙十一這種大規(guī)模高并發(fā)場(chǎng)景下的經(jīng)驗(yàn), 在 POLARDB 上實(shí)現(xiàn)了對(duì)庫(kù)存等熱點(diǎn)數(shù)據(jù)進(jìn)行優(yōu)化的功能。對(duì)于簡(jiǎn)單重復(fù)的查詢,POLARDB支持直接從存儲(chǔ)引擎獲取結(jié)果,從而減少了優(yōu)化器及執(zhí)行器的開銷。
此外,進(jìn)一步優(yōu)化已經(jīng)高效的物理復(fù)制。比如,我們?cè)谥刈鋈罩炯恿艘恍┰獢?shù)據(jù),以減少日志解析CPU開銷. 這個(gè)簡(jiǎn)單優(yōu)化減少了了60%日志解析時(shí)間。我們也重用 一些數(shù)據(jù)結(jié)構(gòu),以減少內(nèi)存分配器的開銷。 POLARDB運(yùn)動(dòng)了一系列算法來優(yōu)化日志應(yīng)用,比如只有在buffer pool中的數(shù)據(jù)頁(yè)面 才需要日志應(yīng)用。同時(shí)我們也優(yōu)化了了page cleaner and double write buffer,大大減少這些工作的成本. 這一系列優(yōu)化使得在性能上 POLARDB 遠(yuǎn)超 MySQL ,在sysbencholtp_insert等大量并發(fā)寫入的基準(zhǔn)評(píng)測(cè)中達(dá)到最高6倍于MySQL 的性能。
支持并行查詢(Parallel Query)
為了提高子查詢和join等復(fù)雜查詢(例如TPC-H基準(zhǔn)評(píng)測(cè))的能力,POLARDB的查詢處理器支持并行查詢(parallel query),可以將一個(gè)查詢同時(shí)在多個(gè)或所有可用CPU核上進(jìn)行執(zhí)行。并行查詢能夠?qū)⒁粋€(gè)查詢?nèi)蝿?wù)(當(dāng)前只支持SELECT語(yǔ)句)劃分為多個(gè)子任務(wù),多個(gè)子任務(wù)可以并行進(jìn)行處理,整體采用Leader-Worker的并發(fā)模型。Leader線程負(fù)責(zé)生成并行查詢計(jì)劃,協(xié)調(diào)并行執(zhí)行過程的其他組件,并行執(zhí)行計(jì)劃會(huì)包括并行掃描、多表并行連接、并行排序、并行分組、并行聚集等子動(dòng)作。
Message queue是leader線程和worker線程的通訊層,worker線程通過message queue向leader線程發(fā)送數(shù)據(jù),而leader線程也會(huì)通過message queue向worker線程發(fā)送控制信息。Worker線程負(fù)責(zé)真正的執(zhí)行任務(wù)。Leader線程解析查詢語(yǔ)句生成并行計(jì)劃,然后同時(shí)啟動(dòng)多個(gè)worker線程進(jìn)行并行任務(wù)處理,為了高效的執(zhí)行查詢,Worker上的執(zhí)行不需要進(jìn)行再次優(yōu)化,而是直接從Leader上來拷貝生成好的計(jì)劃分片。這需要實(shí)現(xiàn)執(zhí)行計(jì)劃樹上所有節(jié)點(diǎn)的拷貝。worker線程在進(jìn)行掃描,聚集,排序等操作后將中間結(jié)果集返回給leader,leader負(fù)責(zé)收集來自worker的所有數(shù)據(jù)集,然后進(jìn)行適當(dāng)?shù)亩翁幚?比如merge sort,二次group by 等操作),最后將最終結(jié)果返回給客戶端。
Parallel Scan層會(huì)結(jié)合存儲(chǔ)引擎的數(shù)據(jù)結(jié)構(gòu)特征來實(shí)現(xiàn)工作負(fù)載的均衡。如何將掃描數(shù)據(jù)劃分成多個(gè)分區(qū),使得所有的工作線程盡可能的均勻的工作是數(shù)據(jù)分區(qū)劃分的目標(biāo)。在以B+樹作為存儲(chǔ)結(jié)構(gòu)的存儲(chǔ)引擎里,劃分分區(qū)的時(shí)候,是先從根上來劃分,如果根上不能劃分出足夠多的分區(qū)(>= 并行度),將會(huì)繼續(xù)從下一層進(jìn)行劃分。而如果我們需要6個(gè)分區(qū)的話,根節(jié)點(diǎn)最多分出4個(gè)分區(qū),所以就需要繼續(xù)搜索下一層來進(jìn)行分區(qū)。以此類推。在實(shí)際實(shí)現(xiàn)并行查詢的過程中,為了能讓多個(gè)工作線程更加均勻的分配掃描段,會(huì)在B+樹里盡可能的多劃分分區(qū),這樣如果某個(gè)工作線程由于過濾性比較高會(huì)優(yōu)先完成當(dāng)前分區(qū),那么它會(huì)自動(dòng)attach下一個(gè)分區(qū)繼續(xù)執(zhí)行,通過自動(dòng)attach的方式來實(shí)現(xiàn)所有線程的負(fù)載均衡。
新一代基于代價(jià)的優(yōu)化器
云上客戶的業(yè)務(wù)是多樣化的,如果執(zhí)行計(jì)劃選錯(cuò)會(huì)導(dǎo)致慢查詢。為了系統(tǒng)性地解決這些問題,POLARDB推出了新一代的基于代價(jià)的優(yōu)化器。POLARDB里實(shí)現(xiàn)新的直方圖Compressed Histogram對(duì)高頻率數(shù)據(jù)進(jìn)行自動(dòng)探測(cè)并構(gòu)建精確描述,在選擇率計(jì)算時(shí)考慮數(shù)據(jù)頻率和取值空間,解決實(shí)際應(yīng)用中普遍存在的數(shù)據(jù)傾斜場(chǎng)景。
POLARDB大量基于改良的直方圖進(jìn)行代價(jià)估算,比如估算表和表join的結(jié)果大小,是join代價(jià)和join order優(yōu)化的決定性因素,MySQL只能根據(jù)經(jīng)驗(yàn)公式粗略的估算,無論是有索引時(shí)的rows_per_key,還是無索引時(shí)的默認(rèn)參數(shù)值,估算的誤差都較大,這些誤差會(huì)在多表連接的過程中不斷放大,導(dǎo)致生成效率低下的執(zhí)行計(jì)劃。
在POLARDB中使用直方圖對(duì)重合部分進(jìn)行合并計(jì)算,并根據(jù)不同的直方圖類型適配不同的estimation算法,大大提高了估算精度,幫助優(yōu)化器做出更優(yōu)的join order選擇。在隨機(jī)生成的正態(tài)分布數(shù)據(jù)測(cè)試中,多表聯(lián)合查詢優(yōu)化后可提速2.4-12倍,TPC-H測(cè)試中多個(gè)查詢的join order發(fā)生變化,性能提升77%-332%。POLARDB也使用直方圖優(yōu)化了record_in_range的邏輯,MySQL對(duì)于有索引的過濾條件采用index dive來估算區(qū)間的記錄數(shù),這個(gè)操作在OLTP短查詢中CPU占比較高。在使用基于直方圖估算替換index dive后,在淘寶電商核心業(yè)務(wù)中,絕大多數(shù)的查詢查詢響應(yīng)時(shí)間減少一半。
自研分布式文件系統(tǒng)PolarFS:高可靠、高可用、與數(shù)據(jù)庫(kù)協(xié)同設(shè)計(jì)
POLARDB的存儲(chǔ)層采用的是阿里云自主研制的分布式文件系統(tǒng)PolarFS。PolarFS是國(guó)內(nèi)首款面向DB應(yīng)用設(shè)計(jì)的采用了全用戶空間I/O棧的低延遲高性能分布式存儲(chǔ)系統(tǒng)(參見VLDB 2018 上的文章 PolarFS: An Ultra-low Latency and Failure Resilient Distributed FileSystem for Shared Storage Cloud Database),其具備與本地SSD硬盤架構(gòu)相當(dāng)?shù)牡脱舆t高性能I/O能力,同時(shí)也以分布式集群的方式提供了優(yōu)異的存儲(chǔ)容量與存儲(chǔ)性能的擴(kuò)展能力。
而PolarFS作為一款與POLARDB深度協(xié)同的存儲(chǔ)基礎(chǔ)設(shè)施,其最核心的競(jìng)爭(zhēng)力不僅體現(xiàn)在性能和擴(kuò)展性方面,更深層次的則是在面臨有許多挑戰(zhàn)性的POLARDB客戶業(yè)務(wù)需求和規(guī)?;墓性蒲邪l(fā)運(yùn)維過程中而長(zhǎng)期積累形成的一系列高可靠、高可用、與數(shù)據(jù)庫(kù)協(xié)同設(shè)計(jì)的存儲(chǔ)技術(shù)。
為了支持POLARDB在多個(gè)計(jì)算節(jié)點(diǎn)之間分發(fā)查詢且保持全局的Snapshot Isolation語(yǔ)義,PolarFS支持存儲(chǔ)POLARDB存儲(chǔ)引擎B+樹動(dòng)態(tài)生成的多版本(Multi-version page)。為了減少讀寫沖突,現(xiàn)代數(shù)據(jù)庫(kù)一般都通過以MVCC并發(fā)控制為框架來提供RC、SI、SSI等不同的事務(wù)隔離級(jí)別,在MVCC機(jī)制下,B+樹的每個(gè)頁(yè)面會(huì)動(dòng)態(tài)維護(hù)一系列的版本,并發(fā)執(zhí)行中的多個(gè)事務(wù)允許各自訪問一個(gè)頁(yè)面的不同版本。
在POLARDB集群里,由于跨節(jié)點(diǎn)復(fù)制同步延遲的存在,每個(gè)計(jì)算節(jié)點(diǎn)B+樹的頁(yè)面可能是不同版本的,這時(shí)多版本存儲(chǔ)可以為各節(jié)點(diǎn)提供其所對(duì)應(yīng)版本。在POLARDB中,計(jì)算節(jié)點(diǎn)向PolarFS寫入一個(gè)頁(yè)面的同時(shí)要提供該數(shù)據(jù)頁(yè)的版本信息(LSN),PolarFS不僅存儲(chǔ)數(shù)據(jù)頁(yè)的同時(shí)還要存儲(chǔ)數(shù)據(jù)版本元信息;計(jì)算節(jié)點(diǎn)讀取數(shù)據(jù)頁(yè)時(shí),也會(huì)提供版本信息從存儲(chǔ)獲取相應(yīng)的數(shù)據(jù)頁(yè)(歷史)版本。POLARDB數(shù)據(jù)庫(kù)層定期會(huì)將集群所有計(jì)算節(jié)點(diǎn)版本號(hào)的低水位線發(fā)送給PolarFS,PolarFS會(huì)基于此版本號(hào)清理不再使用的歷史版本。
保證數(shù)據(jù)可靠性是POLARDB所有設(shè)計(jì)的底線。在實(shí)際的分布式系統(tǒng)中,硬盤、網(wǎng)絡(luò)與內(nèi)存等硬件、固件或軟件的bug等問題可能會(huì)造成數(shù)據(jù)錯(cuò)誤,從而給數(shù)據(jù)可靠性保障帶來各種挑戰(zhàn)。存儲(chǔ)端的可靠性問題來自靜默錯(cuò)誤(lost write、misdirected write,block corruption等),網(wǎng)絡(luò)和內(nèi)存主要來自于比特反轉(zhuǎn)和軟件bug。為了保證在各種異常情況(包括:硬件故障,軟件故障,人工操作故障)發(fā)生時(shí)的數(shù)據(jù)可靠性,POLARDB和PolarFS 提供了端到端全鏈路數(shù)據(jù)校驗(yàn)保障。
在數(shù)據(jù)寫入時(shí),POLARDB 從計(jì)算節(jié)點(diǎn)的存儲(chǔ)引擎開始,一直到PolarFS存儲(chǔ)節(jié)點(diǎn)的數(shù)據(jù)落盤,經(jīng)過的中間鏈路,都會(huì)對(duì)數(shù)據(jù)的正確性做校驗(yàn),防止異常數(shù)據(jù)寫入。在數(shù)據(jù)讀取時(shí),PolarFS和POLARDB存儲(chǔ)引擎都會(huì)對(duì)讀取到的數(shù)據(jù)做checksum校驗(yàn),準(zhǔn)確地識(shí)別磁盤靜默錯(cuò)誤的發(fā)生,防止靜默錯(cuò)誤擴(kuò)散。在業(yè)務(wù)流量低峰時(shí),還會(huì)在后臺(tái)持續(xù)性的做數(shù)據(jù)一致性掃描,用于檢查單副本數(shù)據(jù)的checksum是否正確以及各個(gè)副本間的數(shù)據(jù)是否一致。數(shù)據(jù)遷移過程中的正確校驗(yàn)性也非常重要:POLARDB在執(zhí)行任何形式的數(shù)據(jù)遷移動(dòng)作時(shí),除了副本自身數(shù)據(jù)的 checksum 校驗(yàn),還會(huì)對(duì)多個(gè)副本數(shù)據(jù)的一致性做校驗(yàn);當(dāng)這兩個(gè)校驗(yàn)都通過,才會(huì)將數(shù)據(jù)遷移到目標(biāo)端;最大限度的防止由于遷移動(dòng)作,導(dǎo)致單副本上的數(shù)據(jù)錯(cuò)誤擴(kuò)散,避免數(shù)據(jù)損壞問題。
PolarFS還支持對(duì)POLARDB做快速的物理快照備份與還原??煺帐且环N流行的基于存儲(chǔ)系統(tǒng)的備份方案。其本質(zhì)是采用Redirect-On-Write 的機(jī)制,通過記錄塊設(shè)備的元數(shù)據(jù)變化,對(duì)于發(fā)生寫操作的存儲(chǔ)卷進(jìn)行寫時(shí)復(fù)制,將寫操作內(nèi)容改動(dòng)到新復(fù)制出的存儲(chǔ)卷上,來實(shí)現(xiàn)恢復(fù)到快照時(shí)間點(diǎn)的數(shù)據(jù)的目的??煺帐且粋€(gè)典型的基于時(shí)間以及寫負(fù)載模型的后置處理機(jī)制。也就是說創(chuàng)建快照時(shí),并沒有備份數(shù)據(jù),而是把備份數(shù)據(jù)的負(fù)載均分到創(chuàng)建 快照之后的實(shí)際數(shù)據(jù)寫發(fā)生的時(shí)間窗口,以此實(shí)現(xiàn)備份、恢復(fù)的快速響應(yīng)。POLARDB通過底層存儲(chǔ)系統(tǒng)的快照機(jī)制以及Redo log增量備份,在按時(shí)間點(diǎn)恢復(fù)用戶數(shù)據(jù)的功能上,比傳統(tǒng)的全量數(shù)據(jù)結(jié)合邏輯日志增量數(shù)據(jù)的恢復(fù)方式更加高效。
高度兼容Oracle語(yǔ)法 成本是商業(yè)數(shù)據(jù)庫(kù)的1/10
除了100%兼容MySQL和PostgreSQL這兩個(gè)最流行的開源數(shù)據(jù)庫(kù)生態(tài), POLARDB還高度兼容Oracle語(yǔ)法,為傳統(tǒng)企業(yè)上云提供成本是商業(yè)數(shù)據(jù)庫(kù)1/10的方案。通過用DMS替換Oracle的GUI管理工具OEM,以及用POLARDBPlus替換命令行工具SQL Plus,沿襲了OracleDBA的使用習(xí)慣;客戶端SDK可以從OCI和O-JDBC Driver替換成libpq和JDBC Driver,只需要做so和jar包的替換,程序主體代碼不需要修改;對(duì)Oracle的SQL普通DML語(yǔ)法都能支持,對(duì)幾乎所有高級(jí)語(yǔ)法如connect by、pivot、listagg等也都全面支持;對(duì)PL/SQL存儲(chǔ)過程、以及存儲(chǔ)過程用到的內(nèi)置函數(shù)庫(kù)也能做到全面覆蓋支持;對(duì)一些高級(jí)功能(如安全管理、AWR等)提供完全相同的格式布局和操作語(yǔ)法,所以綜合看來,POLARDB對(duì)Oracle的操作方法、使用習(xí)慣、生態(tài)工具、SQL語(yǔ)法、格式布局等都做到了全面的兼容和替換,結(jié)合遷移評(píng)估工具ADAM,應(yīng)用可以做到少量改動(dòng)甚至無改動(dòng)。
提前看:更多新技術(shù)和企業(yè)級(jí)特性即將上線
除了上面介紹的技術(shù),POLARDB還有大量新技術(shù)和企業(yè)級(jí)特性在2019下半年陸續(xù)發(fā)布,這些技術(shù)會(huì)全面提升POLARDB的可用性、性能,降低POLARDB的使用成本:
1)從彈性存儲(chǔ)到彈性內(nèi)存,熱緩沖池(warm buffer pool)技術(shù)
POLARDB即將支持和計(jì)算節(jié)點(diǎn)進(jìn)程解構(gòu)的“熱”緩沖池,這將大大減少用戶業(yè)務(wù)在計(jì)算節(jié)點(diǎn)重啟時(shí)受到的影響。在進(jìn)行機(jī)型替換規(guī)格升降級(jí)的時(shí)候(serverless),對(duì)業(yè)務(wù)的影響更小。同時(shí),一個(gè)獨(dú)立的內(nèi)存也使得其動(dòng)態(tài)按需擴(kuò)展或收縮成為可能。
2) 性能數(shù)倍增長(zhǎng),更好的DDL支持(FAST DDL)
POLARDB即將支持并行DDL,這將大大縮短表級(jí)別的DDL延遲。這個(gè)功能把并行化做到極致,可以把建索引等DDL的時(shí)間減少近10倍。同時(shí),POLARDB還進(jìn)行了大量的DDL復(fù)制層面的優(yōu)化,這使得DDL可以進(jìn)行跨區(qū)域的大批量復(fù)制,速度更加迅速,資源的消耗更少。
3) 支持跨地域的全球數(shù)據(jù)庫(kù)(Global Database)
POLARDB 支持跨地域、長(zhǎng)距離的物理復(fù)制,幫助用戶建立其全球數(shù)據(jù)庫(kù)的部署。通過物理復(fù)制,數(shù)據(jù)可以實(shí)時(shí)復(fù)制到全球各個(gè)機(jī)房,使得全球用戶的查詢?cè)诋?dāng)?shù)貦C(jī)房就得到響應(yīng),反應(yīng)更迅速。
4)分區(qū)表的支持
POLARDB支持100T的存儲(chǔ)容量。但是隨著表的大小的增長(zhǎng),單表索引的層次也增加,導(dǎo)致數(shù)據(jù)的查找定位也變得更慢,一些單表上的物理鎖也導(dǎo)致并行DML碰到天花板。所以進(jìn)行合理的分區(qū)變得更加緊迫。之前不少用戶依賴數(shù)據(jù)庫(kù)外部中間件的分庫(kù)分表的來減少單表的壓力。但是,隨著POLARDB在各方面比如并行查詢的發(fā)展,我們可以把這些分庫(kù)分表的功能通過分區(qū)表的形式在數(shù)據(jù)庫(kù)內(nèi)更有效的實(shí)現(xiàn)。有效的分區(qū)不但使我們能夠支持更大的表,而且它減少了一些數(shù)據(jù)庫(kù)索引的全局物理鎖的沖突,從而提高整體DML的性能。同時(shí),這種形態(tài)之后可以更好的支持冷熱數(shù)據(jù)分離,把不同“溫度“的數(shù)據(jù)存放在不同的存儲(chǔ)介質(zhì)中,在保證數(shù)據(jù)access的性能的同時(shí),減少數(shù)據(jù)存放的成本。
POLARDB在增強(qiáng)分區(qū)表的一系列功能,包括全局索引(Global Index),分區(qū)表的外鍵(Foreign Key Constraint),自增分區(qū)表(Interval Partition)等,使得POLARDB更好的應(yīng)對(duì)特大表
5) 行級(jí)壓縮
POLARDB即將推出行級(jí)壓縮功能。業(yè)界通常的做法是在數(shù)據(jù)頁(yè)級(jí)別通過通用壓縮算法(比如LZ77、Snappy)進(jìn)行壓縮,但頁(yè)級(jí)壓縮會(huì)帶來CPU開銷過大的問題,因?yàn)楦膭?dòng)一行數(shù)據(jù),也要把整個(gè)數(shù)據(jù)頁(yè)解壓,改動(dòng),再壓縮。此外有些場(chǎng)景下數(shù)據(jù)頁(yè)壓縮后反而變大(bloat),還會(huì)導(dǎo)致多重索引頁(yè)分裂 (multiple splits)。POLARDB采用細(xì)粒度(fine-grain)行級(jí)壓縮技術(shù),對(duì)不同的數(shù)據(jù)類型采用特定的壓縮方式。數(shù)據(jù)以壓縮的方式同時(shí)存在于外存及內(nèi)存中,只有在要查詢的時(shí)候才進(jìn)行行級(jí)數(shù)據(jù)的解壓,而不用解壓整個(gè)數(shù)據(jù)頁(yè)。由于數(shù)據(jù)除查詢外都是以壓縮方式存儲(chǔ),所以日志也記錄了壓縮的數(shù)據(jù),這個(gè)進(jìn)一步減少了日志的大小,以及在網(wǎng)絡(luò)傳輸?shù)臄?shù)據(jù)/日志的壓力。同時(shí)其相對(duì)應(yīng)的索引也只存儲(chǔ)壓縮的數(shù)據(jù)。整體數(shù)據(jù)量的減少足以抵消解壓所引起的額外開銷,使得這種壓縮在大大減少數(shù)據(jù)存儲(chǔ)的同時(shí)并不會(huì)引起性能衰退。
6)In-Memory的列存(HTAP)
在傳統(tǒng)的數(shù)據(jù)庫(kù)領(lǐng)域,分析數(shù)據(jù)庫(kù)和在線事務(wù)處理是分隔開來的。因此通常需要在一天的經(jīng)營(yíng)結(jié)束后將在線事務(wù)處理的數(shù)據(jù)與往期分析處理的數(shù)據(jù)一起導(dǎo)入至數(shù)據(jù)倉(cāng)庫(kù)后運(yùn)行分析,以生成相應(yīng)的報(bào)表。在HTAP數(shù)據(jù)庫(kù)中,則省去了大規(guī)模數(shù)據(jù)搬移的時(shí)間與運(yùn)營(yíng)成本,一站式解決大部分企業(yè)級(jí)應(yīng)用的需求,并在交易結(jié)束當(dāng)天同步出具T+0的分析報(bào)告。在這種需求下,POLARDB在實(shí)現(xiàn)in-memory的列存數(shù)據(jù)表。通過物理邏輯日志直接和POLARDB行存數(shù)據(jù)同步。這樣通過特定適合分析的算子可以對(duì)這些列存數(shù)據(jù)進(jìn)行實(shí)時(shí)的大數(shù)據(jù)分析。使得用戶可以一站式的得到分析結(jié)果。
7)冷熱分離存儲(chǔ)引擎X-Engine
存儲(chǔ)數(shù)據(jù)的規(guī)模越來越龐大,但不是所有的數(shù)據(jù)訪問頻率都相同,實(shí)際上數(shù)據(jù)訪問總是呈現(xiàn)比較明顯的冷熱分布特征,基于這一特征,X-Engine設(shè)計(jì)了冷熱分層的存儲(chǔ)架構(gòu),根據(jù)數(shù)據(jù)訪問頻度(冷熱)的不同將數(shù)據(jù)劃分為多個(gè)層次,針對(duì)每個(gè)層次數(shù)據(jù)的訪問特點(diǎn),設(shè)計(jì)對(duì)應(yīng)的存儲(chǔ)結(jié)構(gòu),寫入合適的存儲(chǔ)設(shè)備。不同于傳統(tǒng)的B+樹技術(shù),X-Engine使用了LSM-Tree作為分層存儲(chǔ)的架構(gòu)基礎(chǔ),使用多事務(wù)處理隊(duì)列和流水線處理技術(shù),減少線程上下文切換代價(jià),并計(jì)算每個(gè)階段任務(wù)量配比,使整個(gè)流水線充分流轉(zhuǎn),極大提升事務(wù)處理性能。數(shù)據(jù)復(fù)用技術(shù)減少數(shù)據(jù)合并代價(jià),并且因?yàn)閿?shù)據(jù)復(fù)用減少緩存淘汰帶來的性能抖動(dòng)。進(jìn)一步利用FPGA硬件加速compaction過程,使得系統(tǒng)上限進(jìn)一步提升。相對(duì)于其他類似架構(gòu)的存儲(chǔ)引擎比如RocksDB,X-Engine的事務(wù)處理性能有10倍以上提升。X-Engine的詳細(xì)技術(shù)參考SIGMOD 2019的論文X-Engine: An Optimized StorageEngine for Large-scale E-Commerce Transaction Processing。
目前,POLARDB不僅支撐阿里巴巴集團(tuán)淘寶、天貓、菜鳥等業(yè)務(wù)場(chǎng)景,還廣泛應(yīng)用于政務(wù)、零售、金融、電信、制造等領(lǐng)域,目前已經(jīng)有40萬個(gè)數(shù)據(jù)庫(kù)遷上阿里云。基于POLARDB分布式數(shù)據(jù)庫(kù),北京的公交系統(tǒng)快捷、流暢地安排著全市2萬多輛公交車,方便每天800萬人次出行;眾安保險(xiǎn)則使用該數(shù)據(jù)庫(kù)處理保單數(shù)據(jù),效率提升25%。
【責(zé)任編輯:武曉燕 TEL:(010)68476606】