閱讀981 返回首頁    go 阿裏雲 go 技術社區[雲棲]


曆程剖析:阿裏雲自研HTAP數據庫的技術發展之路

摘要:8月24日,阿裏雲數據庫技術峰會到來,本次技術峰會邀請到了阿裏集團和阿裏雲數據庫老司機們,為大家分享了一線數據庫實踐經驗和技術幹貨。阿裏雲高級數據庫技術專家隊皓庭分享了高度兼容MySQL,並且能免去傳統數倉ETL過程實現數據分析,同時支持高並發、大吞吐量的在線事務處理的PB級數據存儲數據庫是如何實現的,幫助大家了解了同時支持海量數據在線事務(OLTP)和在線分析(OLAP)的HTAP關係型數據庫是如何打造出來的。

本文將介紹HybridDB for MySQL的定位和現狀,以及其技術演進路線和尚待解決的問題。
 
一、產品現狀
ecd041e5a2f378b663f65e9ea906e58e2fb04852
HybridDB for MySQL在RDS MySQL的基礎上做了很多拓展和改進,同時也保留了一些傳統關係型數據庫的特性。Hybrid是在2005年提出的HTAP數據庫的概念,指混合的事務和分析處理。傳統的數據庫因為各方麵的限製,偏向於OLTP或OLAP的場景,兩者很難兼得,目前也隻有Oracle勉強地解決了這個問題。但是在更大的數據場景下,因為Oracle產品價格高昂,一般用戶往往難以承擔。而MySQL在國內外擁有很高的知名度和用戶量,從這個生態出發可以讓阿裏雲研發團隊收獲更多的產品改進思路。HybridDB for MySQL從個角度出發,提供一種高性價比、大數據庫的產品,在解決OLTP和OLAP業務的同時,維持好MySQL的生態。

HybridDB for MySQL在SQL兼容性方麵做了很多的擴展,包括支持了TPC-H和TPC-DS這兩個OLAP領域的測試集。由於是阿裏雲的雲數據庫服務,HybridDB for MySQL繼承了RDS的雲服務特征,高可靠、高可用等特性一應俱全並支持在線的擴容。目前HybridDB for MySQL的線上服務規模遍及國內外十多個region,為阿裏雲及外部的用戶提供了可靠服務,總數據量已經達到TB級,日新增數據達百T級。


二、產品定位
b1c83206664022510863e5e68448cbb39be8d183
HybridDB for MySQL的定位是使用一份數據同時支持OLTP和OLAP。它的創新包括實現了share noting的架構,支持線性的信息擴展,以及使用了更新穎的高壓縮比引擎,可以在大數據規模下有很好的表現。從定位上說,HybridDB for MySQL與其他分布式數據庫產品各有分工。與其他阿裏雲數據庫產品有所偏向不同,HybridDB for MySQL在OLTP和OLAP方麵均有不錯的擴展能力。HybridDB for MySQL吸收各家所長,希望提供一個通用的數據庫解決方案來幫助用戶解決大數據場景下基於SQL的業務問題。

三、技術演進路線
d1ef3d3e18632085230da66a4e358b0a1503b272
2013年從單機數據庫加中間件的思路出發,阿裏雲利用分庫分表中間件形成分庫分表數據庫。之後,阿裏雲對存儲和計算方麵進行了大幅度的優化,支持大數據存儲的同時大幅降低成本,改進了SQL兼容性。今年開始做行列混合存儲引擎,期望在更高的分析領域場景提供更好的服務。明年期望把RDS的PolarDB當作存儲引擎,使整套數據能夠運行在共享存儲上,解決棘手的運維問題。

1、發展起點

e2593069adf275ab6198ae4748122b728d18c203
單機數據庫在遇到大數據場景下有很多瓶頸,以MySQL為例,它對SQL的執行隻有一個Session線程,最多隻能利用一個CPU的核。當單表數據量超過千萬時,它的檢索顯得力不從心。這時候主流搜索引擎像innoDB被加數層級會變得比較高,致使單次OLTP的查詢或更新的代價更大,相應時間變高。

