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