POLARDB的第三代分布式共享存儲架構(gòu)

首先,受益于第三代分布式共享存儲架構(gòu),使POLARDB實現(xiàn)了計算節(jié)點(主要做SQL解析以及存儲引擎計算的服務(wù)器)與存儲節(jié)點(主要做數(shù)據(jù)塊存儲,數(shù)據(jù)庫快照的服務(wù)器)的分離,提供了即時生效的可擴(kuò)展能力和運維能力。

眾所周知,在傳統(tǒng)數(shù)據(jù)庫上做擴(kuò)容、備份和遷移等操作,花費的時間和數(shù)據(jù)庫的容量成正比,往往上TB的數(shù)據(jù)庫容量加個只讀副本就需要一到兩天時間。POLARDB的存儲容量可以實現(xiàn)無縫擴(kuò)展,不管數(shù)據(jù)量有多大,2分鐘內(nèi)即可實現(xiàn)只讀副本擴(kuò)容,1分鐘內(nèi)即可實現(xiàn)全量備份,為企業(yè)的快速業(yè)務(wù)發(fā)展提供了彈性擴(kuò)展能力。

其次,與傳統(tǒng)云數(shù)據(jù)庫一個實例一份數(shù)據(jù)拷貝不同,POLARDB同一個實例的所有節(jié)點(包括讀寫節(jié)點和只讀節(jié)點)都實現(xiàn)訪問存儲節(jié)點上的同一份數(shù)據(jù),使得POLARDB的數(shù)據(jù)備份耗時實現(xiàn)秒級響應(yīng)。(備份時間與底層數(shù)據(jù)量無關(guān))
最后,借助優(yōu)秀的RDMA網(wǎng)絡(luò)以及最新的塊存儲技術(shù),實現(xiàn)服務(wù)器宕機(jī)后無需搬運數(shù)據(jù)重啟進(jìn)程即可服務(wù),滿足了互聯(lián)網(wǎng)環(huán)境下企業(yè)對數(shù)據(jù)庫服務(wù)器高可用的需求。

為什么POLARDB能做到6倍于MySQL的性能?

這里我們將分別以存儲性能、計算性能來進(jìn)行解讀詮釋。

阿里云POLARDB性能全景

1.POLARDB的存儲引擎性能優(yōu)化

眾所周知,關(guān)系型數(shù)據(jù)庫是IO密集型的應(yīng)用,IO性能的提高對數(shù)據(jù)庫的性能提升至關(guān)重要。過去十年我們看到在數(shù)據(jù)庫領(lǐng)域,SSD替換HDD的過程給數(shù)據(jù)庫數(shù)據(jù)處理的吞吐能力帶來了數(shù)量級的提升。

POLARDB采用了領(lǐng)先的硬件技術(shù):包括使用3DXpoint存儲介質(zhì)的Optane存儲卡、NVMe SSD和RoCE RDMA網(wǎng)絡(luò)。同時面向新硬件架構(gòu)實現(xiàn)軟硬一體優(yōu)化:從數(shù)據(jù)庫、文件系統(tǒng)到網(wǎng)絡(luò)通訊協(xié)議、分布式存儲系統(tǒng)和設(shè)備驅(qū)動,POLARDB實現(xiàn)縱貫軟件棧各層次的整個IO鏈條的深度優(yōu)化。

為了將3DXpoint顆粒的高性能和3D NAND顆粒的低成本結(jié)合起來,POLARDB創(chuàng)新的在軟件層實現(xiàn)對高速的Optane卡和大容量高吞吐的NVMe SSD進(jìn)行組合,實現(xiàn)一個名為混合存儲層。既保證數(shù)據(jù)寫入的低延遲、高吞吐、高QoS,又使整體方案兼具較高的性價比。

在POLARDB里,為了追求更高的性能、更低的延遲,阿里云數(shù)據(jù)庫團(tuán)隊大膽的拋棄了Linux內(nèi)核提供的各種機(jī)制,比如塊設(shè)備、各種文件系統(tǒng)例如ext4,以及TCP/IP協(xié)議棧和socket編程接口而選擇了另起爐灶。最終,POLARDB實現(xiàn)了一整套在用戶態(tài)運行的IO和網(wǎng)絡(luò)協(xié)議棧。

