2004年成立的Facebook很快便占據(jù)了社交網(wǎng)站的榜首,智能手機(jī)出現(xiàn)標(biāo)志著互聯(lián)網(wǎng)全面轉(zhuǎn)向手機(jī)端,在移動(dòng)互聯(lián)網(wǎng)時(shí)代Facebook的APP也同樣霸占著社交APP排名榜首。有很多網(wǎng)友就非常好奇Facebook使用哪個(gè)數(shù)據(jù)庫(kù)來(lái)存儲(chǔ)龐大的用戶資料?通過(guò)了解社交網(wǎng)絡(luò)的老大哥Facebook的數(shù)據(jù)庫(kù)演變,從中吸取寶貴的經(jīng)驗(yàn)教訓(xùn)。
Facebook中的個(gè)人資料不僅僅是姓名、Email、興趣等屬性列表,而是一個(gè)非常豐富的社交圖譜,包括了親人/朋友、群組、喜歡、分享等等。剛開(kāi)始的Facebook社交頁(yè)面非常簡(jiǎn)單,采用PHP來(lái)構(gòu)建應(yīng)用程序,MySql作為長(zhǎng)期使用數(shù)據(jù)庫(kù),采用Memcache作為后備緩存支持。PHP應(yīng)用程序可以直接訪問(wèn)MySql和Memcache,中間沒(méi)有數(shù)據(jù)抽象層。
這種簡(jiǎn)單的數(shù)據(jù)庫(kù)架構(gòu)在訪問(wèn)量很少的情況下優(yōu)勢(shì)確實(shí)非常明顯,但Facebook從2005年開(kāi)始用戶量就飛速增長(zhǎng),最終這種數(shù)據(jù)架構(gòu)導(dǎo)致了開(kāi)發(fā)人員敏捷性急劇下降。因?yàn)楣こ處熜枰褂脙煞N截然不同的數(shù)據(jù)模型來(lái)對(duì)數(shù)據(jù)進(jìn)行處理,MySql存儲(chǔ)主從對(duì)集合、Memcache則用于存儲(chǔ)和提供派生的平面鍵值的SQL查詢,MySql和Memcache相互協(xié)作成為了一個(gè)很大的難題,開(kāi)發(fā)者使用數(shù)據(jù)庫(kù)前首先要獲得關(guān)于這兩個(gè)數(shù)據(jù)庫(kù)如何相互協(xié)作的復(fù)雜知識(shí)。
Facebook的數(shù)據(jù)量暴增也使得MySql的缺點(diǎn)凸顯出來(lái),MySql的單體架構(gòu)很早強(qiáng)制應(yīng)用程序級(jí)的分片,應(yīng)用程序則需要跟著哪個(gè)MySql實(shí)例復(fù)雜存儲(chǔ)哪個(gè)用戶的配置文件,數(shù)據(jù)量暴增之后,開(kāi)發(fā)和操作的復(fù)雜程度就呈現(xiàn)指數(shù)級(jí)增長(zhǎng)。多數(shù)據(jù)中心、異地冗余復(fù)制也成為了MySql一個(gè)非常關(guān)鍵性的問(wèn)題,主從異步復(fù)制轉(zhuǎn)移時(shí),最近的數(shù)據(jù)無(wú)法避免不會(huì)丟失。
于是Facebook自2009年開(kāi)始自研構(gòu)建小而美的存儲(chǔ)系統(tǒng)TAOTAO可以將facebook現(xiàn)有成百上千的Mysql主從對(duì)轉(zhuǎn)化成一個(gè)高度可擴(kuò)展、自動(dòng)分片、基于地理分布式的數(shù)據(jù)庫(kù)集群。TAO可以將分片遷移或者克隆到同一個(gè)集群的不同服務(wù)器,這樣就能平衡負(fù)載并消除負(fù)載峰值。
如果一次分片更新后、第二次分片更新前出現(xiàn)故障,TAO的異步修復(fù)作業(yè)就會(huì)清除掛起的關(guān)聯(lián)。
使用TAO架構(gòu)之后本質(zhì)上還是沒(méi)有放棄MySQL,因?yàn)楫?dāng)時(shí)的MySQL和其他數(shù)據(jù)庫(kù)都無(wú)法單獨(dú)解決爆炸式數(shù)據(jù)量的增長(zhǎng)。TAO本質(zhì)上只是創(chuàng)建了一個(gè)自定義數(shù)據(jù)庫(kù)的查詢層,這層抽象了底層分片的MySql數(shù)據(jù)庫(kù)。
分布式SQL應(yīng)運(yùn)而生很多人都喜歡SQL普遍性以及靈活性,都不愿意放棄SQL的情況下對(duì)它進(jìn)行擴(kuò)展。雖然很多企業(yè)沒(méi)有Facebook這樣大規(guī)模數(shù)據(jù)增長(zhǎng)的問(wèn)題,也同樣希望按照自己的意愿來(lái)拓展SQL數(shù)據(jù)庫(kù)。
第一波分布式SQL數(shù)據(jù)庫(kù)叫做NewSql,包括了Clustrix、NuoDB、Citus、Vitess等等,但這些都不足以從根本上簡(jiǎn)化開(kāi)發(fā)人員、運(yùn)營(yíng)的體驗(yàn),反而阻礙了開(kāi)發(fā)人員。于是就有了第二波分布式SQL數(shù)據(jù)庫(kù),靈感源于Google的Spanner,數(shù)據(jù)庫(kù)層內(nèi)置了大規(guī)模可擴(kuò)展性和全球數(shù)據(jù)分布,而不需要像之前Facebook必須內(nèi)置在應(yīng)用程序?qū)又小?/p>總結(jié)
Facebook、Google等等這樣的科技巨頭的數(shù)據(jù)庫(kù)擴(kuò)展的歷程,都是值得很多人學(xué)習(xí)和借鑒的。TAO保留了MySql的現(xiàn)有投資,但應(yīng)用工程師失去了使用SQL的能力。Google則創(chuàng)建了Spanner,走了一條不同的道路創(chuàng)建了一個(gè)全新的SQL數(shù)據(jù)庫(kù)。
以上個(gè)人淺見(jiàn),歡迎批評(píng)指正。
認(rèn)同我的看法,請(qǐng)點(diǎn)個(gè)贊再走,感謝!喜歡我的,請(qǐng)關(guān)注我,再次感謝!