在這篇文章中,OceanBase的掌門人陽(yáng)振坤 (@阿里正祥)解釋了為什么OceanBase可以把一天的修改增量置于內(nèi)存,以及為什么OceanBase沒(méi)有做成全內(nèi)存數(shù)據(jù)庫(kù)(如VoltDB,MemSQL)。
早在2010年5月,在OceanBase立項(xiàng)前,項(xiàng)目團(tuán)隊(duì)對(duì)許多數(shù)據(jù)庫(kù)應(yīng)用進(jìn)行了分析,讓我們看幾個(gè)例子:
1. 全國(guó)人口數(shù)據(jù)庫(kù)
全國(guó)的人口數(shù)據(jù)庫(kù)很大,目前活著的人口有14億條左右的記錄,加上已經(jīng)去世的人數(shù)量就更多,但每天修改的記錄主要是出生(目前每天5萬(wàn)左右),死亡(目前每天2~3萬(wàn))和其他修改(如人口遷移、錯(cuò)誤修正等),每天增刪改的記錄,可能不到記錄總數(shù)的1%。
2. 金融機(jī)構(gòu)的交易庫(kù)
交易庫(kù)是金融機(jī)構(gòu)(支付寶,銀行等)的交易流水記錄,主要是新增記錄,但如果考慮到金融機(jī)構(gòu)通常在線上保存1年或以上的交易記錄,那么一天內(nèi)增刪改的記錄就只是一個(gè)很小的比例,即使只在線上保存3個(gè)月的交易記錄,每天增刪改的記錄也只占總記錄的百分之幾。
3. 金融機(jī)構(gòu)的賬務(wù)庫(kù)
賬務(wù)庫(kù)保存著金融機(jī)構(gòu)(支付寶,銀行等)的客戶的賬務(wù)余額,可能有幾千萬(wàn)甚至幾億條記錄,但一天內(nèi)增刪改的記錄則是那些當(dāng)天有付款收款等交易,或者有其他特殊情況(例如銷戶等)的賬戶,因此也是一個(gè)很小的比例。
上述的例子和對(duì)其他數(shù)據(jù)庫(kù)應(yīng)用的分析讓OceanBase項(xiàng)目團(tuán)隊(duì)發(fā)現(xiàn)了一個(gè)隱藏在數(shù)據(jù)庫(kù)背后的事實(shí):即盡管數(shù)據(jù)庫(kù)本身的數(shù)據(jù)量越來(lái)越大,記錄數(shù)越來(lái)越多,但每天的增刪改數(shù)據(jù)量并不大,僅僅只占數(shù)據(jù)庫(kù)總量一個(gè)很小的比例:
數(shù)據(jù)庫(kù)每天增刪改的數(shù)據(jù)量只占總量一個(gè)很小的比例
很多數(shù)據(jù)庫(kù)每次只修改幾十到幾百字節(jié),按平均100字節(jié)計(jì)算,每天10億次寫,其總修改量大約是100GB,單個(gè)服務(wù)器內(nèi)存就可以容納;即使每筆寫事務(wù)4KB,每天10億筆寫事務(wù),總修改量大約4TB,16臺(tái)256GB內(nèi)存或者8臺(tái)512GB內(nèi)存服務(wù)器也可以支撐(不考慮熱備等因素)。
根據(jù)上述分析,OceanBase把修改增量(包括增刪改,下同)置于內(nèi)存,每天在業(yè)務(wù)的相對(duì)低谷期再合并到基線數(shù)據(jù)中并釋放內(nèi)存(參見(jiàn)下篇:“錯(cuò)峰合并消除OceanBase每日合并對(duì)性能的影響”),從而使得OceanBase徹底消除了寫事務(wù)的隨機(jī)寫磁盤,極大地提升了性能。
為了支持上述特性,OceanBase采取了針對(duì)性的設(shè)計(jì):
1. 設(shè)計(jì)實(shí)現(xiàn)了內(nèi)存B樹(shù)以保存和讀寫修改增量
支持記錄的插入、刪除和修改以及單項(xiàng)和范圍讀
2. 內(nèi)存中數(shù)據(jù)只保存增量本身而不是對(duì)應(yīng)的數(shù)據(jù)頁(yè)
很多數(shù)據(jù)庫(kù)單個(gè)表的單個(gè)寫事務(wù)平均大小僅僅100字節(jié)左右,而數(shù)據(jù)庫(kù)的數(shù)據(jù)頁(yè)常常是8KB,這意味著8KB/100B=80倍的放大,因此如果OceanBase像其他商業(yè)和開(kāi)源數(shù)據(jù)庫(kù)一樣用數(shù)據(jù)頁(yè),就需要把內(nèi)存增加80倍。
3. 主庫(kù)備庫(kù)(一主多備)為active-active而非active-standby模式
修改增量全部置于內(nèi)存,雖然極大提升了性能,但也帶來(lái)了風(fēng)險(xiǎn),即一旦服務(wù)器宕機(jī),恢復(fù)時(shí)間可能比較長(zhǎng),為了克服這一風(fēng)險(xiǎn),OceanBase沒(méi)有像其他商業(yè)/開(kāi)源數(shù)據(jù)庫(kù)一樣把備庫(kù)做成standby模式,而是active模式,即主庫(kù)故障后備庫(kù)可以瞬間升級(jí)到主庫(kù)并繼續(xù)提供服務(wù)。
盡管全內(nèi)存的數(shù)據(jù)庫(kù)性能更高,但出于成本,特別是性價(jià)比的考慮,OceanBase沒(méi)有采用全內(nèi)存設(shè)計(jì):
1. 數(shù)據(jù)庫(kù)中大部分?jǐn)?shù)據(jù)是冷數(shù)據(jù),以80/20法則為例,80%的訪問(wèn)由20%的數(shù)據(jù)提供,把其余80%數(shù)據(jù)跟頻繁訪問(wèn)的20%數(shù)據(jù)同等對(duì)待(置于內(nèi)存),顯然不經(jīng)濟(jì);
2. 單臺(tái)服務(wù)器的內(nèi)存容量只有磁盤(SSD)容量的1/10~1/20,如果采用全內(nèi)存設(shè)計(jì),就意味著10~20倍數(shù)量的服務(wù)器。
如果你對(duì)OceanBase感興趣,可以關(guān)注OceanBase的微博,或者上GitHub OceanBase頁(yè)面了解更多。