POLARDB用戶態(tài)協(xié)議棧解決了內(nèi)核IO協(xié)議棧慢的問題。用戶程序在用戶態(tài)直接通過DMA操作硬件設(shè)備,通過輪詢的方式監(jiān)聽硬件設(shè)備完成IO事件,消除了上下文切換和中斷的開銷。用戶程序還可以將IO處理線程和cpu進(jìn)行一一映射,每個IO處理線程獨占CPU,相互之間處理不同的IO請求,綁定不同的IO設(shè)備硬件隊列,一個IO請求生命周期從頭到尾都在一個線程一顆CPU上處理,不需要鎖進(jìn)行互斥。這種技術(shù)實現(xiàn)最大化的和高速設(shè)備進(jìn)行性能交互,實現(xiàn)一顆CPU達(dá)每秒約20萬次IO處理的能力,并且保持線性的擴(kuò)展能力,也就意味著4顆CPU可以達(dá)到每秒80萬次IO處理的能力,在性能和經(jīng)濟(jì)型上遠(yuǎn)高于內(nèi)核。

網(wǎng)絡(luò)也是類似的情況。過去傳統(tǒng)的以太網(wǎng),網(wǎng)卡發(fā)一個報文到另一臺機(jī)器,中間通過一跳交換機(jī),大概需要一百到兩百微秒。POLARDB支持ROCE以太網(wǎng),應(yīng)用程序通過RDMA網(wǎng)絡(luò),直接將本機(jī)的內(nèi)存寫入另一臺機(jī)器的內(nèi)存地址,或者從另一臺機(jī)器的內(nèi)存讀一塊數(shù)據(jù)到本機(jī),中間的通訊協(xié)議編解碼、重傳機(jī)制都由RDMA網(wǎng)卡來完成,不需要CPU參與,使性能獲得極大提升,傳輸一個4k大小報文只需要6、7微秒的時間。如同內(nèi)核的IO協(xié)議棧跟不上高速存儲設(shè)備能力,再一次的,內(nèi)核的TCP/IP協(xié)議棧跟不上高速網(wǎng)絡(luò)設(shè)備能力,被POLARDB的用戶態(tài)網(wǎng)絡(luò)協(xié)議棧代替。

大家都知道關(guān)系型數(shù)據(jù)庫的重要特性歸納起來是“ACID”,其中A是原子性,C是約束,I是隔離性,D是持久性。

POLARDB將從兩個維度出發(fā),從根本上改進(jìn)多副本復(fù)制。一個是保證數(shù)據(jù)庫ACID中的D(Durable),把網(wǎng)絡(luò)、存儲硬件提供的DMA能力串起,用硬件通道高性能的把主庫的日志數(shù)據(jù)持久化到三個存儲節(jié)點的磁盤中;另一個是實現(xiàn)了高效的只讀節(jié)點,在主庫和只讀節(jié)點之間通過物理復(fù)制同步數(shù)據(jù),直接更新到只讀節(jié)點的內(nèi)存里。 如何實現(xiàn)?

POLARDB實現(xiàn)日志數(shù)據(jù)持久化到三個存儲節(jié)點的磁盤中。主庫通過RDMA將日志數(shù)據(jù)發(fā)送到存儲節(jié)點的內(nèi)存中,存儲節(jié)點之間再通過RDMA互相復(fù)制,每個存儲節(jié)點用SPDK將數(shù)據(jù)寫入NVMe接口的存儲介質(zhì)里,整個過程CPU不用訪問被同步的數(shù)據(jù)塊(Payload),實現(xiàn)數(shù)據(jù)零拷貝。

同時由RDMA網(wǎng)卡和NVMe控制器完成數(shù)據(jù)傳輸和持久化,CPU僅做狀態(tài)機(jī)的維護(hù),在一致性協(xié)議的協(xié)調(diào)下,把網(wǎng)卡和存儲卡兩塊硬件串起來,存儲節(jié)點之間數(shù)據(jù)同步采用并發(fā)Raft(Parallel Raft)協(xié)議,和Raft協(xié)議一樣,決議在leader節(jié)點上是串行生成和提交的,但并發(fā)Raft協(xié)議可以允許主從之間亂序同步,簡單的說,允許follower節(jié)點在漏掉若干條日志的情況先commit并apply后面過來的日志,并異步的去補之前漏掉的日志,數(shù)據(jù)同步的性能和穩(wěn)定性都顯著優(yōu)于Raft協(xié)議。

POLARDB在主庫和只讀實例之間的數(shù)據(jù)流上,放棄了基于binlog的邏輯復(fù)制,而是基于innodb的redolog實現(xiàn)了物理復(fù)制,從邏輯復(fù)制到物理復(fù)制對主庫和從庫性能帶來的提升都非常明顯。

