作者 | PolarDB數據庫
數據庫與芯片、操作系統并列為全球信息技術三大件,也是企業IT系統必不可少的核心技術,同時也是一切數字處理、計算力和智能化的基石。
上世紀70年代,E.F.Codd 發表了一篇劃時代的論文“A Relational Model of Data for Large Shared Data Banks”。從這篇論文開始,關系型數據庫軟件革命的序幕被拉開了。80 年代初期支持 SQL 的商用關系型數據庫Oracle和 DB2相繼面市,以及 90 年代誕生的 SQL Server,開源的MySQL、PostgreSQL等都是關系型數據庫成功的代表。
時至今日,隨著全球不同類型數據的指數級增長,市場上涌現出越來越多的新型數據庫,然而關系型數據庫仍然占據主導地位。根據市場研究機構IDC的最新統計數據顯示,關系型在全球數據庫中占據約80%的份額。
關系型數據庫經受住時間的考驗,為全世界用戶的鐘愛,最主要的原因之一就是關系型數據庫采用了 SQL 標準,這種高級的非過程化編程接口語言,將計算機科學和易于人類理解認知的數據管理方式完美的銜接在了一起。到今天,這種編程語言還沒有更加完美的替代品。
數十年來,關系型數據庫都應用在以IOE為代表的軟硬件緊耦合的技術架構環境之下,但是今天,關系型數據庫面對著云計算是承載工作流的主要環境的巨大改變。
這種使用環境的變革性遷移之下,客戶對關系型數據庫也提出了新的要求,比如可以支持更大的存儲、彈性擴縮容上更靈活,甚至數據庫可以實現“自動駕駛”。
阿里云的數據庫團隊認識到,如果基于傳統關系型數據庫的架構進行小修小補,很難解決這些客戶提出的問題,必須從根本上演進云上的關系型數據庫架構,做一個全新的云原生關系型數據庫。
PolarDB云原生關系型數據庫也就此誕生。
過去5年,阿里云針對PolarDB進行了諸多創新,通過采用存儲計算分離、軟硬一體化設計,PolarDB實現成本僅為傳統商業數據庫的十分之一。所實現的計算、內存與存儲資源的“三層解耦”架構、多主多寫、基于IMCI(內存列存索引)的HTAP、Serverless等功能已是全球首創或業內領先的技術。
從PolarDB發布以來,它在技術和商業化上都獲得了迅猛發展,如今已經成為阿里云數據庫產品家族中最閃耀的產品。
在本文中,我們將向大家詳細介紹,PolarDB發布5年來所實現的技術創新。
“三層解耦”:資源解耦的極致
從40多年前數據庫誕生開始,數據庫的CPU和內存都是綁定在一起的,最多做到計算和存儲解耦,沒有數據庫能做到CPU和內存的解耦,即使演進到目前的云原生數據庫階段,在PolarDB之前也沒有任何數據庫能夠做到這一點。
然而在云計算時代,每一層的資源解耦都可以使得彈性能力帶來數量級的提升。當前云原生數據庫雖然實現了計算存儲的解耦,相對于傳統數據庫,其彈性能力有了不小的提升,但是CPU和內存的強耦合極大地限制了彈性能力的進一步提升,難以實現秒級跨機遷移;同時也限制了內存的橫向擴展,使得內存受到單機容量限制。
PolarDB歷史性地提出并實現了基于CPU、內存和存儲資源分離的“三層解耦”架構,構建了獨立的CPU資源池、分布式內存資源池、分布式存儲資源池,實現了資源的徹底解耦,CPU和內存分別獨立計費。同時通過分布式內存和數據庫秒級跨機遷移,使得彈性能力有了數量級的提升,大幅降本增效。
多主架構:云原生數據庫不再是單寫數據庫
云原生數據庫從誕生開始,就和一寫多讀綁定在了一起,似乎云原生數據庫天生只能是單寫。寫擴展能力的缺失,給用戶帶來了很大的困擾,很多用戶在寫節點到達甚至接近最大規格一半的時候,就開始擔憂后續業務快速增長會導致數據庫出現瓶頸,因此不得不重新考慮其他數據庫架構方案,而放棄云原生數據庫;亦或是依賴傳統數據庫的橫向擴展方案,例如中間件來實現橫向擴展。雖然業內也有個別廠商開始嘗試多主節點,單受限于節點數,并不能實現真正的橫向寫擴展。
作為應云而生的云原生數據庫,有沒有一個云原生的解決方案來實現寫擴展呢?“PolarDB多主架構”由此而生。這是業內第一個支持大規模多主多寫的云原生數據庫,最大支持32個寫節點。在PolarDB多主架構中,阿里云在整體架構從元數據、事務、鎖、Undo/Redo、IO、代理等所有子系統均做了多主化改造;并采用了PolarFusion技術,實現了多個寫節點的高效數據交互。
PolarDB多主架構從根本上解決了用戶的單主焦慮,使得PolarDB第一次突破了單主限制,實現了橫向寫擴展;數據互通后的主主互備通過消除備節點在RTO不變的情況下節約一半的成本;跨主節點秒級流量切換也為SaaS、游戲等行業解決了多租戶/游戲服的跨節點調度提供了強有力的手段。
Serverless的跨機突破
Serverless是最適合云數據庫的一種交付模式,實現了On-demand Provision,使得用戶不需要再為數據庫規劃容量,在高峰時自動升配提升穩定性,在低峰時自動降配降低成本。因此一時間云數據庫廠商都紛紛推出了自己的Serverless形態。
然而,當前業內的數據庫Serverless形態均為單機Serverless,其容量上限受到了很大的限制(8~32 core),并不能很好的實現其高峰時自動升配以保障穩定性的目標,也限制了企業級客戶的使用,同時讀寫節點自身的升降配對本節點的吞吐同樣存在影響。這些限制的本質是目前云數據庫的無感跨機彈性和強一致跨機擴展能力都尚不成熟,導致當前的Serverless只能實現單節點下有限的Serverless。跨機彈性的限制是節點無法跨機調度,因此單節點彈性上限只能限制到一個遠小于物理機限制的值;而跨機強一致讀擴展的能力缺失,導致其無法通過增刪強一致的只讀節點來實現讀流量的彈性。
為解決單機Serverless的局限性,阿里云在業內第一次突破了這兩個技術難點:基于事務續傳和秒級切換的無感秒切技術,解決跨機彈性問題;性能無損的強一致讀技術,結合熱節點池技術,解決跨機透明讀擴展問題。
基于以上技術突破,PolarDB Serverless的上限規格突破了1000core,帶來了數量級的Serverless能力提升,使得Serverless技術有了支撐企業級業務的能力。
HTAP:同時處理交易和分析性負載
傳統面向OLTP場景設計的關系型數據庫,一般優化目標是提升單核性能/多核擴展性/增強集群能力以提升可用性等,其分析性能往往不佳。然而真實業務的SQL又天然是TP/AP混合的,其需要事務處理和實時數據分析兼具的HTAP系統。面對此問題,傳統方案是使用一套數據同步系統串聯起上游的TP系統和下游的數倉系統,形成一套搭積木的方案,用多套系統的組合來完成任務。
在云數據庫時代這種架構因為串聯了OLTP數據庫,消息中間件,OLAP數據庫三套系統,上下游協議不兼容,運行維護復雜。在云上很難規模部署以滿足各種客戶的需求。
針對這些問題,在PolarDB云原生數據庫領域的技術積累基礎上,阿里云在PolarDB上推出了In-Memory Column Index功能,其為PolarDB帶來列式存儲以及內存計算能力,讓用戶可以在一套PolarDB數據庫上同時運行OLTP和OLAP型混合負載,在保證現有PolarDB優異的OLTP性能的同時,大幅提升PolarDB在大數據量上運行復雜查詢的性能,讓PolarDB 真正成為一款HTAP數據庫。
PolarDB HTAP包含如下幾個關鍵技術創新:
1. PolarDB存儲引擎新增對列式索引(Columnar Index)的支持,用戶可以選擇通過DDL將一張表的全部列或者部分列創建為列索引,同時列索引采用列壓縮存儲,其存儲空間消耗會遠小于行存格式。
2. 在PolarDB的SQL執行器層,阿里云重寫了一套面向列存的執行器引擎框架(Column-oriented), 該執行器框架充分利用列式存儲的優勢,使用向量化執行方法提升算子處理海量數據的效率。同時充分發揮現代CPU的SIMD指令能力,提升CPU單核心處理數據的吞吐,且所有關鍵算子均支持并行執行。在列式存儲上,新的執行器對比MySQL原有的行存執行器性有幾個數量級的性能提升。
3. 支持行列混合執行的優化器框架,該優化器會根據兼容性及執行計劃代價兩方面的因素,以選中最優的執行路徑。
同時阿里云還充分利用了PolarDB云原生數據庫的技術優勢,支持HTAP節點的規格異構及按需彈性(Serverless),為用戶提供一體化HTAP體驗的同時兼具極致的性價比。
并行查詢:突破單節點的資源和性能瓶頸
傳統的基于MySQL的關系型數據庫在部署到云上后,依然采用了主備復制的數據同步模式來提供實例的高可靠和高可用,但基于邏輯復制導致實例延遲增大、多份存儲等問題。PolarDB通過共享存儲和物理復制實現了云上的計存分離和資源池化能力,為用戶提供了最優的彈性能力和性價比。而從線上的長期運維可以發現,云上用戶實例對CPU資源的平均利用率是較低的,同時MySQL對查詢的單線程處理方式又無法滿足業務上基于海量數據的實時分析需求,這造成了極大的資源浪費。
為此阿里云推出了節點內以及跨節點并行查詢(Parallel Query)功能,針對性的利用多核CPU并行計算來提升查詢響應速度。但隨著共享存儲層的數據量進一步增長,單機的擴展能力將遇到瓶頸,包括CPU、Memory和IO等,傳統數據庫通過share nothing的分片架構和MPP計算引擎來突破單機的資源瓶頸,但這破壞了云上計存分離帶來的獨立擴展性和極致彈性能力,有悖于現代云原生數據庫的發展趨勢。
PolarDB解決這個問題的方案是更為先進的計算、內存、存儲"三層解耦"模式,通過將資源進一步拆解,在各個層面上各自獨立擴展。而針對大數據量分析查詢,我們在計算這一層層基于Parallel Query進一步演進,推出了基于共享存儲的分布式彈性并行查詢(Elastic Parallel Query),通過節點間+節點內兩層并行的結合以及基于分布式資源視圖的智能調度策略,打通了集群內的多節點計算資源,與傳統的固化的MPP架構相比,這帶來了多方面的技術和成本優勢:
1. 通過多粒度的并行,更充分的利用集群級的計算資源,突破單節點的資源和性能瓶頸,PolarDB在利用并行查詢提升CPU利用率的同時,也開發了并行DDL等能力,大大縮短了DDL的時間,解決了一些大表用戶的一個重要痛點,實現和傳統MPP系統相同甚至更優的極致查詢性能。
2. 基于分布式的全局資源視圖,并結合數據的親和性特征,對查詢內的子計算任務進行智能調度,在盡可能避免IO的情況下實現各節點計算資源的均衡利用,避免局部熱點帶來的性能和維護問題。
3. 與云上的自動彈性無縫結合,隨著實例計算層的scale up/scale out自適應的調整并行計算策略,既滿足了用戶的成本和性能需求,又無需額外的配置維護動作。
4. 靈活控制實例級別的計算資源拓撲,通過不同接入地址(子集群),實現不同業務的相互隔離和各自獨立配置,滿足具有不同特性的查詢業務需求。
架構演進的示意圖如下:
分布式:實現透明分布式體驗
數據庫經歷過去40多年的發展,隨著互聯網、大數據的飛速發展,單臺務器上的性能極限已經慢慢顯露,在這種情況下,技術人員逐漸開始探索數據庫的擴展能力,目前整體擴展架構又兩種形態:基于共享存儲的share-storage架構、以及基于share-nothing的分布式架構,這兩種架構分別代表了兩個不同的擴展思路,有各自的優缺點。
基于scale-up的單機擴展架構,在面向高并發場景下,容易遇到單機擴展性的天花板,因此在2019年開始,PolarDB基于share-nothing的分布式架構,正式推出了云原生分布式版(PolarDB-X),支持多寫多讀、以及低成本的冷熱分離分層架構。
PolarDB云原生分布式版(PolarDB-X)作為一款基于原生MySQL的云原生分布式數據庫,高度兼容MySQL的協議和開源生態,引入Paxos多數派共識協議,聚焦國產化MySQL替代、分布式線性擴展、以及HTAP混合負載等場景。
PolarDB云原生分布式版(PolarDB-X)包含如下幾個關鍵技術創新:
1.透明分布式體驗,引入自動數據分區與數據自動親和性聚集技術,自動識別數據的業務屬性進行相關性綁定和統一調度,在提升數據庫線性擴展能力的同時,避免因為跨分區的事務和復雜查詢帶來的性能開銷,最大程度將事務涉及范圍局限在單個物理節點,以及最大化下推計算算子減少數據交換。結合全局二級索引、在線數據變更,做到分布式數據庫接近單機數據庫體驗,打破了分布式能力應用現實場景中的關鍵障礙。
2.冷熱分離存儲架構,引入數據分區的Time-to-Live(TTL)策略,隨著時間推進,可以將歷史不常訪問的冷數據進行定期歸檔,PolarDB分布式結合云對象存儲OSS作為冷存儲介質,采用編碼壓縮、以及OSS本身的成本優勢,冷數據僅有MySQL InnoDB在線數據1/20的存儲成本,同時提供單個數據庫實例的透明使用體驗,統一SQL訪問、備份操作等。
3.全面擁抱國產化,基于全內核開源的策略,堅持基于MySQL的敏捷可控路線,目前PolarDB已經順利高分通過分布式數據庫的金融行業標準認證、信通院的分布式數據庫性能和高可用認證等。除了滿足公有云的交付外,PolarDB可以面向傳統金融、政府行業的私有云交付、以及基于開源內核的純軟部署能力,全面支持數據庫的多場景、多形態的交付能力。
PolarDB云原生分布式版(PolarDB-X)的數據庫形態,結合云原生+分布式+國產化的技術,未來也會進一步融合HTAP混合負載能力,引入行列混存架構,更好的滿足數據實時性的要求。
性能演進:提出一系列優化方法
設計之初,PolarDB的理念就是為云上用戶提供具備極致彈性、高性能、海量存儲、安全可靠的數據庫服務。PolarDB采用計算和存儲分離的架構,通過物理復制技術和共享存儲架構,在滿足業務容量彈性擴展需求的同時極大的降低了用戶的存儲成本。在設計上,PolarDB既融合了商業數據庫穩定可靠、高性能、可擴展的特征,又具有開源云數據庫簡單開放、自我迭代的優勢。
依托于阿里云先進可靠的硬件平臺,PolarDB采用RoCE RDMA網絡、3DXpoint存儲介質等先進技術,并面向新硬件架構實現軟硬一體優化。從數據庫內核、文件系統到網絡通訊協議和分布式存儲系統,PolarDB實現了縱貫軟件棧各層次的深度優化。僅僅構建高性能硬件底座并不能完全解決云原生數據庫的性能問題。例如即便擁有高吞吐的RDMA網絡但聚合帶寬難以充分利用;遠端節點I/O訪問、多副本持久化等要求使得云存儲I/O延時遠高于本地存儲;又比如更長的數據鏈路中有更多的排隊,導致I/O間的隔離性變低;共享存儲架構cache concurrence代價等。針對云原生數據庫面臨的性能挑戰,PolarDB的存儲引擎提出了一系列優化方法:
1. 并行化多任務:例如對集中Log buffer按Page Partition分片,實現并行寫入并基于分片進行并行Recovery。
2. 預取和讀取裁剪:例如通過收集并聚合原分散meta至統一的superblock,將多個I/O合一實現fast validating;通過預讀利用聚合讀帶寬、減少讀任務延時等。
3. 鎖優化:針對系統瓶頸,實現無鎖刷臟、基于blink-tree的無鎖SMO等。
4. 訪問打散和優先級調度:例如將單個大I/O并發分散至不同存儲節點分散訪問,充分利用云存儲聚合帶寬;在DB層面對不同I/O進行打標、調度優先級,消除長鏈路、低隔離I/O任務的影響。
5. 通過Bypassing Caches來避免分布式文件系統的cache coherence,并在DB層面優化I/O格式匹配存儲最佳request格式。
上述例子也只是顯露了冰山一角,PolarDB在性能演進之路上也將不斷向前邁進。
展望未來:一切才剛剛開始
上市5年來,PolarDB在架構、功能、性能等方面不斷創新,其實這些創新都是圍繞一個目的,就是不斷釋放云計算資源池化的潛力,最大化云計算資源池化的價值。不僅如此,PolarDB還堅持開源開放的理念,將PolarDB-PG和PolarDB-X進行了全內核開源,推動了整個行業的技術變革。
2021年杭州云棲大會上,阿里云智能數據庫產品事業部與達摩院數據庫與存儲實驗室負責人李飛飛提出,PolarDB要將云原生進行到底。因為他早在2019年就斷言,未來的數據庫一定是云原生數據庫。他說,云原生數據庫在成本、靈活度、安全、技術進化層面都優于傳統數據庫,“傳統數據庫會像馬車一樣被淘汰”。
現代數據庫技術已經有40多年發展歷史,對比之下,新一代云原生數據庫的創新也不過幾年時間。一個全新的云原生數據庫時代已經到來,創新才剛剛開始。