天天看點

Facebook如何實作PB級别資料庫自動化備份

他們沒有采用大量前載(front-loaded)測試,而是強調快速檢測失敗,并且進行快速、自動化糾正。部署幾百個資料庫伺服器,隻需很少人力幹預。使用下面的三個措施,他們做到了有節奏的增長,同時具備支援上十億使用者的靈活性。

措施1:二進制日志和mysqldump

第一道防線稱為“措施1”,或“機架”備份(rack backup),簡稱rbu。在每個資料庫機架上,不論其類型為何,都有兩個rbu存儲伺服器。以rbu作為資料庫伺服器放在同一個機架中,這可以保證最大的帶寬和最小的延遲,它們同時可以作為緩存,在備份的下個措施使用。

在rbu上儲存同步的二進制日志很重要:如果一個主資料庫伺服器離線,該伺服器上的使用者将無法更新狀态或是上傳照片。出現問題後,他們需要保證修複時間越短越好。有可用的二進制日志,就能讓他們在數秒内啟動另一個資料庫作為主資料庫。由于rbu中有秒級的二進制日志,即使某個舊主資料庫完全不可用,也沒有關系,隻要利用将記錄下的事務恢複到上一個備份中即可完成立即恢複。

rbu伺服器的第二個工作是執行傳統備份。mysql備份有兩種方式:二進制和邏輯(mysqldump)。facebook使用邏輯備份,因為它與版本無關,提供更好的資料完整性,更緊湊,恢複起來更省事。不過,當為某個資料庫建構全新複制時,他們仍然使用二進制拷貝。

mysqldump的一個主要好處是:磁盤上的資料損壞不會影響到備份中。如果磁盤某個扇區出現問題,或是寫入錯誤,innodb頁面校驗和就會出錯。在組合備份流時,mysql會從記憶體中讀取正确的内容,或是去磁盤讀取,然後遇到錯誤的校驗和,停止備份(以及資料庫程序)。mysqldump的問題是:污染用來緩存innodb塊的lru緩存。不過,新版本的mysql中,會将lru插入操作從掃描時放到緩存結束。

對在自己權限範圍内的所有資料庫,每個rbu都有一個夜間備份。盡管有着天量級别的資料,facebook的團隊還是可以在幾個小時内完成對所有資料的備份。

如果rbu失敗,自動化軟體會将其職責配置設定給同一叢集中其他系統。當它恢複上線後,職責會自動傳回到最初的rbu主機。

facebook團隊不會過分擔心單個系統的資料保留問題,因為他們有措施2。

措施2:hadoop dfs

在每個備份和二進制日志收集完成後,他們會馬上将其複制到他們的大型定制化hadoop叢集中。這些叢集是非常穩定的複制資料集,并有固定的保留時間。因為磁盤大小增長很快,較老的rbu可能不足以儲存一到兩天的備份。不過他們會按需要增長hadoop叢集,同時不需要擔心底層硬體情況。hadoop的分布式特性讓他們有足夠帶寬,完成快速資料恢複。

不久,他們會把非實時資料分析放到這些hadoop叢集中。這可以降低資料庫中非關鍵讀的次數,讓facebook網站的響應速度更快。

措施3:長期存儲

監控

除常用的系統監控外,他們還會捕捉很多特定的統計資料,比如binlog集合延遲、系統容量等等。

為備份失敗打分,是他們最有價值的工具。因為facebook的資料庫和同時運作的維護任務量級,錯過某些備份也不奇怪。廣泛的失敗和多日沒有成功的單個備份,這都是他們要注意的重點。是以,某個錯過備份的得分會随着時間呈指數級增長,這些得分的不同聚合,讓團隊能對備份的整體健康度有一個有效而快速的了解。

比如,在一天内,某個資料錯失一次備份,得1分,一天錯失50次備份,就是50分。但在三天内的一次資料庫錯失,就是27分(3的3次幂),三天内50次,這是很嚴重的問題,得分就是1350(50乘以3的3次幂)。這會在他們的監控圖上出現一個巨大的波峰,團隊會馬上對其采取行動。

恢複

在系統管理者中有句老話:“如果你沒有測試過你的備份,就等于沒有備份。”

是以,facebook團隊建構了一個測試系統,會持續地從措施2開始,将資料恢複到測試伺服器上。恢複完成後,他們會執行多次資料完整性檢查。如果有任何反複出現的問題,系統就會報警,提醒相關人員關注、稽核。該系統可以發現所有問題,包括mysql的bug,到備份過程中的纰漏,并可以讓他們更靈活地應對備份環境中的變化。

他們建構了一個名為orc(orc恢複協調器的遞歸縮寫)的系統,工程師如何需要恢複他們所用工具的資料庫的過去版本,就可以以自服務方式使用該系統恢複資料。對于快速開發來說還是挺友善的。

在結尾,eric barrett說道:

備份不是最迷人的工程工作。它們即是技術活,又是重複性的,如果一切正常,沒人會注意。它們也是跨學科和團隊的,需要懂得系統、網絡和軟體等多方面的專業知識。但是,確定你的記憶和聯系安全無誤,這是無比重要的事情,而且到最後,也是充滿回報的事情。

有網友問到:

在不運作mysqld的rbu上,你們如何完成二進制日志的流傳送?什麼是模拟從程序?
我們使用mysqlbinlog的–never–選項,并有一個用python開發的小包裝程式,會監控并保證mysqlbinlog運作成功。

<b>原文釋出時間為:2013-05-15</b>

<b>本文來自雲栖社群合作夥伴“linux中國”</b>