早在2019年,Serverless就曾被Gartner稱為最有潛力的云計(jì)算技術(shù)發(fā)展方向,并被賦予是必然性的發(fā)展趨勢。Serverless從底層開始變革計(jì)算資源的形態(tài),為軟件架構(gòu)設(shè)計(jì)與應(yīng)用服務(wù)部署帶來了新的設(shè)計(jì)思路,被譽(yù)為云計(jì)算未來。
在全球分布式云大會(huì)上,騰訊云數(shù)據(jù)庫專家工程師李志陽老師為大家?guī)砹耍骸斗植际綌?shù)據(jù)庫Serverless化:深入解讀無服務(wù)器架構(gòu)下的數(shù)據(jù)庫》的分享。
01.
Serverless數(shù)據(jù)庫特點(diǎn)
隨著業(yè)務(wù)專注度的提升,服務(wù)的抽象程度也在提高。
李志陽舉了一個(gè)汽車服務(wù)的例子,以前為了出行只能購買汽車,現(xiàn)在可以使用打車服務(wù),只需知道目的地即可,不再關(guān)注開車和保養(yǎng),核心訴求得到了更好的滿足。
計(jì)算服務(wù)的演進(jìn)也是類似,從前自建機(jī)房,需要維護(hù)機(jī)房設(shè)備;后來可以在云上直接購買虛擬機(jī),部署業(yè)務(wù),負(fù)責(zé)服務(wù)的擴(kuò)縮容;現(xiàn)在的函數(shù)計(jì)算,從CI/CD到服務(wù)部署,擴(kuò)縮容,全部自動(dòng)完成,客戶可以更專注于業(yè)務(wù)代碼。
狹義的Serverless分為FaaS和BaaS,基本特點(diǎn)是無需運(yùn)維、以API方式提供服務(wù)、按實(shí)際使用計(jì)費(fèi)、無使用無費(fèi)用等。舉個(gè)例子,用戶瀏覽網(wǎng)頁,可能涉及CDN資源。如果是靜態(tài)內(nèi)容,從對象存儲(chǔ)下載照片、視頻;如果是動(dòng)態(tài)內(nèi)容,則觸發(fā)一個(gè)函數(shù)計(jì)算,云函數(shù)將從云數(shù)據(jù)庫獲取相應(yīng)的資源,生成用戶所需的動(dòng)態(tài)內(nèi)容。其中,云函數(shù)為FaaS,對象存儲(chǔ)和云數(shù)據(jù)庫則為BaaS。
傳統(tǒng)的云數(shù)據(jù)庫會(huì)提供多種內(nèi)存/CPU規(guī)格給用戶購買。即使無法時(shí)刻用滿負(fù)載,用戶也需要為選中的規(guī)格付費(fèi)。如果要將數(shù)據(jù)庫Serverless化,需要滿足以下三大特性:
1.自動(dòng)擴(kuò)縮容。訪問量上來時(shí)自動(dòng)擴(kuò)容,降低時(shí)自動(dòng)縮容,用戶不需要關(guān)注規(guī)格。
2.按照實(shí)際使用的資源付費(fèi)。
3.不使用不計(jì)費(fèi)。如果沒有訪問,不應(yīng)該收費(fèi)。
02.
Serverless數(shù)據(jù)庫選型
在講述Serverless數(shù)據(jù)庫選型之前,李志陽先介紹了云數(shù)據(jù)庫架構(gòu)的演進(jìn)。
圖左側(cè)是目前的主流架構(gòu)—單體冗余架構(gòu)(一主多從),是現(xiàn)在大部分客戶使用的架構(gòu)。這類架構(gòu)存在擴(kuò)展性問題,實(shí)例的升降級和讀擴(kuò)展,都通過數(shù)據(jù)搬遷實(shí)現(xiàn),隨著數(shù)據(jù)量的增長,遷移耗時(shí)越來越長。
為了解決這個(gè)問題,業(yè)界趨勢是采用存算分離架構(gòu),衍生出兩類,一類是ShareNothing架構(gòu),計(jì)算和存儲(chǔ)均支持水平擴(kuò)展,擴(kuò)展能力非常強(qiáng)。不過,也存在一些缺點(diǎn),其中最大的問題是SQL兼容性,解決之道在于持續(xù)構(gòu)建和完善自己的生態(tài),讓用戶更好的接受提供的用法。
另一類則是ShareStorage架構(gòu),共享存儲(chǔ)架構(gòu)并沒有改變查詢引擎和ACI這些基礎(chǔ)特性,可以做到100%的兼容性。當(dāng)然它也有缺點(diǎn),目前計(jì)算節(jié)點(diǎn)沒有提供寫擴(kuò)展能力,這個(gè)也是未來演進(jìn)的方向。
隨后,李志陽又關(guān)注到了Serverless數(shù)據(jù)庫的用戶群,主要面向中長尾用戶,他們對擴(kuò)展性的訴求并不強(qiáng),更多關(guān)注使用的便利性,兼容性是最重要一點(diǎn)。
因此,騰訊云優(yōu)先選擇了基于共享存儲(chǔ)架構(gòu)的數(shù)據(jù)庫產(chǎn)品TDSQL-C提供Serverless服務(wù)。
李志陽對TDSQL-C的總體架構(gòu)進(jìn)行了介紹:TDSQL-C是騰訊云基于共享存儲(chǔ)架構(gòu)的云原生數(shù)據(jù)庫,始于2017年。由于ToB業(yè)務(wù)對穩(wěn)定性的要求很高,在設(shè)計(jì)之初就定下了一個(gè)基本原則,即復(fù)用云上的成熟組件。
在計(jì)算層使用了騰訊維護(hù)的MySQL內(nèi)核分支-TXSQL,復(fù)用它的bugfix和新特性;存儲(chǔ)側(cè)則選擇了在騰訊內(nèi)部有十幾年歷史的云硬盤CBS,把CBS的核心存儲(chǔ)和硬盤邏輯進(jìn)行剖離,打造了統(tǒng)一存儲(chǔ)平臺(tái)-HiSTOR。
作為存儲(chǔ)底座,已適配了云硬盤CBS、云分布式文件系統(tǒng)CFS和數(shù)據(jù)庫TDSQL-C等多款產(chǎn)品,提供副本同步、故障自動(dòng)遷移、數(shù)據(jù)校驗(yàn)等一系列完善的數(shù)據(jù)安全保障能力,這正是TDSQL-C產(chǎn)品能夠穩(wěn)定運(yùn)行數(shù)年的重要基石。
另外,它還提供豐富的特性:備份/回檔速度,支持以MB為粒度并發(fā),速度達(dá)到GB/s;除了高性能的SSD,還有混存和EC版本,應(yīng)對歸檔類的業(yè)務(wù),提供更低成本的存儲(chǔ)。
除了上述兩個(gè)關(guān)鍵組件,我們還在計(jì)算側(cè)實(shí)現(xiàn)了物理復(fù)制,將innodb的redo日志準(zhǔn)實(shí)時(shí)同步到備機(jī),主從延時(shí)非常低(小于1毫秒);相比傳統(tǒng)數(shù)據(jù)庫先寫日志后異步刷臟,TDSQL-C只寫日志到存儲(chǔ),存儲(chǔ)側(cè)通過dbstore模塊將日志轉(zhuǎn)化數(shù)據(jù)。日志下沉的優(yōu)點(diǎn)很多,這里不做贅述。
由于騰訊云是國內(nèi)首家提供Serverless數(shù)據(jù)庫的廠家,李志陽主要對比了國外AWS的同類產(chǎn)品Aurora Serverless,并分析如何實(shí)現(xiàn)Serverless數(shù)據(jù)庫的三大特性。
1.自動(dòng)擴(kuò)縮容
上圖右側(cè)有一個(gè)共享的虛擬機(jī)池,規(guī)格不盡相同。Aurora Serverless的擴(kuò)容策略是從1核2G到4核8G逐步遞增規(guī)格。例如需要從1核2G擴(kuò)大到2核4G,則從池子里面找到2核4G的虛擬機(jī),將對應(yīng)的數(shù)據(jù)盤掛載到虛擬機(jī),并將訪問切到該虛擬機(jī),即可完成自動(dòng)擴(kuò)容。
有2個(gè)問題:1、假設(shè)用戶訪問本身需要4核8G,Aurora Serverless仍需要從1核2G開始逐步增加到4核8G,擴(kuò)容耗時(shí)偏長;2、由于選擇新的虛擬機(jī)擴(kuò)容,會(huì)導(dǎo)致BP失效,訪問將經(jīng)歷一次冷啟動(dòng)過程。
2.按使用量計(jì)費(fèi)
實(shí)現(xiàn)比較簡單,秒級粒度統(tǒng)計(jì)正在使用的規(guī)格,按照該規(guī)格計(jì)費(fèi)。
3.不使用不計(jì)費(fèi)
如果實(shí)例超過一段時(shí)間沒有訪問,則關(guān)閉計(jì)算節(jié)點(diǎn)。由于有數(shù)據(jù)庫代理節(jié)點(diǎn)作為接入層,如果用戶再有訪問請求,會(huì)先到達(dá)數(shù)據(jù)庫代理節(jié)點(diǎn)。此時(shí),代理節(jié)點(diǎn)按照上面提到的方法,從共享池里面找到對應(yīng)的虛擬機(jī)提供服務(wù)。對用戶而言,原有連接不受到影響,只是感覺到一次卡頓。缺點(diǎn)是引入了代理節(jié)點(diǎn),用戶需要為此付費(fèi);另外,恢復(fù)時(shí)長需要30秒,耗時(shí)也比較長。
(擴(kuò)容時(shí)BP失效導(dǎo)致的問題)
03.
TDSQL-C Serverless
了解完業(yè)界情況,李志陽開始介紹TDSQL-C Serverless。
上圖為總體架構(gòu),核心模塊為中控節(jié)點(diǎn)(Svls Scheduler)。
中控節(jié)點(diǎn)接收計(jì)算層采集的內(nèi)存/CPU/訪問情況等監(jiān)控?cái)?shù)據(jù),根據(jù)策略決定是否擴(kuò)縮容,啟停實(shí)例,以及按照計(jì)費(fèi)規(guī)則上報(bào)云控制臺(tái)計(jì)費(fèi)。
相對Aurora Serverless的區(qū)別在于暫停的應(yīng)對,TDSQL-C Serverless有Faker模塊,暫停計(jì)算節(jié)點(diǎn)時(shí)會(huì)把四層的vip:vport綁定到Faker端口,用戶請求過來后,識(shí)別為有效的MySQL協(xié)議,則通知中控模塊將實(shí)例重新拉起。其優(yōu)點(diǎn)在于用戶不需要為代理節(jié)點(diǎn)付費(fèi)。
隨后,李志陽詳細(xì)解釋了TDSQL-C Serverless如何滿足Serverless數(shù)據(jù)庫的三大特性。
1.TDSQL-C Serverless的自動(dòng)擴(kuò)縮容:
目標(biāo)是做到秒級的擴(kuò)縮容,并且期間對用戶是平滑的,無感知的。
以上圖為例子,用戶在購買時(shí)選擇最小規(guī)格為1核2G,最大規(guī)格為2核4G。
左邊為Aurora Serverless,矩形的縱坐標(biāo)是CPU,橫坐標(biāo)為內(nèi)存。初始為1核2G,當(dāng)業(yè)務(wù)訪問過來,把CPU用滿了,持續(xù)一段時(shí)間才擴(kuò)容到2核4G。
而右側(cè)的TDSQL-C Serverless,初始就給用戶提供最大CPU規(guī)格,內(nèi)存則從最小規(guī)格開始。假設(shè)用戶使用的CPU超過1核,并持續(xù)一段時(shí)間,將把內(nèi)存從2G擴(kuò)到4G。
可以看出,TDSQL-C Serverless的CPU資源不會(huì)受限,可以在設(shè)置的最大規(guī)格內(nèi)任意使用。優(yōu)點(diǎn)是用戶性能不受限,引入的缺點(diǎn)是可能整機(jī)出現(xiàn)滿負(fù)載。
由于TDSQL-C采用存算分離架構(gòu),一旦監(jiān)控到整機(jī)資源超過閾值,就進(jìn)行快速遷移。遷移其實(shí)就是在另外一臺(tái)相對空閑的機(jī)器重新拉起實(shí)例,秒級完成。在資源負(fù)載上可以精準(zhǔn)控制。
另外,現(xiàn)在云數(shù)據(jù)庫整機(jī)利用率偏低?;谶@兩點(diǎn),TDSQL-C Serverless可以很好應(yīng)對。
2.TDSQL-C Serverless的按使用量計(jì)費(fèi):
我們定義了一個(gè)算力單元CCU(TDSQL-C Compute Unit)=max{CPU,MEM/2,最小規(guī)格}。
其中,MEM/2的含義是,由于我們定義的規(guī)格CPU/內(nèi)存比都是1/2,內(nèi)存除以2相當(dāng)于把內(nèi)存換算成CPU。整體還是以CPU決定整個(gè)算力。我們通過計(jì)算每個(gè)小時(shí)CCU平均值給用戶計(jì)費(fèi)。
舉例說,假設(shè)用戶選擇最小最大規(guī)格為0.25核-4核,從圖中可以看到,業(yè)務(wù)高峰過來,一開始就能用到3核,右側(cè)CCU也會(huì)按照3核計(jì)費(fèi),能夠很好的應(yīng)對業(yè)務(wù)負(fù)載。
3.TDSQL-C Serverless的不使用無計(jì)費(fèi)
自動(dòng)啟停的邏輯比較簡單,只要10分鐘(用戶可配)內(nèi)監(jiān)測到?jīng)]有訪問就回收掉計(jì)算節(jié)點(diǎn),訪問回來就把節(jié)點(diǎn)重新拉起。
這里最核心的點(diǎn)是怎么做到快速恢復(fù),之前提過TDSQL-C是日志下沉的,存儲(chǔ)側(cè)接收到日志之后會(huì)源源不斷的回放,數(shù)據(jù)庫計(jì)算節(jié)點(diǎn)在啟動(dòng)的過程中,不需要像傳統(tǒng)數(shù)據(jù)庫那樣加載到日志然后重放,所以啟動(dòng)相對比較簡單和快速。
具體來說,VDL表示已經(jīng)持久化的日志點(diǎn)。在運(yùn)行階段會(huì)不斷異步持久化VDL(last-vdl)。Recovery階段,首先獲取last-vdl(checkpoint點(diǎn)),然后廣播所有相關(guān)的小表獲取大于等于last-vdl的所有日志段,最后通過敗者樹找到最后連續(xù)的日志點(diǎn)作為VDL。
整個(gè)過程都是并行化的,而且沒有數(shù)據(jù)重放,耗時(shí)小于100毫秒。另外,我們還對MySQL啟動(dòng)過程做了多處并行化處理,因此目前可以2秒內(nèi)恢復(fù)實(shí)例。
04.
展望
李志陽表示,TDSQL-C Serverless還在持續(xù)優(yōu)化,不久的將來會(huì)把冷啟動(dòng)從2秒縮短到百毫秒級別,更貼近云函數(shù)的啟動(dòng)時(shí)間。
同時(shí),為了進(jìn)一步降低用戶的存儲(chǔ)成本,如果很長時(shí)間沒有訪問,將數(shù)據(jù)轉(zhuǎn)存到對象存儲(chǔ)COS,屆時(shí)用戶只需要付COS的費(fèi)用即可。最后,歡迎大家多多使用TDSQL-C Serverless!