Facebook是怎么做MySQL備份的?
Facebook的用戶每天創造大量的數據,為了確保數據可靠的存儲,我們每天進行數據備份.我們通過將原來的邏輯備份改成定制化的物理備份,顯著地提升了備份的速度(不增加體積的情況下).
從mysqldump到Xtrabackup
我們使用mysqldump來進行每日的數據庫備份,mysqldump對數據進行邏輯備份,就像應用訪問數據庫那樣,mysqldump以SQL語句的方式從數據庫中讀取一張張表,將表結構和數據轉保存到文本文件.mysqldump最大的問題是速度太慢(對于我們的一些大的數據庫,通常要花24小時,甚至更久),并且以SQL語句的方式讀取數據可能造成磁盤的隨機讀,這就會造成主機的load增大,影響性能.對于時間太長,我們可以跑多個實例來并發的做備份,這能縮短備份的時間,但是會造成更多的load,更影響主機的性能.
另外一個可行的備份方式是進行物理備份(我們稱之為二進制備份,binary backup),通過操作系統層面,讀取數據庫磁盤文件,而非通過SQL語句.這樣的話在備份的過程中,數據不能像SQL讀取的時候保持事務上一致的.只有當備份的數據文件在數據庫里復原了,他們才又一致了,這類似于數據庫down掉之重啟一樣.
我們通過修改增強Xtrabackup來滿足我們額外的需求:
1.支持快速的表級還原
2.增強全量和增量備份
3.支持混合增量備份
Xtrabackup支持增量備份,也就是備份自上次全量備份后改變的數據.這樣我們就能夠減少備份的空間(比如每天一次增量備份,每周一次全量備份).Xtrabackup也支持多級增量備份,不過我們不使用,避免復雜.
1.表級還原
我們寫了一個PHP腳本,來從二進制備份文件中讀取并還原指定的表.當前,這個腳本還不能自己從備份文件中讀取信息創建表結構,因此必須事先準備好一個對應的空的表.我們對Xtrabackup也做了相應的修改來支持這個工具.這個修改就是支持Xtrabackup導入導出單表.單表的還原比全量還原快得多,因為只需要從文件中讀取相應的表的信息.
2.調整全量和增量復制
fb是Xtrabackup早期的增量備份功能的用戶,起初對于一些有大量表的數據庫,Xtrabackup的增量備份不起作用.后來我們和percona一起解決了這些問題.
Xtrabackup只有本地增量備份功能,也就是說增量備份的文件必須要和MySQL在同臺主機上.我們修改使之支持遠程增量備份,也就是通過類似管道的方式將備份的數據同時發送到遠程主機,.如果先在本地做增量備份,然后通過網絡傳到遠程主機,對我們來說是不可取的,因為會大大增加本地的寫操作.
Xtrabackup以1MB為1個chunk來讀取數據庫文件,我們發現使用8MB時,能夠使增量備份的速度快一倍,使全量備份快40%.
3.讓增量備份成為真正的增量
Xtrabackup的增量備份讀取數據庫的每個page,來判斷哪些page改變了.我們創建了一個page追蹤器,通過讀取事務日志,并且通過每個表的bitmap,來追蹤修改過的page,.這樣我們就能很好的追蹤哪些page改變了哪些沒變,我們就可以只讀取那些改變過的page.我們稱這位真正的增量備份.
不過諷刺的是,我們發現這種真正的增量備份比普通的增量備份反而來的慢..這是因為普通的增量備份用8MB的chunk來讀取文件,而真正的增量備份讀取文件的大小是不定的,從16KB(INNODB中一個page的大小)到8MB,這取決于有多少連續的page是被修改過的.因此在我們的很多場景下(自上次全量備份后大概10%-30%的page修改了),真正的增量備份比普通的增量備份花了更多的IO調用.
因為我們進行了改進,有了一種混合增量的備份,通過避免讀取未修改的page來減少IO次數,在我們的場景下,這種混合增量備份減少了20%-30%的IO,IO的大小從16KB到8MB不等.
下表描述了使用上述改進的方法來處理大概750GB數據時產生的不同結果.由于mysqldump速度的原因,mysqldump只在少數幾個數據庫上跑,我們使用gzip來對mysqldump的結果進行壓縮,很慢,但是壓縮率很高.
QPress用來壓縮二進制備份,它比gzip快多了,但是壓縮效率更低.由于我們經常作增量備份,較少作全量備份,整個二進制備份所需要的空間和mysqldump所需要的空間還是差不多的.
原文意譯:http://www.facebook.com/note.php?note_id=10150098033318920
【編輯推薦】
- MySQL技巧:結合相關參數 做好Limit優化
- 使用Limit參數實現MySQL查詢優化
- MySQL數據庫的優化(上)單機MySQL數據庫的優化
- MySQL數據庫的優化(下)MySQL數據庫的高可用架構方案
- MySQL觸發器如何正確使用