單機數據庫幾乎無法解決這種問題,因為它所有的數據(數據結構和磁盤存儲)都落在一台機器上,沒有辦法進行線性擴展。在並發密度高的環境下,不同並發線程間會資源爭搶。從硬件的CPU、內存,再到軟件的鎖、日誌和事務,都是線程密集爭搶的對象。因此並發越高,數據庫的整體存儲下降地愈發明顯。從這個角度出發,阿裏雲思考如何將單機數據庫的性能擴展起來?

2、合久必分

d11b4672b4e37ee2af1f90d6a1e95647f62c58d2

傳統解決方案利用中間件把一個大數據庫的數據切成多個分片,集成到用戶的業務代碼中提高並行能力,中間件把用戶的大查詢拆成多個小查詢,並行的計算並行的合並。這個思路讓用戶的代碼背上了沉重的中間件,不同的用戶想使用這套體係的時候還需要重複地編碼。


從這個角度出發,阿裏雲研發團隊把中間件抽取出來加入到數據庫服務器中,對外呈現同一套的數據庫訪問協議,讓用戶使用SQL連接數據庫進行查詢和更新。在這個過程中,中間件代理用戶完成並行計算。

整個設計思路偏向於MPP數據庫。MPP數據庫將用戶的語句通過查詢解析器、優化器翻譯成一個並行控製的執行計劃。這樣一個執行計劃可以最大程度地利用多級計算資源,將數據分而治之,所有用戶都可以使用MySQL的協議去訪問HybridDB for MySQL而不再關心額外的業務代碼。

在這個設計架構下,阿裏雲研發團隊遇到的問題及解決策略如下:
  • 事務狀態機。研發團隊需要解決的問題是如何維護多級間數據一致性,尤其是要與原先用戶的事務特性保證兼容?研發人員引入兩階段提交來解決分布式事務的問題。用戶的跨區更新可以通過兩階段提交協議來保證強一致性。
  • 流式執行器。數據庫服務器的內存和磁盤空間都是有限的,不能解決超大規模的查詢。例如一個表做一個全局的join in,需要把數據從各個表取出來做本地join in,如果此時再需要按不同維度排序,很可能產生臨時表,而臨時表往往扛不住這種壓力。所以本階段隻考慮可以流式執行的SQL,包括count、sum等聚合函數以及一個維度的order by。
  • 請求級連接池。連接到數據庫的用戶session很可能超過了單機上限。目前采取的措施是支持一個用戶的請求級連接池。數據庫從每一個連接請求中提取出執行計劃,分析它後端引用的分區,不同的會話可以共享後端的分區連接。這樣某些業務的前端並發連接高達數十萬,而後端僅需要幾千個連接。

最終,研發團隊完成了一個連接數、QPS/TPS、容量線性提升,支持動態擴容的一個通用的數據庫服務器。用戶可以使用MySQL協議順利接入而不需要繁瑣的代碼改造。目前線上服務的典型用戶包括RDS的新聞數據,日均TPS達到20000多,前端並發連接日常達到8000多,每秒入庫量在50000行的級別。

3、存儲優化
202c447ed93afd83ddfe81cb406348f271e97f38
當用戶數據量不斷擴大時,數據庫將麵臨巨大的成本問題和運維問題。一個數據分區的存儲容量高達一個多TB時,一個副本損壞後的重建需要花費數天的周期。從這個角度出發,阿裏雲團隊做了如下改進:
  • 性能與成本的平衡。使用SSD盤加SATA盤組成混合存儲:SSD盤做第一級的讀寫CACHE,SATA盤做持久化存儲。這個解決方案是阿裏團隊在FACEBOOK的FLASHCACHE上改造實現的BCACHE,它在不需要上層應用改製的前提下將SSD盤和SATA盤組合成混合存儲。在CACHE命中率比較好的前提下,它的讀寫性能可以媲美FLASH卡,容量可以媲美SATA盤。
  • SQL優化器。該產品的存儲引擎放棄MySQL主流的innoDB而使用ToKuDB。它對壓縮有很好的支持。一些優化的較好的insert語句可以直接寫入它的根Buffer,隨著時間推移異步向葉節點合並。用戶的更新隻要寫入根Buffer就可以立即返回。這樣的設計對成本做了很大優化,使同等資源規格、容量比普通RDS更大的實例的成本變為RDS的1/6。
  • 針對運維問題開發了新的遷移方案,即使用流式的方式解決遷移問題。包括使用數據庫的全量快照去做多級間的流式對反,不再通過外部存儲做中轉。同時,Binlog實時地流式傳輸出去可以避免在全量遷移過程中產生較大的磁盤空間對爆。
