XtraBackup支持流式备份,将备份以指定的tar或xbstream格式发送到STDOUT,而不是直接将文件复制到备份目录。要使用此功能,仅需要使用--stream
选项即可,指定流格式为tar或xbstream,以及指定存储临时文件的绝对路径。
1 |
$ innobackupex --stream=tar /tmp |
innobackupex在子进程中以--log-stream
模式启动xtrabackup,并将其日志重定向到临时文件。然后它使用xbstream将所有数据文件以特殊的xbstream格式流式传输到STDOUT。详情请参阅xbstream二进制文件。在完成将所有数据文件流式传输到STDOUT之后,它会停止xtrabackup并传输保存的日志文件。
流传输功能允许你使用其他程序来过滤备份的输出,为备份的存储提供更大的灵活性。例如,压缩是通过将输出管道输送到压缩实用程序来实现的。流式备份和使用Unix管道的优点之一就是备份可以被自动加密。
在使用传统备份模式下,不得不考虑以下问题:
1. 占用本地一倍磁盘空间(当然,你也可能直接使用NFS、SAMBA这样的文件共享服务器来备份)。
2. 如果使用共享文件系统来备份,又面临速度太快,把MySQL服务器网卡跑满的情况(我就遇到此问题)。
3. 备份文件传输到远程服务器后还得做压缩处理。
由于以上问题,就可以考虑使用流备份,利用好的情况下可以解决以上问题:
1. 使用流传输模式,通过管道传输给压缩备份程序,如gzip、pigz。
2. 如果使用共享文件系统来备份,把实时压缩文件直接存储到共享文件系统上,由于需要经过压缩处理,所以不会造成MySQL服务器网卡跑满的情况。
PS:以上考虑的更多是利用共享文件系统来备份的情况下,如何优雅解决相关问题,而不是备份到本地。
XtraBackup流传输备份使用方式有如下几种:
1. xbstream压缩备份实例
1 |
$ innobackupex --defaults-file=/etc/my.cnf --stream=xbstream --compress --no-timestamp /backup/ > /backup/backup.xbstream |
将备份解压
1 |
$ xbstream -x < backup.xbstream -C /root/backup/ |
2. tar压缩备份实例
1 |
$ innobackupex --defaults-file=/etc/my.cnf --parallel=2 --user=root --password=123456 --stream=tar --no-timestamp /backup > /backup/db.tar |
将tar存档文件发送到另一个主机
1 |
$ innobackupex --defaults-file=/etc/my.cnf --parallel=2 --user=root --password=123456 --stream=tar --no-timestamp /backup | ssh user@destination \ "cat - > /data/backups/backup.tar" |
可以选择的压缩方式
1 2 3 |
$ innobackupex --stream=tar --no-timestamp /backup | gzip - > backup.tar.gz $ innobackupex --stream=tar --no-timestamp /backup | bzip2 - > backup.tar.bz2 $ innobackupex --stream=tar --no-timestamp /backup | pigz - > backup.tar.bz |
重定向日志输出文件
1 |
$ innobackupex --stream=tar --no-timestamp /backup 2> /tmp/backup.log | gzip - > backup.tar.gz |
PS:上面基本都是针对整个实例完全备份来阐述的,可能你的需求并不一样,比如有完整备份和增量备份,具体是否支持和怎么操作需要看官方文档。
再来说一说使用流传输备份时,tar和xbstream的不同点。使用tar备份时,直接可以使用tar命令解压(tar xvf *.tar.gz),但不支持增量备份模式。可以直接写成下面这种格式:
1 |
$ innobackupex --defaults-file=/etc/my.cnf --stream=tar --no-timestamp /backup/ 2> /tmp/back.log | pigz -6 -p 2 > /backup/all.tar.gz |
当使用xbstream作流式备份选项时,可以并行复制和压缩备份,从而大大加快备份过程。如果备份是压缩和加密,首先需要解密,以便不被压缩。支持增量备份模式,但是标准输出需要使用xbstream工具。一般写成如下格式:
1 |
$ innobackupex --defaults-file=/etc/my.cnf --stream=xbstream --no-timestamp /backup/ 2> /tmp/back.log | pigz -6 -p 2 > /backup/all.xbstream.gz |
解压的话就需要先使用gzip工具解压,然后在使用xbstream工具标准输出。
1 2 |
$ gzip -d /backup/all.xbstream.gz $ xbstream -x < /backup/all.xbstream |
更多时候可能会需要增量备份,并且是流传输格式,这个时候需要用到innobackupex另外一个参数--extra-lsndir
,这个参数用来指定xtrabackup_checkpoints文件的备份位置,这个文件存储着此次备份方式和结束LSN(to_lsn),这个LSN就是下次增量备份的起始位置。
1 |
$ innobackupex --defaults-file=/etc/my.cnf --stream=xbstream --no-timestamp --extra-lsndir=/backup/checkpoint/1 /backup/ 2> /tmp/back.log | pigz -6 -p 2 > /backup/all.xbstream.gz |
增量备份时使用--incremental-basedir
指定--extra-lsndir
指定的位置即可。
1 |
$ innobackupex --defaults-file=/etc/my.cnf --stream=xbstream --no-timestamp --extra-lsndir=/backup/checkpoint/2 --incremental-basedir=/backup/checkpoint/1 /backup/ 2> /tmp/back.log | pigz -6 -p 2 > /backup/all.xbstream.gz |
其实--incremental-basedir
参数会去xtrabackup_checkpoints文件找to_lsn参数对应的LSN号,你也可以使用--incremental-lsn
参数手动指定to_lsn对应的LSN号,都是一样的。
最后推荐多线程压缩工具pigz,压缩那是非常快。下面是我某个环境备份方式。有一点需要说明的是,我的MySQL本地/backup目录挂载的是一个文件共享服务器的目录,所以我本地是不存放备份文件的,都是实时传输到文件服务器上。
1 |
$ innobackupex --defaults-file=/etc/my.cnf --parallel=2 --user=root --password=123456 --no-timestamp --stream=tar /backup/ 2> /tmp/back.log | pigz -6 -p 2 > /backup/all.tar.gz |
另外,在这个备份模式下,下面是我在压测的一些数据,仅供参考。服务器配置是128G,40H,千兆,SSD,虽然这个并不重要。
数据大小 | xtrabackup线程数 | pigz压缩比 | pigz线程数 | 压缩后大小 | 压缩比 | CPU负载 | 网卡带宽 | 整体备份时间 |
100G | 4 | -9 | 2 | 16G | 84% | 2 | <100M | 130分钟 |
100G | 4 | -6 | 2 | 16G | 84% | 2 | 几兆到几百兆,忽大忽小,最大带宽未超过500M | 30分钟 |
100G | 4 | -3 | 2 | 18G | 82% | 2 | 几兆到几百兆,忽大忽小,最大带宽偶尔能跑满网卡 | 15分钟 |
100G | 4 | -6 | 4 | 16G | 84% | 4 | 几兆到几百兆,忽大忽小,最大带宽偶尔能跑满网卡 | 18分钟 |
580G | 4 | -9 | 2 | 68G | 88% | 4 | <100M | 420分钟 |
580G | 4 | -9 | 4 | 68G | 89% | 4 | 几兆到几百兆,忽大忽小,最大带宽未超过500M | 220分钟 |
580G | 4 | -6 | 2 | 70G | 88% | 2 | 几兆到几百兆,忽大忽小,最大带宽未超过500M | 120分钟 |
580G | 4 | -6 | 4 | 70G | 88% | 4 | 几兆到几百兆,忽大忽小,最大带宽偶尔能跑满网卡 | 70分钟 |
在这份模拟报告中,我需要关心xtrabackup线程数、pigz压缩比、pigz线程数的不同对压缩比、CPU负载、网卡流量,以及整体备份时间(压缩加传输)的差别。由于我是挂载的文件共享服务器,所以我可能特别需要关心一下网卡带宽,确保不能把MySQL服务器网卡跑满了,导致其他服务无法正常运行。所以我需要平衡备份时间和网卡流量,找一个折中点,把控好压缩比和压缩线程,不能过快。
最后,从报告上可以看出,我们pigz压缩比-9与-6压缩后的数据时一样大的,而-6比-9快80%左右,不知道是否因为数据库的特性。有兴趣可以测测普通文件看看。
对于网卡IO限速的工具,没有找到好用的,如果有好的工具推荐欢迎留言。但是我知道Unix下有一个pv(Pipe Viewer)命令,通过管道显示数据处理进度的信息。这些信息包括已经耗费的时间,完成的百分比(通过进度条显示),当前的速度,全部传输的数据,以及估计剩余的时间等等。所以可以很好地监视系统状态,复制、移动、删除文件,命令执行进度等。要使用PV,需要配合合适的选项,把它放置在两个进程之间的管道,命令的标准输入将会通过标准输出传进来的,而进度会被输出到标准错误输出。
接下来,pv还有一个命令行选项,就是“-L”,可以让你修改 pv 命令的传输速率。配置innobackupex使用,我们举个例子:
1 |
$ innobackupex --defaults-file=/etc/my.cnf --stream=xbstream --no-timestamp /backup/ 2> /tmp/back.log | pv -L 2M | pigz -6 -p 2 > /backup/all.tar.gz |
这里限制传输速度为2M,可以自己尝试尝试。
<参考>
https://yq.aliyun.com/articles/419618