葉志偉,蔡敦波,錢 嶺
(中移(蘇州)軟件技術有限公司 創新中心,江蘇 蘇州 215153)
云計算是信息技術與服務模式的一次重要變革,用戶可按需按量使用云服務提供商提供的基于計算、存儲與網絡資源池的基礎設施即服務(Infrastructure-as-a-Service,IaaS)、平臺即服務(Platform-as-a-Service,PaaS)和軟件即服務(Software-as-a-Service,SaaS)。隨著云計算技術的大規模應用,越來越多用戶感受到云服務模式帶來的便利,因而紛紛將信息系統建設到云上以支撐業務的快速推進。數據庫作為信息系統的核心組件,通常需要用戶投入專業的運維團隊進行維護。Lehner 等[1]提出的數據庫即服務(DataBase-as-a-Service,DBaaS)方法能解決用戶在使用SaaS 時面臨的數據庫管理問題。云服務提供商為了讓用戶更方便地使用數據庫,提供了數據庫即服務。Gartner 在研究報告中預測,到2022 年將有75%的數據庫被部署或遷移到云平臺上,云是數據庫市場的未來[2]。
根據中國信通院與大數據技術標準推進委員會[3]的研究,云服務商提供DBaaS 通常采用兩種技術方式:一是借助虛擬化技術,在硬件資源池服務器中部署傳統數據庫實例,以鏡像形式為用戶提供數據庫服務;二是在虛擬化技術基礎上,利用計算存儲分離的數據庫架構優勢,提供具有更好彈性及高可用的數據庫服務。根據云原生計算基金會(Cloud Native Computing Foundation,CNCF)[4]的定義,云原生技術有利于各組織在公有云、私有云和混合云等新型動態環境中,構建與運行可彈性擴展的應用。因此,以方式二提供DBaaS 服務的技術符合云原生技術理念,被稱為云原生數據庫技術。
本文對計算存儲分離的云原生數據庫技術的不同架構特點展開深入分析,介紹了不同架構的設計方法,旨在為設計者和開發者提供參考。
傳統數據庫借助虛擬化技術可以簡單實現云數據庫服務,并且可以很好地兼容現有應用。林子雨等[5]在云數據庫研究報告中列舉了常見的公有云關系型數據庫,如亞馬遜AWS RDS 與微軟Azure SQL 等產品。這些云上傳統數據庫架構如圖1 所示,為了保證高可用性,通常部署成一主多從的結構。數據庫實例運行在獨立的虛擬主機或容器上,主實例對用戶提供讀寫能力,從實例提供只讀訪問能力。每個數據庫實例都擁有隔離的存儲,數據庫實例的存儲以本地存儲或云存儲形式存在。本地存儲是指直接掛載在數據庫實例對應物理服務器上的存儲設備,而云存儲則是指云提供的IAAS 層存儲服務。