最終,研發團隊完成了一個PB級容量的HybridDB for MySQL,它的TB級副本可以在數小時內遷移完畢。根據最新數據顯示,一個1.3TB的副本可以在四小時內遷移完畢。目前線上幾個規模比較大的數據庫數據量在200至500TB左右,壓縮比在3到5倍。一個典型的業務是RDS業務,240TB數據壓縮到40TB,低成本機型下隻消耗了不到32台機器,成本較以前降低了1/10左右。

物聯網中心數據庫和曆史數據業務很適合使用這樣低成本的存儲體係。在物聯網業務中,多點傳感器直接向中心數據庫匯聚數據,其對於並發連接的優化能夠擴大傳感器規模,再加上低廉的存儲成本,使解決物聯網場景變得格外有效;在曆史數據業務中,用戶的日誌和曆史數據可能非常大並且不會被刪除,例如金融、遊戲用戶等數據匯聚到這種數據庫中十分合適。

4、計算優化
5a6557fdb7ad8c0a74668a98a8a8d8325a658d5b
隨著線上業務的繼續擴展,用戶也提出了更多需求:數據庫是否可以在存儲之外附加更多功能讓數據更具價值?為了提供複雜查詢的能力,阿裏雲對架構做了進一步改造,即在OLAP領域做了進一步的改進。

阿裏雲研發團隊為該產品引入了一個全功能計算引擎,該引擎基於開源的大數據框架Flink以及阿裏雲自研的MPP引擎。它將存儲分區視作通用存儲分區,將數據通過一係列算子計算後由SQL接口展示給用戶。在過這個程中研發人員遇到的問題及解決策略如下:
  • SQL兼容性,即SQL語句的支持程度。研發團隊改造了解析器和優化器,使其能夠支持各種SQL語法。團隊選擇開源優化器生成執行計劃,並將所有的執行計劃統一在執行算子上麵。這樣的架構模型類似於SparkSQL,但基於流式的Flink使響應延遲比Spark低更多。這樣的計算引擎讓複雜查詢下的並行計算能力大幅增強並讓計算能夠貼著存儲部署(本地計算可以通過本地引擎過濾)。例如存儲引擎可以過濾映射,將全局的group by、join in交給計算引擎,來保證網絡間的數據交換盡可能的少。研發團隊使用了兩層優化器:基於規則的和基於開銷的。在優化器框架下,研發人員利用存儲分區上的數據規模代價做了很多深度優化。
  • 全局數據一致性,即用戶通過事務更新數據時,如何保證複雜計算下數據的一致。複雜查詢運行在獨立的計算引擎上,它無法看到之前的update數據。為此研發人員在MySQL內核打了patch,暴露出數據的讀視圖,這樣就保證了通用的數據一致性。
  • 資源隔離,即在線AP類業務與TP類業務的資源爭搶問題。數據庫對OLTP業務和OLAP業務共享,但區別不出它們的重要性。研發人員在內核中做了patch根據SQL的query級別做IOPS隔離。這樣,兩類業務可以單獨進行資源隔離控製,服務質量得到了單獨的保障。
這樣,研發團隊收獲了一個支持TPC-H和TPC-DS測試集的數據庫,它的複雜查詢的性能得到了大幅度的優化。目前HybridDB for MySQL解決的業務主要是實時寫入實時查詢實時分析的業務,比如用戶在多點匯聚性能數據,數據既要對外部客戶做實時展現,還需要多維度聚合保證用戶看到期望的視圖展現的業務類型。典型的例子是CDN的一個業務場景,它需要將用戶各region的流量實時統計上來並對用戶做實時報表。數據量每秒入庫數萬行,查詢延遲不能超過毫秒級。

