葉志偉,蔡敦波,錢 嶺
(中移(蘇州)軟件技術(shù)有限公司 創(chuàng)新中心,江蘇 蘇州 215153)
云計算是信息技術(shù)與服務(wù)模式的一次重要變革,用戶可按需按量使用云服務(wù)提供商提供的基于計算、存儲與網(wǎng)絡(luò)資源池的基礎(chǔ)設(shè)施即服務(wù)(Infrastructure-as-a-Service,IaaS)、平臺即服務(wù)(Platform-as-a-Service,PaaS)和軟件即服務(wù)(Software-as-a-Service,SaaS)。隨著云計算技術(shù)的大規(guī)模應(yīng)用,越來越多用戶感受到云服務(wù)模式帶來的便利,因而紛紛將信息系統(tǒng)建設(shè)到云上以支撐業(yè)務(wù)的快速推進。數(shù)據(jù)庫作為信息系統(tǒng)的核心組件,通常需要用戶投入專業(yè)的運維團隊進行維護。Lehner 等[1]提出的數(shù)據(jù)庫即服務(wù)(DataBase-as-a-Service,DBaaS)方法能解決用戶在使用SaaS 時面臨的數(shù)據(jù)庫管理問題。云服務(wù)提供商為了讓用戶更方便地使用數(shù)據(jù)庫,提供了數(shù)據(jù)庫即服務(wù)。Gartner 在研究報告中預(yù)測,到2022 年將有75%的數(shù)據(jù)庫被部署或遷移到云平臺上,云是數(shù)據(jù)庫市場的未來[2]。
根據(jù)中國信通院與大數(shù)據(jù)技術(shù)標(biāo)準(zhǔn)推進委員會[3]的研究,云服務(wù)商提供DBaaS 通常采用兩種技術(shù)方式:一是借助虛擬化技術(shù),在硬件資源池服務(wù)器中部署傳統(tǒng)數(shù)據(jù)庫實例,以鏡像形式為用戶提供數(shù)據(jù)庫服務(wù);二是在虛擬化技術(shù)基礎(chǔ)上,利用計算存儲分離的數(shù)據(jù)庫架構(gòu)優(yōu)勢,提供具有更好彈性及高可用的數(shù)據(jù)庫服務(wù)。根據(jù)云原生計算基金會(Cloud Native Computing Foundation,CNCF)[4]的定義,云原生技術(shù)有利于各組織在公有云、私有云和混合云等新型動態(tài)環(huán)境中,構(gòu)建與運行可彈性擴展的應(yīng)用。因此,以方式二提供DBaaS 服務(wù)的技術(shù)符合云原生技術(shù)理念,被稱為云原生數(shù)據(jù)庫技術(shù)。
本文對計算存儲分離的云原生數(shù)據(jù)庫技術(shù)的不同架構(gòu)特點展開深入分析,介紹了不同架構(gòu)的設(shè)計方法,旨在為設(shè)計者和開發(fā)者提供參考。
傳統(tǒng)數(shù)據(jù)庫借助虛擬化技術(shù)可以簡單實現(xiàn)云數(shù)據(jù)庫服務(wù),并且可以很好地兼容現(xiàn)有應(yīng)用。林子雨等[5]在云數(shù)據(jù)庫研究報告中列舉了常見的公有云關(guān)系型數(shù)據(jù)庫,如亞馬遜AWS RDS 與微軟Azure SQL 等產(chǎn)品。這些云上傳統(tǒng)數(shù)據(jù)庫架構(gòu)如圖1 所示,為了保證高可用性,通常部署成一主多從的結(jié)構(gòu)。數(shù)據(jù)庫實例運行在獨立的虛擬主機或容器上,主實例對用戶提供讀寫能力,從實例提供只讀訪問能力。每個數(shù)據(jù)庫實例都擁有隔離的存儲,數(shù)據(jù)庫實例的存儲以本地存儲或云存儲形式存在。本地存儲是指直接掛載在數(shù)據(jù)庫實例對應(yīng)物理服務(wù)器上的存儲設(shè)備,而云存儲則是指云提供的IAAS 層存儲服務(wù)。
Fig.1 Master slave architecture of classic database圖1 傳統(tǒng)數(shù)據(jù)庫主從架構(gòu)
文獻[6]指出DBaaS 憑借低價格、擴展性和靈活性及高效率方面的優(yōu)勢贏得了市場,但這種云上傳統(tǒng)數(shù)據(jù)庫架構(gòu)無法很好地滿足用戶對DBaaS 的需求,在資源利用率、擴展性及可用性方面都存在問題。
在本地存儲方案中,用戶申請的數(shù)據(jù)庫實例規(guī)格以及對應(yīng)的存儲規(guī)格是固定的。對于用戶來說,無論用戶使用多少資源都需要支付固定費用,存在資源浪費的情況。對于云服務(wù)提供商來說,高規(guī)格數(shù)據(jù)庫實例搭配低容量存儲,或者低規(guī)格數(shù)據(jù)庫實例搭配大容量存儲等場景,意味著物理服務(wù)器上資源的不合理分配,造成資源利用率低下。在云存儲方案中,雖然存儲以池化的方式提升了彈性,但該方案中實例對應(yīng)的云存儲為了提高可用性,也需要對數(shù)據(jù)進行3 副本備份,在一主多從場景中存在同一份數(shù)據(jù)3 倍實例數(shù)的數(shù)據(jù)拷貝,突出的寫入放大問題對存儲資源以及網(wǎng)絡(luò)資源都造成了極大浪費。
在傳統(tǒng)數(shù)據(jù)庫架構(gòu)中,每個數(shù)據(jù)庫實例都有一份完整的數(shù)據(jù)庫存儲與之對應(yīng),該架構(gòu)在DBaaS 彈性及擴展性方面無法滿足用戶需求。當(dāng)業(yè)務(wù)負(fù)載加大,用戶需要增加數(shù)據(jù)庫實例進行橫向擴展時,或通過縱向擴展對數(shù)據(jù)庫實例規(guī)格進行升級時,與要升級的數(shù)據(jù)庫實例相對應(yīng)的存儲也需要隨之進行同步與遷移。用戶的業(yè)務(wù)數(shù)據(jù)量在GB 或TB級別時,同步與遷移意味著分鐘級或小時級的時間等待,這通常是用戶無法接受的。
在可用性方面,傳統(tǒng)數(shù)據(jù)庫架構(gòu)中,從實例通過異步方式接收主實例的數(shù)據(jù)庫日志,并異步根據(jù)日志生成從實例對應(yīng)的數(shù)據(jù)庫數(shù)據(jù),主從實例之間的數(shù)據(jù)不是強一致性的。當(dāng)主實例發(fā)生故障時,從實例不僅會出現(xiàn)一定量的數(shù)據(jù)丟失,而且在數(shù)據(jù)未更新到最新版本前只提供只讀服務(wù)。
針對云上傳統(tǒng)數(shù)據(jù)庫面臨的問題,業(yè)界從數(shù)據(jù)庫技術(shù)架構(gòu)層面開展了相關(guān)研究,以期使數(shù)據(jù)庫更符合云原生特性。文獻[7]介紹了以GoogleSpanner 為代表的分布式數(shù)據(jù)庫技術(shù),解決了大規(guī)模全球高性能數(shù)據(jù)庫系統(tǒng)存在的性能與擴展性問題,但其不兼容現(xiàn)有數(shù)據(jù)庫(如Oracle、MySQL、PostgreSQL、SQL Server 等)且成本昂貴的特性,使其較難在公有云市場進行推廣。以AWS Aurora 為代表的基于計算存儲分離技術(shù)架構(gòu)實現(xiàn)云原生的數(shù)據(jù)庫服務(wù)得到了公有云市場的普遍認(rèn)可,本文主要關(guān)注公有云原生數(shù)據(jù)庫技術(shù)。
亞馬遜的AWS Aurora 系統(tǒng)是全球第一個運用計算存儲分離架構(gòu)的商用云數(shù)據(jù)庫產(chǎn)品,之后,國內(nèi)外知名的云服務(wù)商也都在公有云平臺推出基于計算存儲分離架構(gòu)的云原生數(shù)據(jù)庫產(chǎn)品,具體情況如表1 所示。
Table 1 Cloud service providers and their cloud native databases表1 云服務(wù)商及其云原生數(shù)據(jù)庫產(chǎn)品
計算與存儲分離技術(shù)是為了解決計算存儲融合架構(gòu)資源浪費且擴展不易的一種方法。馬一力等[8]描述的計算存儲分離計算機體系結(jié)構(gòu)中,計算資源與存儲資源通過網(wǎng)絡(luò)動態(tài)組合,計算過程以數(shù)據(jù)為驅(qū)動,從而更好地實現(xiàn)按需驅(qū)動。在Hellerstein 等[9]描述的數(shù)據(jù)庫系統(tǒng)架構(gòu)中,計算是指消耗CPU 和內(nèi)存資源的查詢處理、事務(wù)管理、并發(fā)控制與日志處理等功能,存儲是指消耗存儲資源的日志與數(shù)據(jù)存儲持久化相關(guān)功能。在云資源池中,用戶對計算資源與存儲資源的需求是不同的。對于計算實例,用戶希望實例可根據(jù)負(fù)載狀態(tài)進行彈性擴縮容,并在故障時實現(xiàn)快速切換,而對存儲的需求是可以提供持久的數(shù)據(jù)可用及數(shù)據(jù)的快速獲取。計算實例與存儲之間通過高速的網(wǎng)絡(luò)進行交互。具有計算存儲分離架構(gòu)的云原生關(guān)系型數(shù)據(jù)庫為了降低網(wǎng)絡(luò)交互時延,從而獲得更好的性能,通常會把部分與數(shù)據(jù)持久化相關(guān)的計算能力下移至存儲層加以實現(xiàn),計算層實例不保存狀態(tài)信息,并且不進行數(shù)據(jù)持久化相關(guān)計算。
計算存儲分離架構(gòu)能很好地滿足云計算場景數(shù)據(jù)庫服務(wù)對計算與存儲的不同需求,解決了傳統(tǒng)數(shù)據(jù)庫在資源利用率、擴展性及可用性方面的問題。分離的計算層與存儲層給計算存儲網(wǎng)絡(luò)傳輸帶來了挑戰(zhàn),為此業(yè)界存在不同的計算能力下沉存儲層方法。本章以亞馬遜AWS Aurora、微軟AzureHyperscale、阿里云PolarDB 及華為云TaurusDB為例,介紹在計算存儲分離架構(gòu)方向開展的技術(shù)研究。
亞馬遜是云數(shù)據(jù)庫市場的先行者,其2014 年發(fā)布的Aurora 是世界上第一個將計算存儲分離技術(shù)應(yīng)用于數(shù)據(jù)庫的商業(yè)云服務(wù)。
Verbitski 等[10]概括了Aurora 的計算存儲分離架構(gòu),如圖2 所示。Aurora 的計算層數(shù)據(jù)庫實例提供查詢處理、事務(wù)管理與緩存管理等功能,Aurora 的存儲層提供日志存儲以及根據(jù)日志生成數(shù)據(jù)庫數(shù)據(jù)等功能,并能實現(xiàn)數(shù)據(jù)的持久化與多版本控制。共享存儲的數(shù)據(jù)庫數(shù)據(jù)以網(wǎng)絡(luò)交互方式提供給計算層使用。
Fig.2 Decoupled compute-storage architecture of Aurora圖2 Aurora 計算存儲分離架構(gòu)
在Aurora 架構(gòu)中,系統(tǒng)的主要瓶頸在于網(wǎng)絡(luò)IO,為此采用數(shù)據(jù)庫實例與共享存儲之間只傳輸日志而不傳輸數(shù)據(jù)的措施以提高網(wǎng)絡(luò)性能。Aurora 的存儲層基于“日志即數(shù)據(jù)庫”理念,從日志生成對應(yīng)的多版本數(shù)據(jù)庫數(shù)據(jù)。文獻[11]具體介紹了Aurora 在降低時延方面使用并發(fā)異步手段進行的日志傳輸與一致性處理方法。通過這些方法保證了Aurora 在性能方面相對于傳統(tǒng)MySQL 有巨大的提升。
在擴展性方面,Aurora 計算層采用一主多從結(jié)構(gòu),主實例提供讀寫功能,從實例提供只讀功能。由于底層的共享存儲不用像傳統(tǒng)架構(gòu)一樣進行數(shù)據(jù)的全量同步與遷移,計算層主實例與只讀實例可進行彈性橫向及縱向的擴縮容,而不用在意數(shù)據(jù)庫現(xiàn)有業(yè)務(wù)數(shù)據(jù)量造成的影響。另外Au?rora 共享存儲采用分布式架構(gòu),數(shù)據(jù)以分片形式錯落分布在存儲集群中,最大可擴容至64TB。
在可用性方面,共享存儲層采用3 個可用區(qū)(Available?Zone,AZ)維護6 份數(shù)據(jù)的方式,保證在一個可用區(qū)故障且外加1 份備份故障(AZ+1)的場景下依舊能完成數(shù)據(jù)恢復(fù),以提高服務(wù)的可用性。存儲層的6 份數(shù)據(jù)采用寫多數(shù)派方式保證日志寫入的持久性,只要4 個副本數(shù)據(jù)完成寫入即能保證日志持久化。之后存儲層使用Gossip 協(xié)議進行日志同步,從而保證全部6 副本日志的一致。另外,如果主實例出現(xiàn)故障,從實例借助共享存儲層的日志及數(shù)據(jù)可以輕松完成切換。
微軟Azure 數(shù)據(jù)庫分支Hyperscale 借鑒了Aurora 系統(tǒng),Antonopoulos 等[12]概括了如圖3 所示的Socrates 計算存儲分離架構(gòu)。Socrates 架構(gòu)中的計算層采用一主多從模式,主實例提供數(shù)據(jù)庫讀寫能力,計算層實例實現(xiàn)事務(wù)管理、查詢優(yōu)化、并行處理及數(shù)據(jù)緩存等功能。Socrates 架構(gòu)與Aurora架構(gòu)最大的不同在于其將日志從共享存儲的數(shù)據(jù)層進行了再分離。主實例將日志記錄到日志服務(wù)中,供其他節(jié)點異步消費日志信息用于數(shù)據(jù)更新。共享存儲層節(jié)點提供數(shù)據(jù)讀取功能,并通過快照與備份功能實現(xiàn)數(shù)據(jù)的持久化。
Fig.3 Decoupled compute-storage architecture of Socrates圖3 Socrates 計算存儲分離架構(gòu)
數(shù)據(jù)庫日志與數(shù)據(jù)庫中的數(shù)據(jù)在訪問方式上存在很大差異。數(shù)據(jù)庫日志的作用是為了保證數(shù)據(jù)庫的持久性,并以順序的方式頻繁寫入,但只在故障時才進行讀取,且日志寫入性能是數(shù)據(jù)庫系統(tǒng)的瓶頸。數(shù)據(jù)庫中數(shù)據(jù)的作用是為了保證數(shù)據(jù)庫的可用性,數(shù)據(jù)庫通常提供多版本的數(shù)據(jù),數(shù)據(jù)的讀時延和吞度量直接影響數(shù)據(jù)庫的讀性能。Socrates 根據(jù)日志與數(shù)據(jù)以上方面的差異,將日志與數(shù)據(jù)進行分離,從而分別提升日志層及數(shù)據(jù)層的性能。
阿里云PolarDB 利用PolarFS 作為存儲層實現(xiàn)了計算存儲分離架構(gòu),具體如圖4 所示。PolarDB 的計算層實例保留了數(shù)據(jù)庫事務(wù)管理、查詢優(yōu)化、并發(fā)控制與日志處理等計算功能,同樣采用一主多從結(jié)構(gòu)提供數(shù)據(jù)庫讀寫功能。底層的PolarFS 可實現(xiàn)數(shù)據(jù)的多副本一致性同步,文獻[13]介紹了PolarFS 這款高性能、低延遲讀寫的分布式共享存儲式文件系統(tǒng)實現(xiàn)方法,計算層主實例利用PolarFS 分布式文件系統(tǒng)提供的類POSIX 文件接口libpfs 進行日志寫入及數(shù)據(jù)讀寫,底層的PolarFS 通過3 副本與ParallelRaft 協(xié)議保證數(shù)據(jù)的高可用、持久性及一致性。
Fig.4 Decoupled compute-storage architecture of PolarDB圖4 PolarDB 計算存儲分離架構(gòu)
與Aurora 只將日志傳輸?shù)酱鎯硬⒃诖鎯犹幚砣罩旧蓴?shù)據(jù)的方法不同,PolarDB 并沒有對MySQL 內(nèi)核作過多改動,其仍然將日志和數(shù)據(jù)都傳輸?shù)酱鎯印olarDB 將優(yōu)化點放在用戶態(tài)IO 優(yōu)化及基于新網(wǎng)絡(luò)硬件的優(yōu)化以解決網(wǎng)絡(luò)性能問題。PolarDB 通過SPDK 開發(fā)套件解決本地IO 處理性能問題,并引入遠(yuǎn)程直接存取技術(shù)(Remote Di?rect Memory Access,RDMA)解決計算層與存儲層之間的網(wǎng)絡(luò)性能問題。
文獻[14]介紹了阿里云PolarDB 團隊最近與ScaleFlux團隊進行的聯(lián)合研究,借助于ScaleFlux 的可計算存儲,Po?larDB 將表掃描等與存儲相關(guān)性強的計算任務(wù)下推到存儲層實現(xiàn),從而提升了數(shù)據(jù)庫性能。
根據(jù)文獻[15],華為云也實現(xiàn)了基于計算存儲分離架構(gòu)的TaurusDB 數(shù)據(jù)庫,具體架構(gòu)如圖5 所示。計算層的數(shù)據(jù)庫實例提供數(shù)據(jù)庫事務(wù)管理、查詢優(yōu)化、并行處理等功能,采用一主多從架構(gòu),主實例對外提供數(shù)據(jù)庫讀寫功能。計算層通過存儲抽象層(Storage Abstraction Layer,SAL)提供的接口對日志進行讀寫。TaurusDB 的存儲層分為日志存儲與數(shù)據(jù)存儲兩部分。日志存儲負(fù)責(zé)日志的持久化存儲,并供從實例讀取用于數(shù)據(jù)更新。數(shù)據(jù)存儲以3 副本的方式完成數(shù)據(jù)分片存儲,并接收計算層主實例的日志信息用于數(shù)據(jù)更新,同時對計算層提供多個版本的數(shù)據(jù)。
Fig.5 Decoupled compute-storage architecture of TaurusDB圖5 TaurusDB 計算存儲分離架構(gòu)
TaurusDB 同樣基于“日志即數(shù)據(jù)庫”思想,以追加日志的方式完成寫操作,并根據(jù)日志實現(xiàn)數(shù)據(jù)生成。TaurusDB將日志存儲從數(shù)據(jù)存儲中分離,以減少數(shù)據(jù)存儲的負(fù)載,提升其性能。TaurusDB 同樣使用RDMA 網(wǎng)絡(luò)加速計算層與存儲層之間的網(wǎng)絡(luò)通信。TaurusDB 與Aurora 最大的區(qū)別在于存儲層實現(xiàn)的復(fù)制算法及恢復(fù)算法的優(yōu)化,該優(yōu)化保證了TaurusDB 在3 副本情況下實現(xiàn)高可用及數(shù)據(jù)強一致性。
盡管所有基于計算存儲分離架構(gòu)的云原生數(shù)據(jù)庫產(chǎn)品幾乎都可分為計算層和存儲層,但是計算層與存儲層的功能邊界可浮動,不同產(chǎn)品的功能分布也各不相同。亞馬遜AWS Aurora 基于“日志即數(shù)據(jù)庫”理念將存儲層作為一個分布式數(shù)據(jù)存儲系統(tǒng)加以實現(xiàn);微軟AzureHyperscale 將日志從計算與數(shù)據(jù)存儲之間分離出來單獨提供日志服務(wù);阿里云PolarDB 則更注重軟硬件結(jié)合的深度優(yōu)化,提供低延時的分布式文件系統(tǒng)供數(shù)據(jù)庫使用;華為云TaurusDB 將部分計算能力卸載到存儲節(jié)點,通過優(yōu)化算法實現(xiàn)更好的性能。
上述計算存儲分離架構(gòu)數(shù)據(jù)庫產(chǎn)品都是一主多從架構(gòu),單主的實現(xiàn)方式可以兼容現(xiàn)有應(yīng)用的數(shù)據(jù)庫服務(wù),但在數(shù)據(jù)庫寫能力擴展方面有所欠缺。引入分布式技術(shù)實現(xiàn)多主架構(gòu),支持分布式事務(wù)、分布式查詢優(yōu)化,結(jié)合分布式存儲可提升數(shù)據(jù)庫服務(wù)的寫橫向擴展能力。文獻[16]所述的數(shù)據(jù)庫基于全局事務(wù)日志一致性協(xié)議,初步實現(xiàn)了MySQL 多主數(shù)據(jù)庫架構(gòu)。
除架構(gòu)層面的優(yōu)化外,新硬件性能的提升同樣能提升云原生數(shù)據(jù)庫性能。新計算硬件與存儲硬件的發(fā)展,對數(shù)據(jù)庫性能優(yōu)化可起到很大幫助。如文獻[17]引入如GPU、FPGA 等異構(gòu)計算硬件,優(yōu)化了數(shù)據(jù)庫的計算能力;文獻[18]引入非易失性存儲器技術(shù),通過RDMA-NVM-SSD 三層存儲架構(gòu)實現(xiàn)數(shù)據(jù)庫,從而提升數(shù)據(jù)庫的數(shù)據(jù)處理及恢復(fù)性能。
DBaaS 的發(fā)展將增加數(shù)據(jù)庫業(yè)務(wù)的復(fù)雜度以及數(shù)據(jù)庫實例規(guī)模,DBaaS 的運維工作將成為云服務(wù)商的一項挑戰(zhàn)。面對該挑戰(zhàn),業(yè)界目前的研究方向是自動化管控平臺及智能化運維服務(wù)?;谟嬎愦鎯Ψ蛛x架構(gòu)的數(shù)據(jù)庫能夠提供Serverless 服務(wù)。數(shù)據(jù)庫管控平臺可針對不同負(fù)載壓力情況對計算實例實現(xiàn)按需啟動、空載停機及自動彈性擴縮容。借助于機器學(xué)習(xí)、人工智能等技術(shù),云上數(shù)據(jù)庫能夠?qū)崿F(xiàn)負(fù)載的自動感知預(yù)測,完成數(shù)據(jù)庫服務(wù)的自動優(yōu)化,使數(shù)據(jù)庫更加自動化和智能化。如文獻[19]和文獻[20]介紹了基于深度強化學(xué)習(xí)實現(xiàn)數(shù)據(jù)庫參數(shù)的自動調(diào)優(yōu),而文獻[21]更是提供了一種全自動數(shù)據(jù)庫的原型實現(xiàn)方法。