1. 程式人生 > >xtrabackup備份原理及流式備份應用

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不同的版本:

  1. 8.0 : MySQL 8.0 以上版本
  2. 2.4 : MySQL 5.7 版本
  3. 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
  1. xbcloud, xbcloud_osenv : 是xtrabackup新的高階特性雲備份
  2. xbcrypt : 支援加密備份
  3. xbstream : 支援流式備份功能。可以將備份的內容打包並通過管道傳遞
  4. xtrabackup : 是備份功能的主程式
  5. innobackupex : 這個工具在之前的版本中是一個perl指令碼,會呼叫xtrabackup這個二進位制工具。從xtrabackup 2.3開始,該工具使用C語言進行了重寫,當前它是xtabackup二進位制工具的一個軟連線,但是實際的使用方法卻不同,並且在以後的版本中會刪除該工具。

因為innobackupex在後續版本中已經不存在。因此本文將會主要介紹xtrabackup的備份恢復方法和原理。

2. xtrabackup 備份和恢復原理

對於xtrabackup備份和恢復資料的過程總體分為3個階段:

  1. 備份(backup)
  2. 準備(prepare)
  3. 恢復(copy-back 或move-back)

2.1 備份階段(backup)

對於MySQL的備份,在大部分的情況下需要完成以下兩種型別的資料的備份:

  1. innodb 儲存引擎資料的備份。
  2. 非事務引擎的資料備份,例如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詳解):

  1. 上全域性讀鎖(lock_global_read_lock):阻塞所有的更新操作。
  2. 清理表快取(close_cached_tables):關閉表快取。
  3. 上全域性COMMIT鎖(make_global_read_lock_block_commit):阻塞活躍的事務提交。

FTWRL的操作中會阻塞包括innodb在內的所有儲存引擎的更新操作。在FTWRL執行的過程中,整個資料庫相當於只讀模式。可見如果在線上資料庫中(尤其在承擔線上讀寫業務的資料庫下),使用FTWRL可能會導致線上資料庫長時間陷入不可寫入的狀態。對於這個問題percona版本的MySQL做出了優化,將FTWRL 分為了幾個部分:

  1. lock table for backup : 這個鎖會阻塞所有對非事務表的更新及所有DDL動作,但是innodb表的讀寫可以繼續執行。
  2. 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叢集存在如下的痛點:

  1. 備份磁碟空間不足:隨著線上資料的增長,大部分MySQL資料庫都沒有預留足夠的備份空間,因此當前每次在本地備份資料都會導致磁碟空間報警。在DBA處理不及時的情況下,容易導致磁碟空間佔滿而影響服務。

而xtrabackup正好有流式備份的功能,能夠解決當前DBA的痛點。因此本小節將主要介紹下xtrabackup的流式備份功能(stream模式)。

當前 xtrabackup支援2種方式的流式備份:

  1. tar格式(ps : tar 和ssh還有很多有意思的功能,具體可以參考使用tar+pigz+ssh實現大資料的高效傳輸 )
  2. 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. 配置從機器1免密ssh登入機器2。
  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備份的原理以及流式備份功能。限於本文的作者水平有限,文中的錯誤在所難免,懇請大家批評指