Fig.1 Master slave architecture of classic database圖1 傳統數據庫主從架構
文獻[6]指出DBaaS 憑借低價格、擴展性和靈活性及高效率方面的優勢贏得了市場,但這種云上傳統數據庫架構無法很好地滿足用戶對DBaaS 的需求,在資源利用率、擴展性及可用性方面都存在問題。
在本地存儲方案中,用戶申請的數據庫實例規格以及對應的存儲規格是固定的。對于用戶來說,無論用戶使用多少資源都需要支付固定費用,存在資源浪費的情況。對于云服務提供商來說,高規格數據庫實例搭配低容量存儲,或者低規格數據庫實例搭配大容量存儲等場景,意味著物理服務器上資源的不合理分配,造成資源利用率低下。在云存儲方案中,雖然存儲以池化的方式提升了彈性,但該方案中實例對應的云存儲為了提高可用性,也需要對數據進行3 副本備份,在一主多從場景中存在同一份數據3 倍實例數的數據拷貝,突出的寫入放大問題對存儲資源以及網絡資源都造成了極大浪費。
在傳統數據庫架構中,每個數據庫實例都有一份完整的數據庫存儲與之對應,該架構在DBaaS 彈性及擴展性方面無法滿足用戶需求。當業務負載加大,用戶需要增加數據庫實例進行橫向擴展時,或通過縱向擴展對數據庫實例規格進行升級時,與要升級的數據庫實例相對應的存儲也需要隨之進行同步與遷移。用戶的業務數據量在GB 或TB級別時,同步與遷移意味著分鐘級或小時級的時間等待,這通常是用戶無法接受的。
在可用性方面,傳統數據庫架構中,從實例通過異步方式接收主實例的數據庫日志,并異步根據日志生成從實例對應的數據庫數據,主從實例之間的數據不是強一致性的。當主實例發生故障時,從實例不僅會出現一定量的數據丟失,而且在數據未更新到最新版本前只提供只讀服務。
針對云上傳統數據庫面臨的問題,業界從數據庫技術架構層面開展了相關研究,以期使數據庫更符合云原生特性。文獻[7]介紹了以GoogleSpanner 為代表的分布式數據庫技術,解決了大規模全球高性能數據庫系統存在的性能與擴展性問題,但其不兼容現有數據庫(如Oracle、MySQL、PostgreSQL、SQL Server 等)且成本昂貴的特性,使其較難在公有云市場進行推廣。以AWS Aurora 為代表的基于計算存儲分離技術架構實現云原生的數據庫服務得到了公有云市場的普遍認可,本文主要關注公有云原生數據庫技術。
亞馬遜的AWS Aurora 系統是全球第一個運用計算存儲分離架構的商用云數據庫產品,之后,國內外知名的云服務商也都在公有云平臺推出基于計算存儲分離架構的云原生數據庫產品,具體情況如表1 所示。

Table 1 Cloud service providers and their cloud native databases表1 云服務商及其云原生數據庫產品
計算與存儲分離技術是為了解決計算存儲融合架構資源浪費且擴展不易的一種方法。馬一力等[8]描述的計算存儲分離計算機體系結構中,計算資源與存儲資源通過網絡動態組合,計算過程以數據為驅動,從而更好地實現按需驅動。在Hellerstein 等[9]描述的數據庫系統架構中,計算是指消耗CPU 和內存資源的查詢處理、事務管理、并發控制與日志處理等功能,存儲是指消耗存儲資源的日志與數據存儲持久化相關功能。在云資源池中,用戶對計算資源與存儲資源的需求是不同的。對于計算實例,用戶希望實例可根據負載狀態進行彈性擴縮容,并在故障時實現快速切換,而對存儲的需求是可以提供持久的數據可用及數據的快速獲取。計算實例與存儲之間通過高速的網絡進行交互。具有計算存儲分離架構的云原生關系型數據庫為了降低網絡交互時延,從而獲得更好的性能,通常會把部分與數據持久化相關的計算能力下移至存儲層加以實現,計算層實例不保存狀態信息,并且不進行數據持久化相關計算。
計算存儲分離架構能很好地滿足云計算場景數據庫服務對計算與存儲的不同需求,解決了傳統數據庫在資源利用率、擴展性及可用性方面的問題。分離的計算層與存儲層給計算存儲網絡傳輸帶來了挑戰,為此業界存在不同的計算能力下沉存儲層方法。本章以亞馬遜AWS Aurora、微軟AzureHyperscale、阿里云PolarDB 及華為云TaurusDB為例,介紹在計算存儲分離架構方向開展的技術研究。
亞馬遜是云數據庫市場的先行者,其2014 年發布的Aurora 是世界上第一個將計算存儲分離技術應用于數據庫的商業云服務。
Verbitski 等[10]概括了Aurora 的計算存儲分離架構,如圖2 所示。Aurora 的計算層數據庫實例提供查詢處理、事務管理與緩存管理等功能,Aurora 的存儲層提供日志存儲以及根據日志生成數據庫數據等功能,并能實現數據的持久化與多版本控制。共享存儲的數據庫數據以網絡交互方式提供給計算層使用。

