POLARDB是阿里雲資料庫團隊研發的基於第三代雲計算架構下的商用關係型雲資料庫產品,實現100%向下兼容MySQL 5.6的同時,支持單庫容量擴展至上百TB以及計算引擎能力及存儲能力的秒級擴展能力,對比MySQL有6倍性能提升及相對於商業資料庫實現大幅度降低成本。
第三代分布式共享存儲架構究竟有什麼優勢?
▲POLARDB的第三代分布式共享存儲架構
首先,受益於第三代分布式共享存儲架構,使POLARDB實現了計算節點(主要做SQL解析以及存儲引擎計算的伺服器)與存儲節點(主要做數據塊存儲,資料庫快照的伺服器)的分離,提供了即時生效的可擴展能力和運維能力。
眾所周知,在傳統資料庫上做擴容、備份和遷移等操作,花費的時間和資料庫的容量成正比,往往上TB的資料庫容量加個只讀副本就需要一到兩天時間。POLARDB的存儲容量可以實現無縫擴展,不管數據量有多大,2分鐘內即可實現只讀副本擴容,1分鐘內即可實現全量備份,為企業的快速業務發展提供了彈性擴展能力。
其次,與傳統雲資料庫一個實例一份數據拷貝不同,POLARDB同一個實例的所有節點(包括讀寫節點和只讀節點)都實現訪問存儲節點上的同一份數據,使得POLARDB的數據備份耗時實現秒級響應。(備份時間與底層數據量無關)
最後,藉助優秀的RDMA網絡以及最新的塊存儲技術,實現伺服器宕機後無需搬運數據重啟進程即可服務,滿足了網際網路環境下企業對資料庫伺服器高可用的需求。
為什麼POLARDB能做到6倍於MySQL的性能?
這裡我們將分別以存儲性能、計算性能來進行解讀詮釋。
▲阿里雲POLARDB性能全景
POLARDB的存儲引擎性能優化
持續釋放硬體紅利
眾所周知,關係型資料庫是IO密集型的應用,IO性能的提高對資料庫的性能提升至關重要。過去十年我們看到在資料庫領域,SSD替換HDD的過程給資料庫數據處理的吞吐能力帶來了數量級的提升。
POLARDB採用了領先的硬體技術:包括使用3DXpoint存儲介質的Optane存儲卡、NVMe SSD和RoCE RDMA網絡。同時面向新硬體架構實現軟硬一體優化:從資料庫、文件系統到網絡通訊協議、分布式存儲系統和設備驅動,POLARDB實現縱貫軟體棧各層次的整個IO鏈條的深度優化。
為了將3DXpoint顆粒的高性能和3D NAND顆粒的低成本結合起來,POLARDB創新的在軟體層實現對高速的Optane卡和大容量高吞吐的NVMe SSD進行組合,實現一個名為混合存儲層。既保證數據寫入的低延遲、高吞吐、高QoS,又使整體方案兼具較高的性價比。
旁路內核,榨乾硬體能力
在POLARDB裡,為了追求更高的性能、更低的延遲,阿里雲資料庫團隊大膽的拋棄了Linux內核提供的各種機制,比如塊設備、各種文件系統例如ext4,以及TCP/IP協議棧和socket編程接口而選擇了另起爐灶。最終,POLARDB實現了一整套在用戶態運行的IO和網絡協議棧。
POLARDB用戶態協議棧解決了內核IO協議棧慢的問題。用戶程序在用戶態直接通過DMA操作硬體設備,通過輪詢的方式監聽硬體設備完成IO事件,消除了上下文切換和中斷的開銷。用戶程序還可以將IO處理線程和cpu進行一一映射,每個IO處理線程獨佔CPU,相互之間處理不同的IO請求,綁定不同的IO設備硬體隊列,一個IO請求生命周期從頭到尾都在一個線程一顆CPU上處理,不需要鎖進行互斥。這種技術實現最大化的和高速設備進行性能交互,實現一顆CPU達每秒約20萬次IO處理的能力,並且保持線性的擴展能力,也就意味著4顆CPU可以達到每秒80萬次IO處理的能力,在性能和經濟型上遠高於內核。
網絡也是類似的情況。過去傳統的乙太網,網卡發一個報文到另一臺機器,中間通過一跳交換機,大概需要一百到兩百微秒。POLARDB支持ROCE乙太網,應用程式通過RDMA網絡,直接將本機的內存寫入另一臺機器的內存地址,或者從另一臺機器的內存讀一塊數據到本機,中間的通訊協議編解碼、重傳機制都由RDMA網卡來完成,不需要CPU參與,使性能獲得極大提升,傳輸一個4k大小報文只需要6、7微秒的時間。如同內核的IO協議棧跟不上高速存儲設備能力,再一次的,內核的TCP/IP協議棧跟不上高速網絡設備能力,被POLARDB的用戶態網絡協議棧代替。
硬體DMA和物理複製實現的資料庫多副本
大家都知道關係型資料庫的重要特性歸納起來是「ACID」,其中A是原子性,C是約束,I是隔離性,D是持久性。
POLARDB將從兩個維度出發,從根本上改進多副本複製。一個是保證資料庫ACID中的D(Durable),把網絡、存儲硬體提供的DMA能力串起,用硬體通道高性能的把主庫的日誌數據持久化到三個存儲節點的磁碟中;另一個是實現了高效的只讀節點,在主庫和只讀節點之間通過物理複製同步數據,直接更新到只讀節點的內存裡。 如何實現?
POLARDB實現日誌數據持久化到三個存儲節點的磁碟中。主庫通過RDMA將日誌數據發送到存儲節點的內存中,存儲節點之間再通過RDMA互相複製,每個存儲節點用SPDK將數據寫入NVMe接口的存儲介質裡,整個過程CPU不用訪問被同步的數據塊(Payload),實現數據零拷貝。
同時由RDMA網卡和NVMe控制器完成數據傳輸和持久化,CPU僅做狀態機的維護,在一致性協議的協調下,把網卡和存儲卡兩塊硬體串起來,存儲節點之間數據同步採用並發Raft(Parallel Raft)協議,和Raft協議一樣,決議在leader節點上是串行生成和提交的,但並發Raft協議可以允許主從之間亂序同步,簡單的說,允許follower節點在漏掉若干條日誌的情況先commit並apply後面過來的日誌,並異步的去補之前漏掉的日誌,數據同步的性能和穩定性都顯著優於Raft協議。
POLARDB在主庫和只讀實例之間的數據流上,放棄了基於binlog的邏輯複製,而是基於innodb的redolog實現了物理複製,從邏輯複製到物理複製對主庫和從庫性能帶來的提升都非常明顯。
在主庫上,原本引擎需要和binlog做XA事務,事務要等到binlog和redolog同時寫盤後才能返回,去掉binlog後,XA事務可以去掉,事務的執行路徑更短,IO開銷也更小。在從庫上,redolog由於是物理複製,僅需比對頁面的LSN就可以決定是否回放,天然可以多線程執行,數據的正確性也更有保證,此外,POLARDB的從庫收到redolog後只需要更新緩存裡的頁面,並不需要寫盤和IO操作,開銷遠低於傳統多副本複製裡的從庫。
針對資料庫加速的Smart Storage
POLARDB的存儲節點針對資料庫的IO workload進行了一些針對性的優化。
IO優先級優化:POLARDB在文件系統和存儲節點兩層都開了綠色通道,對redolog文件的更新進行優待處理,減少排隊,提高IO的優先級。redolog也從512對齊調整為4k對齊,對SSD性能更加友好。
double write優化:POLARDB存儲節點原生支持1MB的原子寫,因此可以安全關閉double write,從而節省了近一倍的IO開銷。
group commit優化:POLARDB裡一次group commit可以產生寫入幾百KB的單個大IO。對於單個SSD,延遲和IO的大小是呈線性的,而POLARDB從文件系統到存儲節點都進行一系列優化來保證這種類型的IO能儘快刷下去,針對redolog文件進行條帶化,將一個上百KB的大IO切割為一批16KB的較小IO,分發到多個存儲節點和不同的磁碟上去執行,進一步的降低關鍵IO路徑的延遲。
POLARDB的計算引擎性能優化
使用共享存儲物理複製
由於POLARDB使用共享存儲和物理複製,實例的備份恢復也做到完全依賴redolog,因此去掉了binlog。使得單個事務對io的消耗減少,有效減少語句響應時間,提升吞吐量。同時避免了引擎需要與binlog做的XA事務邏輯,事務語句的執行路徑更短。
鎖優化
POLARDB針對高並發場景,對引擎內部鎖做了大量優化,比如把latch分解成粒度更小的鎖,或者把latch改成引用計數的方式從而避免鎖競爭,例如Undo segment mutex, log system mutex等等。PolarDB還把部分熱點的數據結構改成了Lock Free的結構,例如Server層的MDL鎖。
日誌提交優化
Redolog的順序寫性能對資料庫性能的影響很大,為了減少Redolog切換時對性能的影響,我們後臺採用類似Fallocate的方式預先分配日誌文件,此外,現代的SSD硬碟很多都是4K對齊,而MySQL代碼還是按照早期磁碟512位元組對齊的方式刷日誌的,這樣會導致磁碟做很多不必要的讀操作,不能發揮出SSD盤的性能,我們在這方面也做了優化。我們對日誌提交時Group Commit進行優化,同時採用Double RedoLog Buffer提升並行度。
複製性能
POLARDB中物理複製的性能至關重要,我們不僅通過基於數據頁維度的並行提高了性能,還對複製中的必要流程進行了優化,例如在MTR日誌中增加了一個長度欄位,從而減少了日誌Parse階段的CPU開銷,這個簡單的優化就能減少60%的日誌Parse時間。我們還通過復用Dummy Index的內存數據結構,減少了其在Malloc/Free上的開銷,進一步提高複製性能。
讀節點性能
POLARDB的Replica節點,日誌目前是一批一批應用的,因此當新的一批日誌被應用之前,Replica上的讀請求不需要重複創建新的ReadView,可以使用上次緩存下來的。這個優化也能提高Replica上的讀性能。
為什麼POLARDB能做到遠低於商業資料庫的成本
存儲資源池化
POLARDB採用了一種計算和存儲分離的架構,DB運行在計算節點,計算節點組成了一個計算資源池,數據都放在存儲節點上,存儲節點組成了一個存儲資源池。如果CPU和內存不夠了,就擴充計算資源池,如果容量或者IOPS不夠了,就擴充存儲資源池,兩個池子都是按需擴容。而且存儲節點和計算節點可以分別向兩個方向優化,存儲節點會選擇低配的CPU和內存,提高存儲密度,而計算節點可以選擇小容量、低配的SSD作為作業系統和日誌盤,上多路伺服器增加CPU的核數。
而傳統的資料庫部署模型則是一種煙囪模型,一臺主機既跑資料庫又存數據,這帶來兩個問題。一個是機型難以選擇,CPU和磁碟的配比主要取決於實際業務的需求,很難提前找到最優比例。第二是磁碟碎片問題,一個生產集群裡,總有部分機器磁碟使用率是很低的,有的還不到10%,但出於業務穩定性要求,會要求獨佔主機的CPU,這些機器上的SSD其實是被浪費的。通過存儲資源池化,這兩個問題都能得到解決,SSD的利用率得到提高,成本自然也降低下來。
透明壓縮
POLARDB的存儲節點除了對ibd文件提供1MB的原子寫,消除double write的開銷,還支持對ibd文件的數據塊進行透明壓縮,壓縮率可以達到2.4倍,進一步降低了存儲成本。
而傳統資料庫在DB內進行壓縮的方案相比,存儲節點實現透明壓縮不消耗計算節點的CPU,不影響DB的性能,利用QAT卡進行加速,以及在IO路徑上用FPGA進行加速。POLARDB的存儲節點還支持快照去重(dedup)功能,資料庫的相鄰快照之間,如果頁面沒有發生修改,會連結到同一份只讀頁面上,物理上只會存儲一份。
存儲成本的只讀實例
傳統資料庫做只讀實例,實施一寫多讀方案,是通過搭建只讀副本的方案,先拷貝一個最近的全量備份恢復一個臨時實例,再讓這個臨時實例連接主庫或者其他binlog源同步增量數據,增量追上後,把這個臨時實例加到線上升級為一個只讀副本。這種方法一個是耗時,搭建一個只讀實例需要的時間與數據量成正比;另一方面也很昂貴,需要增加一份存儲成本,比如用戶購買一個主實例加上五個只讀實例,需要付7~8份存儲的錢(7份還是8份取決於主實例是兩副本還是三副本)。
而在PolarDB架構中,這兩個問題都得到解決,一方面新增只讀實例不需要拷貝數據,不管數據量有多大都可以在2分鐘內創建出來;另一方面,主實例和只讀實例共享同一份存儲資源,通過這種架構去增加只讀副本,可以做到零新增存儲成本,用戶只需要支付只讀實例消耗的CPU和內存的費用。
POLARDB是未來雲資料庫的雛形(All in one),一個資料庫即可滿足現時多類資料庫混合使用效果。阿里雲發揮自身自研能力優勢,以POLARDB為產品契機,實現資料庫OLTP與OLAP的一體化設計,為企業的數位化升級所需的IT設施架構實現革命性進化。