MySQL Backup--Xtrabackup備份限速問題

Data & safety發表於2020-11-10

在innobackupex 2.4版本中,有兩個引數用來限制備份速度:

複製程式碼

--throttle=#        
This option specifies a number of I/O operations (pairs
of read+write) per second.  It accepts an integer
argument.  It is passed directly to xtrabackup's
--throttle option.

--parallel=#       
On backup, this option specifies the number of threads
the xtrabackup child process should use to back up files
concurrently.  The option accepts an integer argument. It
is passed directly to xtrabackup's --parallel option. See
the xtrabackup documentation for details.

複製程式碼

在percoan官方網站上對throttle引數有如下解釋:

複製程式碼

Although xtrabackup does not block your database’s operation, 
any backup can add load to the system being backed up. On systems 
that do not have much spare I/O capacity, it might be helpful to 
throttle the rate at which xtrabackup reads and writes data. 
You can do this with the xtrabackup --throttle option. This option 
limits the number of chunks copied per second. The chunk size is 10 MB.
https://www.percona.com/doc/percona-xtrabackup/2.4/advanced/throttling_backups.html

複製程式碼

如果想將備份速度控制在50MB/s以下的話,那麼throttle引數需要設定為5,使用該引數備份開始後IO使用情況為:

備份程式一直在寫xtrabackup_logfile檔案,如果備份例項的資料操作較多時,會導致備份程式一直處於該狀態無法繼續後面操作。

PS: 備份目錄下xtrabackup_logfile檔案的增長速度和引數throttle密切相關。

在備份例項停止全部操作情況,使用throttle=5進行備份,備份進行執行10分鐘還在處理xtrabackup_logfile檔案,備份效率無法保證。

調整為throttle=10後,備份過程中期IO使用情況為:

10*10MB/S=100MB/S=102400KB/S,證明throttle=10的確有效。

引數parallel使用多個程式來備份資料檔案,在磁碟速度夠快情況下,parallel能有效提升備份效率,但無法進行限速操作。

 

======================================================================================

由於引數throttle設定較低會導致無法正常備份,而設定較高又無法起到限速目的,因此考慮使用pv方式來限速。

PV 由Andrew Wood 開發,是 Pipe Viewer 的簡稱,經過管道顯現資料處理進展的資訊,控制管道資料的流入流出速度,就到控制備份的速度。

為驗證pv限速和對比stream備份和普通備份的差距,設計下面三種測試方案:

方案1:使用stream=tar流時備份+使用tar -x解壓到本地+使用PV限制速度200M(下圖紅色框標識)
方案2:不使用stream流式備份+備份本地+不限制速度(下圖綠色框標識)
方案3:使用stream=tar流時備份+使用tar -x解壓到本地+不限制速度(下圖黃色框標識)

測試指令碼為:

複製程式碼

## 使用stream=tar流時備份
## 使用tar -x解壓到本地
## 使用PV限制速度200M
innobackupex \
--defaults-file="/export/servers/mysql/etc/my.cnf" \
--host="localhost" \
--port=3358 \
--user='root' \
--password='root_password' \
--stream=tar \
"/export/bak/tmp/" |pv -q -L200m | tar -x

## 不使用stream流式備份
## 不限制速度
innobackupex \
--defaults-file="/export/servers/mysql/etc/my.cnf" \
--host="localhost" \
--port=3358 \
--user='root' \
--password='root_password' \
"/export/bak/full/"

## 使用stream=tar流時備份
## 使用tar -x解壓到本地
## 不限制速度
innobackupex \
--defaults-file="/export/servers/mysql/etc/my.cnf" \
--host="localhost" \
--port=3358 \
--user='root' \
--password='root_password' \
--stream=tar \
"/export/bak/tmp/" | tar -x

複製程式碼

 

備份對CPU的影響:

備份對IO讀寫次數的影響:

備份對IO讀寫速度的影響:

 

對比發現:

1、使用pv命令可以有效限制備份讀寫速度,但不能精確限制讀寫速度(限速200MB/S,實際速度170MB/S)

2、使用stream壓縮+解壓進行備份時,CPU有輕微增長,但影響並不明顯。

3、在不限速情況下,使用stream壓縮+解壓的備份效率遠低於普通備份(上面測試環境下接近差一倍)

4、使用stream壓縮+解壓進行備份時,可以增減備份執行緒parallel來提高備份效率。

相關文章