xtrabackup備份原理及流式備份應用
目錄
- xtrabackup備份原理及流式備份應用
- 0. 參考文獻
- 1. xtrabackup 安裝
- 2. xtrabackup 備份和恢復原理
- 2.1 備份階段(backup)
- 2.2 準備階段(prepare)
- 2.3 恢復(copy-back 或move-back)
- 3. xtrabackup 流式備份應用
- 4. 總結
xtrabackup備份原理及流式備份應用
0. 參考文獻
序號 | 文獻 |
---|---|
1 | MariaDB/MySQL備份和恢復(三):xtrabackup用法和原理詳述 |
2 | MySQL · 物理備份 · Percona XtraBackup 備份原理 |
3 | Streaming and Compressing Backups |
4 | How Percona XtraBackup Works |
5 | FLUSH TABLE WITH READ LOCK詳解 |
6 | 為什麼要使用FTWRL |
7 | 使用tar+pigz+ssh實現大資料的高效傳輸 |
xtrabackup 是一款開源的MySQL備份解決工具,由percona公司開發完成。相比於MySQL企業版的mysqlbackup 和ibbackup功能強大許多。尤其提供了當前部門需求的流式備份功能,因此在目前看來xtrabackup是一款非常合適的MySQL備份工具。本文將從xtrabackup備份的應用與原理角度介紹xtrabackup。
1. xtrabackup 安裝
xtrabackup可以通過多種方式安裝。本文在這裡選擇從https://www.percona.com/downloads/ 下載二進位制包的方式安裝。在網頁中可以看到xtrabackup有4個版本可以選擇。這4個版本分別支援MySQL不同的版本:
- 8.0 : MySQL 8.0 以上版本
- 2.4 : MySQL 5.7 版本
- 2.2 和 2.3 : MySQL 5.1, 5.5 和 5.6
當前線上使用的MySQL版本是5.7版本,因此本文所有的內容都是基於2.4版本生成的。如果讀者對於8.0 有興趣,可以閱讀其文件:Percona XtraBackup - Documentation
下載下來的檔案中,bin目錄下會有如下的幾個檔案:
~/percona-xtrabackup-2.4.15-Linux-x86_64/bin$ ls -la
total 211188
drwxr-xr-x 2 mysql mysql 4096 Oct 12 13:20 .
drwxr-xr-x 6 mysql mysql 4096 Jul 5 16:00 ..
lrwxrwxrwx 1 mysql mysql 10 Jul 5 16:00 innobackupex -> xtrabackup
-rwxr-xr-x 1 mysql mysql 9811072 Jul 5 15:53 xbcloud
-rwxr-xr-x 1 mysql mysql 3020 Jul 5 15:52 xbcloud_osenv
-rwxr-xr-x 1 mysql mysql 5854168 Jul 5 15:53 xbcrypt
-rwxr-xr-x 1 mysql mysql 5942024 Jul 5 15:53 xbstream
-rwxr-xr-x 1 mysql mysql 194628336 Jul 5 15:59 xtrabackup
- xbcloud, xbcloud_osenv : 是xtrabackup新的高階特性雲備份
- xbcrypt : 支援加密備份
- xbstream : 支援流式備份功能。可以將備份的內容打包並通過管道傳遞
- xtrabackup : 是備份功能的主程式
- innobackupex : 這個工具在之前的版本中是一個perl指令碼,會呼叫xtrabackup這個二進位制工具。從xtrabackup 2.3開始,該工具使用C語言進行了重寫,當前它是xtabackup二進位制工具的一個軟連線,但是實際的使用方法卻不同,並且在以後的版本中會刪除該工具。
因為innobackupex在後續版本中已經不存在。因此本文將會主要介紹xtrabackup的備份恢復方法和原理。
2. xtrabackup 備份和恢復原理
對於xtrabackup備份和恢復資料的過程總體分為3個階段:
- 備份(backup)
- 準備(prepare)
- 恢復(copy-back 或move-back)
2.1 備份階段(backup)
對於MySQL的備份,在大部分的情況下需要完成以下兩種型別的資料的備份:
- innodb 儲存引擎資料的備份。
- 非事務引擎的資料備份,例如myisam 引擎資料的備份。
在備份的過程中資料庫基本處於可讀寫的狀態,因此在這期間需要對於變化的資料進行處理,以便在備份結束時獲取正確的備份資料。基於上述的考慮xtrabackup備份的過程主要包括了以下的幾個步驟:
拷貝和監控redo log : 在起始時刻,xtrabackup會先獲取MySQL當前時刻的LSN,同時開始拷貝redo log至xtrabackup_logfile檔案中。因為在備份的過程中資料庫基本處於可讀寫的狀態下,因此redo log會不斷的變化,將導致初始拷貝的redo log和MySQL當前的redo log不一致。所以在xtrabackup後臺,還會啟動另外的一個程序持續監控redo log檔案的變化。如果監控到檔案發生變化,則將其寫入到xtrabackup_logfile中。這個程序會一直存在並執行監控redo log的變化,直到備份將結束為止。
拷貝innodb相關檔案:拷貝包括ibdata1(共享表空間)和*.idb(如果開啟了獨立表空間的話)相關的檔案。
加備份鎖:因為非innodb表沒有redo log可供拷貝,所以在備份非innodb表之前需要對資料庫加鎖,以防止在備份過程中資料被修改。在這裡需要先簡單的介紹下備份鎖的概念。在各種備份工具備份資料庫的過程中,為了獲取一致性備份(binlog位置與資料匹配),需要在備份的過程中加上備份鎖。在MySQL中會使用FLUSH TABLES WITH READ LOCK簡稱(FTWRL)來獲取一致性備份。FTWRL會執行如下的幾個操作(更具體的介紹和相關原理可以參見FLUSH TABLE WITH READ LOCK詳解):
- 上全域性讀鎖(lock_global_read_lock):阻塞所有的更新操作。
- 清理表快取(close_cached_tables):關閉表快取。
- 上全域性COMMIT鎖(make_global_read_lock_block_commit):阻塞活躍的事務提交。
FTWRL的操作中會阻塞包括innodb在內的所有儲存引擎的更新操作。在FTWRL執行的過程中,整個資料庫相當於只讀模式。可見如果在線上資料庫中(尤其在承擔線上讀寫業務的資料庫下),使用FTWRL可能會導致線上資料庫長時間陷入不可寫入的狀態。對於這個問題percona版本的MySQL做出了優化,將FTWRL 分為了幾個部分:
- lock table for backup : 這個鎖會阻塞所有對非事務表的更新及所有DDL動作,但是innodb表的讀寫可以繼續執行。
- lock binlog for backup:做鎖會阻止binlog更新,因此此時所有的DML操作都會被阻塞。
可以看出如果在備份的過程中,將FTWRL拆解成如上的2步操作,則在備份非事務表的過程中可以不阻塞事務表的更新。對於xtrabackup如果備份的資料庫是不支援backup lock的版本,則使用FTWRL操作。而如果是支援backup lock的版本,則使用lock tables for backup獲取輕量級的backup locks來替代FTWRL。
- 拷貝非innodb表文件。
- 獲取binlog一致性位置:在拷貝完所有的資料之後,備份進入收尾階段。在這裡根據是否支援backup lock分為不同的操作。對於不支援backup lock的版本,直接獲取binlog的一致性座標點同時結束redo log的監控和拷貝並釋放鎖。而對於支援backup lock的版本,先通過lock binlog for bakcup來獲取binlog日誌鎖,然後結束redo log的監控和拷貝,再unlock tables釋放表鎖,隨後獲取二進位制日誌的一致性位置座標點,最後unlock binlog釋放binlog日誌鎖。
- 結束備份退出。
2.2 準備階段(prepare)
在恢復備份之前需要對資料進行一些處理,在xtrabackup中稱之prepare。這個步驟的主要工作就是將之前記錄的redo log應用到innodb的資料中,使得innodb中的資料最終和備份結束的時刻一致。這個步驟不需要在有MySQL的機器上執行,xtrabackup自身實現了一個簡化版本的innodb引擎,通過它完成redo log的應用。
2.3 恢復(copy-back 或move-back)
在最後一步,xtrabackup會將資料copy 或者move (如果DBA不打算保留備份資料)到資料庫對應的目錄下。同樣這步也不需要MySQL啟動或者存在,可以在任何機器上執行。但是要求對應的資料庫目錄下是空的,不存在任何的檔案。
最後根據如上的敘述可以歸納總結如下:
3. xtrabackup 流式備份應用
當前對於部門的MySQL叢集存在如下的痛點:
- 備份磁碟空間不足:隨著線上資料的增長,大部分MySQL資料庫都沒有預留足夠的備份空間,因此當前每次在本地備份資料都會導致磁碟空間報警。在DBA處理不及時的情況下,容易導致磁碟空間佔滿而影響服務。
而xtrabackup正好有流式備份的功能,能夠解決當前DBA的痛點。因此本小節將主要介紹下xtrabackup的流式備份功能(stream模式)。
當前 xtrabackup支援2種方式的流式備份:
- tar格式(ps : tar 和ssh還有很多有意思的功能,具體可以參考使用tar+pigz+ssh實現大資料的高效傳輸 )
- xbstream格式
在測試xtrabackup備份功能之前需要先準備下實驗環境。
機器 | IP | CPU | 磁碟 | 記憶體 |
---|---|---|---|---|
機器1 | 192.168.100.1 | 40核 | 1.1T SSD(已使用60%) | 64G |
機器2 | 192.168.100.2 | 40核 | 1.1T SSD(空盤) | 64G |
需要完成的操作是從機器1備份資料到機器2,並且不佔用機器1原本不多的剩餘磁碟空間。為了能夠使用流式備份功能,首先需要在機器2上完成如下2個步驟:
- 配置從機器1免密ssh登入機器2。
- 在機器2上建立存放備份的目錄,本例中路徑為/ssd/100_1_bak/
tar格式的備份可以選擇使用gzip或者不壓縮。在本例中分別使用如下命令完成:
xtrabackup --safe-slave-backup --slave_info --user='root' --password='XXXXXX' --backup --tables-file=./tb.txt --stream=tar | ssh [email protected] "cat - | tar -x -C /ssd/100_1_bak/" #### tar 不壓縮
xtrabackup --safe-slave-backup --slave_info --user='root' --password='XXXXXX' --backup --tables-file=./tb.txt --stream=tar |pigz | ssh -p32200 [email protected] " gzip -d | tar -x -C /ssd/100_1_bak/" ### 使用tar 流 並交給 gzip 壓縮傳輸
ps : xtrabackup沒有選項只備份innodb表或者myisam表。但是可以通過選項指定備份的表。在本例中通過--tables-file選項,將需要備份的innodb表寫入tb.txt檔案中進行備份。生成tb.txt的內容可以使用如下的sql語句獲得:
select CONCAT(TABLE_SCHEMA, '.', TABLE_NAME) FROM information_schema.TABLES WHERE ENGINE = 'InnoDB' AND ENGINE IS NOT NULL AND TABLE_SCHEMA NOT IN ( 'mysql', 'performance_schema', 'information_schema', 'sys') ;
如果使用xbstream格式,則可以使用如下的命令:
xtrabackup --safe-slave-backup --slave_info --user='root' --password='XXXXXX' --backup --tables-file=./tb.txt --stream=xbstream | ssh -p32200 [email protected] "cat - | xbstream -x -C /ssd/100_1_bak/" ### xbstream不壓縮
xtrabackup --safe-slave-backup --slave_info --user='root' --password='XXXXXX' --backup --tables-file=./tb.txt --stream=xbstream --compress | ssh -p32200 [email protected] "cat - | xbstream -x -C /ssd/100_1_bak/" ### 使用--compress選項壓縮
4. 總結
本文主要介紹了xtrabackup備份的原理以及流式備份功能。限於本文的作者水平有限,文中的錯誤在所難免,懇請大家批評指