在主庫上,原本引擎需要和binlog做XA事務(wù),事務(wù)要等到binlog和redolog同時寫盤后才能返回,去掉binlog后,XA事務(wù)可以去掉,事務(wù)的執(zhí)行路徑更短,IO開銷也更小。在從庫上,redolog由于是物理復(fù)制,僅需比對頁面的LSN就可以決定是否回放,天然可以多線程執(zhí)行,數(shù)據(jù)的正確性也更有保證,此外,POLARDB的從庫收到redolog后只需要更新緩存里的頁面,并不需要寫盤和IO操作,開銷遠(yuǎn)低于傳統(tǒng)多副本復(fù)制里的從庫。

POLARDB的存儲節(jié)點針對數(shù)據(jù)庫的IO workload進(jìn)行了一些針對性的優(yōu)化。

IO優(yōu)先級優(yōu)化:POLARDB在文件系統(tǒng)和存儲節(jié)點兩層都開了綠色通道,對redolog文件的更新進(jìn)行優(yōu)待處理,減少排隊,提高IO的優(yōu)先級。redolog也從512對齊調(diào)整為4k對齊,對SSD性能更加友好。

double write優(yōu)化:POLARDB存儲節(jié)點原生支持1MB的原子寫,因此可以安全關(guān)閉double write,從而節(jié)省了近一倍的IO開銷。

group commit優(yōu)化:POLARDB里一次group commit可以產(chǎn)生寫入幾百KB的單個大IO。對于單個SSD,延遲和IO的大小是呈線性的,而POLARDB從文件系統(tǒng)到存儲節(jié)點都進(jìn)行一系列優(yōu)化來保證這種類型的IO能盡快刷下去,針對redolog文件進(jìn)行條帶化,將一個上百KB的大IO切割為一批16KB的較小IO,分發(fā)到多個存儲節(jié)點和不同的磁盤上去執(zhí)行,進(jìn)一步的降低關(guān)鍵IO路徑的延遲。

2.POLARDB的計算引擎性能優(yōu)化

由于POLARDB使用共享存儲和物理復(fù)制,實例的備份恢復(fù)也做到完全依賴redolog,因此去掉了binlog。使得單個事務(wù)對io的消耗減少,有效減少語句響應(yīng)時間,提升吞吐量。同時避免了引擎需要與binlog做的XA事務(wù)邏輯,事務(wù)語句的執(zhí)行路徑更短。

POLARDB針對高并發(fā)場景,對引擎內(nèi)部鎖做了大量優(yōu)化,比如把latch分解成粒度更小的鎖,或者把latch改成引用計數(shù)的方式從而避免鎖競爭,例如Undo segment mutex, log system mutex等等。PolarDB還把部分熱點的數(shù)據(jù)結(jié)構(gòu)改成了Lock Free的結(jié)構(gòu),例如Server層的MDL鎖。

Redolog的順序?qū)懶阅軐?shù)據(jù)庫性能的影響很大,為了減少Redolog切換時對性能的影響,我們后臺采用類似Fallocate的方式預(yù)先分配日志文件,此外,現(xiàn)代的SSD硬盤很多都是4K對齊,而MySQL代碼還是按照早期磁盤512字節(jié)對齊的方式刷日志的,這樣會導(dǎo)致磁盤做很多不必要的讀操作,不能發(fā)揮出SSD盤的性能,我們在這方面也做了優(yōu)化。我們對日志提交時Group Commit進(jìn)行優(yōu)化,同時采用Double RedoLog Buffer提升并行度。

POLARDB中物理復(fù)制的性能至關(guān)重要,我們不僅通過基于數(shù)據(jù)頁維度的并行提高了性能,還對復(fù)制中的必要流程進(jìn)行了優(yōu)化,例如在MTR日志中增加了一個長度字段,從而減少了日志Parse階段的CPU開銷,這個簡單的優(yōu)化就能減少60%的日志Parse時間。我們還通過復(fù)用Dummy Index的內(nèi)存數(shù)據(jù)結(jié)構(gòu),減少了其在Malloc/Free上的開銷,進(jìn)一步提高復(fù)制性能。

POLARDB的Replica節(jié)點,日志目前是一批一批應(yīng)用的,因此當(dāng)新的一批日志被應(yīng)用之前,Replica上的讀請求不需要重復(fù)創(chuàng)建新的ReadView,可以使用上次緩存下來的。這個優(yōu)化也能提高Replica上的讀性能。

