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