Facebook 欲用 Apollo 取代 MySQL 資料庫

自公司創辦以來,Facebook就一直在使用MySQL資料庫。大多數人對於讓這家社交網路網站得以支持來自20多億用戶的數據,又沒有任何障礙地順暢運行的優化方法感到很好奇。實際上,人們談論可擴展資料庫時,幾乎總是免不了提到Facebook。當然,近些年來,資料庫管理和增長這個小眾領域沒有比Facebook更重大的成功案例了。Facebook可能仍然使用MySQL資料庫作為其核心引擎,不過隨著時代的變遷,馬克?扎克伯格(MarkZuckerberg)親自領導的團隊正像大多數知名企業組織那樣逐漸青睞NoSQL資料庫。

偏向NoSQL資料庫

早在2014年,Facebook的代表傑夫?約翰遜(Jeff Johnson)在紐約QCon大會上宣布推出Apollo。這是Facebook自家版本的Paxos,類似NoSQL資料庫。這個新的NoSQL資料庫模型是一種分層存儲系統。這種高級資料庫中存儲的數據以碎片形式存在,就像區域伺服器中的HBase。然而,這種新型NoSQL模型的獨特之處在於其在線低延遲存儲系統。它不是一種面向文檔的數據系統。Apollo更側重數據結構的修改,讓用戶可以修改數據結構,沒有太多的前序(prologue)。數據的單個分片(shard)很小,大小在1位元組和1兆位元組之間。但數據的總大小可以達到10+拍位元組(PB)。它支持的伺服器數量可以從區區3台增加到將近1000台。

了解Apollo

存儲在Apollo資料庫中的數據以小碎片的形式存在。這每一個碎片有四個不同的部分。

Apollo的第一個部分基於Raft。它是一種直接來源於Raft的法定共識協議(quorum consensus protocol),而Raft是來自斯坦福大學的一種成熟穩定的領導者(leader)協議。這是Apollo資料庫系統的獨特之處。

Apollo資料庫中的第二個部分是資料庫裡面的存儲系統。該存儲系統受到了RocksDB的啟發。它是一種基於谷歌LevelDB的鍵/值存儲系統。Facebook可以輕鬆地處理該存儲系統,模擬其他數據結構,包括老式MySQL資料庫結構。值得注意的是,Apollo對於存儲的定製不是很友好。因此,Facebook的資料庫管理團隊正努力為其新的Apollo資料庫存儲系統添加MySQL資料庫支持的部分功能。

第三個部分是Facebook的原生API。任何資料庫API都是一個關鍵部分。對於Apollo而言,它是擁有read()和write()組件的Client API。用戶需要表示他們的前提條件。如果前提條件正確,Apollo將返回值(讀取或寫入)。你要記住:該資料庫中的所有數據都是碎片形式的。因此,Apollo資料庫裡面任何分片層面的操作都是原子級別的。你始終可以把許多條件與讀取結合起來,創建新的操作前提條件。

第四個部分是容錯狀態機(FTSM)。這是Apollo資料庫中系統代碼的一部分。每個分片都有單獨的FTSM。不妨這樣來考慮:如果有牽涉三台不同機器的分片,它們都將同時執行同樣的代碼。它在大型資料庫環境中有著巨大優勢。如果一個代碼突然死亡,其他分片將以可接受的適當順序繼續運行同樣的代碼,並被所有節點所接受。

雖然Apollo成為Facebook新的寵兒掀起了巨大的動靜,但到目前為止Facebook沒有在生產環境中使用它。相反,該公司期待取代Memcached的一些使用場景。Facebook高度依賴內存緩存存儲系統,這已不是什麼秘密。坊間傳聞稱,Apollo成了從Facebook到iOS設備和運營商的出站消息的新型隊列系統。它很適合數據分析。此外,它將提升數據提取的速度和準確性。

為何Apollo會存在?

Facebook使用狀態機主要用於負載均衡、分片生成及管理、協調跨機器的數據事務以及數據遷移。但是這個過程不夠盡善盡美。這些狀態機可以向遠程伺服器發送RPC請求。除此之外,每當用戶需要對數據的持續狀態進行更改,他們需要經過Raft,並且讓其他所有伺服器都要同意。

Facebook眼下在使用什麼?

Apollo仍在「建設中」,它遠遠談不上是Facebook的日常資料庫。因此目前,這個社交網路巨頭在使用添加了大量修改和附件的MySQL資料庫,為每天數量龐大的數據傳輸和數據存儲提供方便。你不能指望一家年收入數十億美元的公司將MySQL直接拿來使用!它對IO子系統作了一些變動,包括下列新特性:

innodb_read_io_threads,innodb_write_io_threads——這設置了後台IO線程的數量。

innodb_io_capacity——這設置了每台伺服器的IO容量,以確定後台IO限制。

innodb_max_merged_io——這一個設置了毗鄰IO請求的最大數量。通常,下一批IO請求會在稍後合併成大得多的IO請求。

不像Apollo,Facebook目前依賴MySQL資料庫作為鍵/值存儲系統,因而能夠在一系列邏輯實例之間隨機分布數據。你可以在伺服器的物理節點上找到這些。當前伺服器的所有負載均衡工作只出現在物理節點層面。

最令人驚訝的傳聞稱,Facebook擁有大約1800台MySQL伺服器,內部卻只有三名資料庫管理員(DBA)。這似乎是一項不可能完成的任務!即使Facebook果真只有三名DBA來管理整個數據集,要是沒有MySQL資料庫,那也是永遠不可能的。MySQL簡單而強大,Facebook或其他任何類似的社交網路網站多年後才會用新的NoSQL伺服器替代全日運行的MySQL伺服器。


推薦閱讀:

什麼是資料庫的一致性?一致性弱意味著什麼?NoSQL 的弱一致性又為什麼是可以被接受的?
個人網站,資料庫如何設計存儲富文本文章比較好?
個人開發web應用,從需求設計,界面設計,資料庫設計,API設計等,好的開發流程是怎麼樣的?
SF 講堂「超越find():使用MongoDB聚合框架探索數據」要開播啦
什麼情況下,需要使用分散式資料庫?

TAG:数据库 | MySQL | Facebook |