Fig.2 Decoupled compute-storage architecture of Aurora圖2 Aurora 計算存儲分離架構
在Aurora 架構中,系統的主要瓶頸在于網絡IO,為此采用數據庫實例與共享存儲之間只傳輸日志而不傳輸數據的措施以提高網絡性能。Aurora 的存儲層基于“日志即數據庫”理念,從日志生成對應的多版本數據庫數據。文獻[11]具體介紹了Aurora 在降低時延方面使用并發異步手段進行的日志傳輸與一致性處理方法。通過這些方法保證了Aurora 在性能方面相對于傳統MySQL 有巨大的提升。
在擴展性方面,Aurora 計算層采用一主多從結構,主實例提供讀寫功能,從實例提供只讀功能。由于底層的共享存儲不用像傳統架構一樣進行數據的全量同步與遷移,計算層主實例與只讀實例可進行彈性橫向及縱向的擴縮容,而不用在意數據庫現有業務數據量造成的影響。另外Au?rora 共享存儲采用分布式架構,數據以分片形式錯落分布在存儲集群中,最大可擴容至64TB。
在可用性方面,共享存儲層采用3 個可用區(Available?Zone,AZ)維護6 份數據的方式,保證在一個可用區故障且外加1 份備份故障(AZ+1)的場景下依舊能完成數據恢復,以提高服務的可用性。存儲層的6 份數據采用寫多數派方式保證日志寫入的持久性,只要4 個副本數據完成寫入即能保證日志持久化。之后存儲層使用Gossip 協議進行日志同步,從而保證全部6 副本日志的一致。另外,如果主實例出現故障,從實例借助共享存儲層的日志及數據可以輕松完成切換。
微軟Azure 數據庫分支Hyperscale 借鑒了Aurora 系統,Antonopoulos 等[12]概括了如圖3 所示的Socrates 計算存儲分離架構。Socrates 架構中的計算層采用一主多從模式,主實例提供數據庫讀寫能力,計算層實例實現事務管理、查詢優化、并行處理及數據緩存等功能。Socrates 架構與Aurora架構最大的不同在于其將日志從共享存儲的數據層進行了再分離。主實例將日志記錄到日志服務中,供其他節點異步消費日志信息用于數據更新。共享存儲層節點提供數據讀取功能,并通過快照與備份功能實現數據的持久化。

Fig.3 Decoupled compute-storage architecture of Socrates圖3 Socrates 計算存儲分離架構
數據庫日志與數據庫中的數據在訪問方式上存在很大差異。數據庫日志的作用是為了保證數據庫的持久性,并以順序的方式頻繁寫入,但只在故障時才進行讀取,且日志寫入性能是數據庫系統的瓶頸。數據庫中數據的作用是為了保證數據庫的可用性,數據庫通常提供多版本的數據,數據的讀時延和吞度量直接影響數據庫的讀性能。Socrates 根據日志與數據以上方面的差異,將日志與數據進行分離,從而分別提升日志層及數據層的性能。
阿里云PolarDB 利用PolarFS 作為存儲層實現了計算存儲分離架構,具體如圖4 所示。PolarDB 的計算層實例保留了數據庫事務管理、查詢優化、并發控制與日志處理等計算功能,同樣采用一主多從結構提供數據庫讀寫功能。底層的PolarFS 可實現數據的多副本一致性同步,文獻[13]介紹了PolarFS 這款高性能、低延遲讀寫的分布式共享存儲式文件系統實現方法,計算層主實例利用PolarFS 分布式文件系統提供的類POSIX 文件接口libpfs 進行日志寫入及數據讀寫,底層的PolarFS 通過3 副本與ParallelRaft 協議保證數據的高可用、持久性及一致性。