5、細分場景
ecf7ea18e3020171dbf2ad8cf973dc73b108840d
對於OLAP業務而言,行存並不適合,為此研發團隊附加了列存索引。它會把行存數據build成各樣格式,比如位圖索引等。這樣數據庫在OLAP場景下的性能有了大幅度提升,也在OLAP領域提供了更多功能。在這個過程中遇到的問題及解決方案如下:
  • 行列存引擎。列存索引build會有延時,並且不能保證全局事務的強一致性(數據在行存上更新後不能立即在列存索引上可見)。所幸用戶可以接受這種程度的延遲。
  • 查詢優化器。引入新的開銷模型,考慮了存儲引擎的存儲格式。由於不同索引格式適合於不同計算,數據庫在不同索引上有不同的代價模型,融入到之前的優化器框架裏麵。
最終,研發團隊完成了一個在不同業務場景下去做細分的存儲結構,而且可以根據業務做自適應的優化。典型業務有在線業務實時報表,例如在電商的交易類業務中訂單數據存儲後直接做大盤統計和分析。相比於之前的高延遲,數據庫實現了實時的報表展示。

6、持續創新
ebab4183dd614b131174a3b3f442c7c812d460bc
前不久,RDS團隊推出了重磅產品PolarDB。PolarDB基於共享存儲,它的思路來自於亞馬遜的Aurora。

Aurora將存儲和計算做了分離。它的server層隻負責非持久化的內存數據管理,而將持久化部分交給共享存儲。副本間的數據同步拋棄Binlog使用Readlog,使一致性變得更強。數據的data格式直接在共享存儲上存放成用戶預期的innoDB格式,這樣主副本完全負責寫和實時的讀操作,而備庫可以從共享存儲上取得數據但不承擔寫壓力。

RDS團隊將這樣的架構引入雲數據庫產品中,也就有了PolarDB。PolarDB的引入解決了大副本的數據遷移問題。由於共享存儲中的數據已經被獨立切片,用戶不再需要關心1TB大副本的遷移問題而由共享存儲做分片間的數據搬移,這樣使效率得到提升並很容易build成多種數據格式。

PolarDB的引入是明年預期的目標。PolarDB引入後,HybridDB for MySQL在OLTP中的並發事務處理能力會得到很大的提升。使用PolarDB後,PetaData可以從PB跨越到10PB的等級,這樣就可以稱HybridDB for MySQL為實時海量數據庫,因為它的存儲幾乎可以不斷擴展下去。

HybridDB for MySQL從一個中間件的種子逐步成長為目前具有混和事務混合處理能力的複雜架構。用戶的大數據業務甚至是通用的混合業務都可以在PetaData上嚐試,這是因為HybridDB for MySQL支持不斷擴容,用戶可以從小規模數據不斷成長起來。

四、產品限製
9eb4f378ab9f4ec02a6dd93c1e9a2ff2d109c254
HybridDB for MySQL不是萬能的。研發團隊在進行分布式架構的設計時做了很多折中和犧牲。它暫不適合的業務場景包括業務結構簡單且數據量小的業務,例如百萬級的表。百萬級的表從全局取數據的代價比較高,且存儲在單機數據庫中就可以收獲較高效率。同時HybridDB for MySQL也不支持一些高級特性:觸發器、存儲過程、遊標和外鍵。另外,HybridDB for MySQL目前隻支持有限的分區規則:隻支持哈希分區和一個字段作為分區鍵。所幸這個限製並不太影響用戶,因為用戶使用最廣的分區規則仍然是哈希。

五、產品展望

d3fc6fccfeecf086f4886a31613f7f979fbd421f



最後,本文將介紹研發團隊對HybridDB for MySQL一至兩年內的展望。
  • 改進體驗。團隊希望用戶從小規模數據開始使用HybridDB for MySQL,進而逐步成長為大規模數據而不需要經過痛苦的改造,可以像使用MySQL一樣使用HybridDB for MySQL。
  • 降低成本。
  • 增強兼容性和安全性。支持更豐富的UDF和索引格式,為MySQL提供更高的擴展;
  • 支持SSL協議;支持多種字符集。
  • 改進運維。包括引入共享存儲引擎,支持智能調度,數據的動態拆分,合理利用資源將計算和存儲貼合在一起。

最後更新:2017-09-04 12:32:39

  上一篇:go  網絡虛擬化:痛並快樂著
  下一篇:go  阿裏雲的計算設計探索