為什么POLARDB能做到遠(yuǎn)低于商業(yè)數(shù)據(jù)庫的成本

POLARDB采用了一種計算和存儲分離的架構(gòu),DB運行在計算節(jié)點,計算節(jié)點組成了一個計算資源池,數(shù)據(jù)都放在存儲節(jié)點上,存儲節(jié)點組成了一個存儲資源池。如果CPU和內(nèi)存不夠了,就擴(kuò)充計算資源池,如果容量或者IOPS不夠了,就擴(kuò)充存儲資源池,兩個池子都是按需擴(kuò)容。而且存儲節(jié)點和計算節(jié)點可以分別向兩個方向優(yōu)化,存儲節(jié)點會選擇低配的CPU和內(nèi)存,提高存儲密度,而計算節(jié)點可以選擇小容量、低配的SSD作為操作系統(tǒng)和日志盤,上多路服務(wù)器增加CPU的核數(shù)。

而傳統(tǒng)的數(shù)據(jù)庫部署模型則是一種煙囪模型,一臺主機(jī)既跑數(shù)據(jù)庫又存數(shù)據(jù),這帶來兩個問題。一個是機(jī)型難以選擇,CPU和磁盤的配比主要取決于實際業(yè)務(wù)的需求,很難提前找到最優(yōu)比例。第二是磁盤碎片問題,一個生產(chǎn)集群里,總有部分機(jī)器磁盤使用率是很低的,有的還不到10%,但出于業(yè)務(wù)穩(wěn)定性要求,會要求獨占主機(jī)的CPU,這些機(jī)器上的SSD其實是被浪費的。通過存儲資源池化,這兩個問題都能得到解決,SSD的利用率得到提高,成本自然也降低下來。

POLARDB的存儲節(jié)點除了對ibd文件提供1MB的原子寫,消除double write的開銷,還支持對ibd文件的數(shù)據(jù)塊進(jìn)行透明壓縮,壓縮率可以達(dá)到2.4倍,進(jìn)一步降低了存儲成本。

而傳統(tǒng)數(shù)據(jù)庫在DB內(nèi)進(jìn)行壓縮的方案相比,存儲節(jié)點實現(xiàn)透明壓縮不消耗計算節(jié)點的CPU,不影響DB的性能,利用QAT卡進(jìn)行加速,以及在IO路徑上用FPGA進(jìn)行加速。POLARDB的存儲節(jié)點還支持快照去重(dedup)功能,數(shù)據(jù)庫的相鄰快照之間,如果頁面沒有發(fā)生修改,會鏈接到同一份只讀頁面上,物理上只會存儲一份。

傳統(tǒng)數(shù)據(jù)庫做只讀實例,實施一寫多讀方案,是通過搭建只讀副本的方案,先拷貝一個最近的全量備份恢復(fù)一個臨時實例,再讓這個臨時實例連接主庫或者其他binlog源同步增量數(shù)據(jù),增量追上后,把這個臨時實例加到線上升級為一個只讀副本。這種方法一個是耗時,搭建一個只讀實例需要的時間與數(shù)據(jù)量成正比;另一方面也很昂貴,需要增加一份存儲成本,比如用戶購買一個主實例加上五個只讀實例,需要付7~8份存儲的錢(7份還是8份取決于主實例是兩副本還是三副本)。

而在PolarDB架構(gòu)中,這兩個問題都得到解決,一方面新增只讀實例不需要拷貝數(shù)據(jù),不管數(shù)據(jù)量有多大都可以在2分鐘內(nèi)創(chuàng)建出來;另一方面,主實例和只讀實例共享同一份存儲資源,通過這種架構(gòu)去增加只讀副本,可以做到零新增存儲成本,用戶只需要支付只讀實例消耗的CPU和內(nèi)存的費用。

POLARDB是未來云數(shù)據(jù)庫的雛形(All in one),一個數(shù)據(jù)庫即可滿足現(xiàn)時多類數(shù)據(jù)庫混合使用效果。阿里云發(fā)揮自身自研能力優(yōu)勢,以POLARDB為產(chǎn)品契機(jī),實現(xiàn)數(shù)據(jù)庫OLTP與OLAP的一體化設(shè)計,為企業(yè)的數(shù)字化升級所需的IT設(shè)施架構(gòu)實現(xiàn)革命性進(jìn)化。

【本文作者系阿里云資深技術(shù)專家曹偉、林曉斌】

分享到

xiesc

相關(guān)推薦