Fig.4 Decoupled compute-storage architecture of PolarDB圖4 PolarDB 計算存儲分離架構
與Aurora 只將日志傳輸到存儲層并在存儲層處理日志生成數據的方法不同,PolarDB 并沒有對MySQL 內核作過多改動,其仍然將日志和數據都傳輸到存儲層。PolarDB 將優化點放在用戶態IO 優化及基于新網絡硬件的優化以解決網絡性能問題。PolarDB 通過SPDK 開發套件解決本地IO 處理性能問題,并引入遠程直接存取技術(Remote Di?rect Memory Access,RDMA)解決計算層與存儲層之間的網絡性能問題。
文獻[14]介紹了阿里云PolarDB 團隊最近與ScaleFlux團隊進行的聯合研究,借助于ScaleFlux 的可計算存儲,Po?larDB 將表掃描等與存儲相關性強的計算任務下推到存儲層實現,從而提升了數據庫性能。
根據文獻[15],華為云也實現了基于計算存儲分離架構的TaurusDB 數據庫,具體架構如圖5 所示。計算層的數據庫實例提供數據庫事務管理、查詢優化、并行處理等功能,采用一主多從架構,主實例對外提供數據庫讀寫功能。計算層通過存儲抽象層(Storage Abstraction Layer,SAL)提供的接口對日志進行讀寫。TaurusDB 的存儲層分為日志存儲與數據存儲兩部分。日志存儲負責日志的持久化存儲,并供從實例讀取用于數據更新。數據存儲以3 副本的方式完成數據分片存儲,并接收計算層主實例的日志信息用于數據更新,同時對計算層提供多個版本的數據。

Fig.5 Decoupled compute-storage architecture of TaurusDB圖5 TaurusDB 計算存儲分離架構
TaurusDB 同樣基于“日志即數據庫”思想,以追加日志的方式完成寫操作,并根據日志實現數據生成。TaurusDB將日志存儲從數據存儲中分離,以減少數據存儲的負載,提升其性能。TaurusDB 同樣使用RDMA 網絡加速計算層與存儲層之間的網絡通信。TaurusDB 與Aurora 最大的區別在于存儲層實現的復制算法及恢復算法的優化,該優化保證了TaurusDB 在3 副本情況下實現高可用及數據強一致性。
盡管所有基于計算存儲分離架構的云原生數據庫產品幾乎都可分為計算層和存儲層,但是計算層與存儲層的功能邊界可浮動,不同產品的功能分布也各不相同。亞馬遜AWS Aurora 基于“日志即數據庫”理念將存儲層作為一個分布式數據存儲系統加以實現;微軟AzureHyperscale 將日志從計算與數據存儲之間分離出來單獨提供日志服務;阿里云PolarDB 則更注重軟硬件結合的深度優化,提供低延時的分布式文件系統供數據庫使用;華為云TaurusDB 將部分計算能力卸載到存儲節點,通過優化算法實現更好的性能。
上述計算存儲分離架構數據庫產品都是一主多從架構,單主的實現方式可以兼容現有應用的數據庫服務,但在數據庫寫能力擴展方面有所欠缺。引入分布式技術實現多主架構,支持分布式事務、分布式查詢優化,結合分布式存儲可提升數據庫服務的寫橫向擴展能力。文獻[16]所述的數據庫基于全局事務日志一致性協議,初步實現了MySQL 多主數據庫架構。
除架構層面的優化外,新硬件性能的提升同樣能提升云原生數據庫性能。新計算硬件與存儲硬件的發展,對數據庫性能優化可起到很大幫助。如文獻[17]引入如GPU、FPGA 等異構計算硬件,優化了數據庫的計算能力;文獻[18]引入非易失性存儲器技術,通過RDMA-NVM-SSD 三層存儲架構實現數據庫,從而提升數據庫的數據處理及恢復性能。
DBaaS 的發展將增加數據庫業務的復雜度以及數據庫實例規模,DBaaS 的運維工作將成為云服務商的一項挑戰。面對該挑戰,業界目前的研究方向是自動化管控平臺及智能化運維服務?;谟嬎愦鎯Ψ蛛x架構的數據庫能夠提供Serverless 服務。數據庫管控平臺可針對不同負載壓力情況對計算實例實現按需啟動、空載停機及自動彈性擴縮容。借助于機器學習、人工智能等技術,云上數據庫能夠實現負載的自動感知預測,完成數據庫服務的自動優化,使數據庫更加自動化和智能化。如文獻[19]和文獻[20]介紹了基于深度強化學習實現數據庫參數的自動調優,而文獻[21]更是提供了一種全自動數據庫的原型實現方法。