互聯(lián)網(wǎng)的迅速發(fā)展帶來了新的數(shù)據(jù)應(yīng)用場景,和傳統(tǒng)的數(shù)據(jù)存儲有別的是,互聯(lián)網(wǎng)上的應(yīng)用對于數(shù)據(jù)的可用性和系統(tǒng)的擴(kuò)展性具有很高的要求。一般的互聯(lián)網(wǎng)應(yīng)用都要求能夠做到7天x24小時的不間斷服務(wù)器租用服務(wù),達(dá)不到的話則會帶來較差的用戶體驗(yàn)。熱門的應(yīng)用往往會在短時間內(nèi)經(jīng)歷急劇的用戶數(shù)量增長,這就要求系統(tǒng)具有良好的可擴(kuò)展性。在互聯(lián)網(wǎng)的應(yīng)用中,為了達(dá)到好的可擴(kuò)展性,常常會采用NoSQL存儲方式。但是從應(yīng)用程序的構(gòu)建方面來看,傳統(tǒng)的關(guān)系型數(shù)據(jù)庫又有著NoSQL所不具備的優(yōu)勢。Google設(shè)計(jì)和構(gòu)建了用于互聯(lián)網(wǎng)中交互式服務(wù)的分布式存儲系統(tǒng)Megastore,該系統(tǒng)成功的將關(guān)系型數(shù)據(jù)庫和NoSQL的特點(diǎn)與優(yōu)勢進(jìn)行了融合。本節(jié)將向大家介紹該系統(tǒng),著重突出Megastore設(shè)計(jì)與構(gòu)建過程中的核心思想和技術(shù)。
設(shè)計(jì)目標(biāo)及方案選擇
Megastore的設(shè)計(jì)目標(biāo)很明確,那就是設(shè)計(jì)一種介于傳統(tǒng)的關(guān)系型數(shù)據(jù)庫和NoSQL之間的存儲技術(shù),盡可能達(dá)到髙可用性和高可擴(kuò)展性的統(tǒng)一。為了達(dá)到這一目標(biāo),設(shè)計(jì)團(tuán)隊(duì)采用了如下的兩種方法:
(1)針對可用性的要求,實(shí)現(xiàn)了個同步的、容錯的、適合遠(yuǎn)距離傳輸?shù)膹?fù)制機(jī)制。 在方案的選擇和實(shí)現(xiàn)過程中Megastore團(tuán)隊(duì)研究和比較了一些傳統(tǒng)的遠(yuǎn)距離復(fù)制技術(shù),最終確定了引入Paxos算法并對其做出一定的改進(jìn)以滿足遠(yuǎn)距離同步復(fù)制的要求。
(2)針對可擴(kuò)展性的要求,設(shè)計(jì)團(tuán)隊(duì)借鑒了數(shù)據(jù)庫中數(shù)據(jù)分區(qū)的思想,將整個大的數(shù)據(jù)分割成很多小的數(shù)據(jù)分區(qū),每個數(shù)據(jù)分區(qū)連同它自身的日志存放在NoSQL數(shù)據(jù)庫中,具體來說就是存放在Bigtable中。
圖2-21顯示了數(shù)據(jù)的分區(qū)和復(fù)制。在Megastore中,這些小的數(shù)據(jù)分區(qū)被稱為實(shí)體組集(Entity Groups)。每個實(shí)體組集包含若干的實(shí)體組(Entity Group,相當(dāng)于分區(qū)中表 的概念),而一個實(shí)體組中又包含很多的實(shí)體(Entity,相當(dāng)于表中記錄的概念)。從圖中還可以看出單個實(shí)體組支持ACID語義,以上這些都體現(xiàn)了關(guān)系型數(shù)據(jù)庫的特征。

實(shí)體組集之間只具有比較松散的一致性。每個實(shí)體組都通過復(fù)制技術(shù)在數(shù)據(jù)中心中保 存若干數(shù)據(jù)副本,這些實(shí)體組及其副本都存儲在NoSQL數(shù)據(jù)庫(Bigtable)中。