Oceanbase一個(gè)千億級(jí)海量數(shù)據(jù)庫(kù)
有一些同學(xué)問(wèn)我,Oceanbase的創(chuàng)新點(diǎn)在哪里? 從大學(xué)的數(shù)據(jù)結(jié)構(gòu)課程可以知道,數(shù)據(jù)量比較大時(shí),有兩種數(shù)據(jù)結(jié)構(gòu)很常用:哈希表和B+樹(shù),分布式系統(tǒng)也是類(lèi)似的。如下圖:

Amazon的系統(tǒng)實(shí)現(xiàn)了一個(gè)分布式哈希表,而Google Bigtable, Yahoo PNUTS,Microsoft SQL Azure實(shí)現(xiàn)了一顆分布式B+樹(shù)。分布式哈希表實(shí)現(xiàn)相對(duì)簡(jiǎn)單,但只支持隨機(jī)讀取;而分布式B+樹(shù)支持范圍查詢(xún),但實(shí)現(xiàn)比較復(fù)雜,主要有兩個(gè)難點(diǎn):
1, 狀態(tài)數(shù)據(jù)的持久化和遷移。更新操作改變系統(tǒng)的狀態(tài),數(shù)據(jù)庫(kù)系統(tǒng)中更新操作首先以事務(wù)提交日志(MySQL稱(chēng)為binlog, NOSQL稱(chēng)為commit log)寫(xiě)入到磁盤(pán),為了保證可靠性,commit log需要復(fù)制多份并保證它們之間的一致性。另外,機(jī)器宕機(jī)時(shí)需要通過(guò)commit log記錄的狀態(tài)修改信息將服務(wù)遷移到集群中的其它節(jié)點(diǎn)。
2, 子表的分裂和合并。B+樹(shù)實(shí)現(xiàn)的難點(diǎn)在于樹(shù)節(jié)點(diǎn)的分裂與合并,在分布式系統(tǒng)中,數(shù)據(jù)被順序劃分為大小在幾十到幾百M(fèi)B大小的數(shù)據(jù)范圍,一般稱(chēng)為子表,相當(dāng)于B+樹(shù)結(jié)構(gòu)中的葉子節(jié)點(diǎn)。由于每個(gè)子表在系統(tǒng)中存儲(chǔ)多份,需要保證多個(gè)副本之間的分裂點(diǎn)是一致的。由于子表在分裂的同時(shí)也有更新操作,保證多個(gè)副本之間一致是比較困難的。
對(duì)于這兩個(gè)問(wèn)題,不同的系統(tǒng)有不同的解決方法:
1, 狀態(tài)維持。Google Bigtable將狀態(tài)數(shù)據(jù)寫(xiě)入到GFS中,由GFS提供可靠性保證,但GFS本身是一個(gè)巨大的工程;Yahoo PNUTS將狀態(tài)數(shù)據(jù)寫(xiě)入到分布式消息中間件,Yahoo內(nèi)部稱(chēng)為Yahoo Message Broker;Microsoft SQL Azure直接通過(guò)網(wǎng)絡(luò)將數(shù)據(jù)復(fù)制到多機(jī),由于一臺(tái)機(jī)器服務(wù)多個(gè)子表,這些子表的副本可能分布在整個(gè)集群中,因此,任何兩臺(tái)機(jī)器都可能建立數(shù)據(jù)復(fù)制的網(wǎng)絡(luò)通道,需要處理與這些通道有關(guān)的異常情況。
2, 子表分裂。由于底層有GFS保證可靠性,Google Bigtable設(shè)計(jì)時(shí)保證每一個(gè)子表同時(shí)只被一臺(tái)機(jī)器(Tablet Server)服務(wù);Yahoo PNUTS通過(guò)引入復(fù)雜的兩節(jié)點(diǎn)提交(Two-phase commit)協(xié)議協(xié)調(diào)多個(gè)副本之間的一致性,使得他們的分裂點(diǎn)相同;Microsoft SQL Azure干脆不支持子表分裂,犧牲一部分?jǐn)U展性從而簡(jiǎn)化系統(tǒng)設(shè)計(jì)。
淘寶Oceanbase設(shè)計(jì)之初對(duì)淘寶的在線(xiàn)存儲(chǔ)需求進(jìn)行分析發(fā)現(xiàn):淘寶的數(shù)據(jù)總量比較大,未來(lái)一段時(shí)間,比如五年之內(nèi)的數(shù)據(jù)規(guī)模為百TB級(jí)別,千億條記錄,另外,數(shù)據(jù)膨脹很快,傳統(tǒng)的分庫(kù)分表對(duì)業(yè)務(wù)造成很大的壓力,必須設(shè)計(jì)自動(dòng)化的分布式系統(tǒng);然而,在線(xiàn)存儲(chǔ)每天的修改量很小,大多數(shù)情況下單機(jī)的內(nèi)存就能存放下。因此,我們采用將動(dòng)態(tài)數(shù)據(jù)和靜態(tài)數(shù)據(jù)分離的辦法。動(dòng)態(tài)數(shù)據(jù)的數(shù)據(jù)量小,采用集中式的方法解決,這樣,狀態(tài)數(shù)據(jù)維持從一個(gè)分布式的問(wèn)題轉(zhuǎn)化為單機(jī)的問(wèn)題;靜態(tài)數(shù)據(jù)的數(shù)據(jù)量大,采用分布式的方法解決,因?yàn)殪o態(tài)數(shù)據(jù)基本不變,實(shí)現(xiàn)時(shí)不需要復(fù)雜的線(xiàn)程同步機(jī)制,另外,保證靜態(tài)數(shù)據(jù)的多個(gè)副本之間一致性是比較容易的,簡(jiǎn)化了子表的分裂和合并操作。通過(guò)這樣的權(quán)衡,淘寶Oceanbase以一種很簡(jiǎn)單的方式滿(mǎn)足了未來(lái)一段時(shí)間的在線(xiàn)存儲(chǔ)需求,并且還獲得了一些其它特性,如高效支持跨行跨表事務(wù),這對(duì)于淘寶的業(yè)務(wù)是非常重要的。另外,我們之所以敢于做這樣的權(quán)衡,還有一個(gè)重要的原因:我們內(nèi)部已經(jīng)思考了很多關(guān)于動(dòng)態(tài)數(shù)據(jù)由集中式變?yōu)榉植际降姆桨?,即使我們?duì)需求估計(jì)有些偏差,也可以很快修改原有系統(tǒng)進(jìn)一步提高可擴(kuò)展性。
【編輯推薦】