PostgreSQL pg_basebackup 并行压缩备份
背景
在使用pg_basebackup备份数据库时,可以选择压缩或不压缩。
当我们使用非压缩格式时,如果你的块设备性能很不错,这种单进程的拷贝方式可能无法将块设备的性能发挥出来,例如现在企业级的SSD可以达到2GB/s的读写性能。而使用单进程拷贝小文件可能只能达到300MB/s,这对于备份一个比较大的数据库来说,速度是远远不够的。如果能把SSD的性能发挥出来,速度可以提升6倍。
所以pg_basebackup是不是能支持并行呢?
现在社区版本并没有提供并行备份的功能,我们得想想其他方法。
我们首先来看看pg_basebackup的工作原理:
创建检查点,打开FPW,创建备份标签(存储检查点位置,时间等信息),通过流复制协议与数据库建立连接,WAL Sender进程向pg_basebackup发送数据库物理文件,pg_basebackup接收到文件后写入目标位置(压缩或不压缩)。
这里有几个地方可能成为瓶颈:
1. wal sender端,单进程,可能慢(实际还好)。
pg_basebackup -F t -D - >/dev/null
测试达到1.2 GB/s
(块设备 blockdev --setra 16384 /dev/...)
此时块设备的UTIL为66%,说明速度还可以上来。需要并行。
2. 网络,单线程拷贝,可能成为瓶颈。
10GB 网卡, 大包速度可以达到 1.25 GB/s
3. pg_basebackup端,写入数据时可能成为瓶颈。
pg_basebackup -F t -D - > /dege.zzz/backup/tar
测试达到300 MB/s
是本文的瓶颈。本文将使用并行压缩来减轻这里的写瓶颈,或者升级块设备,使用写入性能更好的块设备。
PostgreSQL除了 pg_basebackup来备份,还可以使用这种方法:
1. pg_start_backup(‘test’);
2. copy files;
3. pg_stop_backup();
如果使用这种方法,我们能找到提升的点吗?
默认拷贝文件使用的是cp命令。或者tar压缩整个目录(需要注意表空间的软链接)。
CP或tar有没有可以并行的呢?当然可以。
这里有几个参考:
http://www.zlib.net/pigz/
https://en.wikipedia.org/wiki/Bzip2
http://lbzip2.org/quickstart
http://compression.ca/pbzip2/
用一个1TB的数据库进行测试:
清除缓存
sync; echo 3 > /proc/sys/vm/drop_caches
1、使用pg_basebackup -F p 即不压缩,速度是269MB/s
2、使用pg_basebackup -F c -z 即归档且压缩模式,速度小于269MB/s
3、使用pg_basebackup -F c 归档不压缩模式,速度269MB/s
4、使用cp ,不压缩,速度 399MB/s
5、使用cp ,并行压缩,以pigz为例:
date +%F%T; tar -cf /digoal/backup/test.tar.gz --use-compress-prog=pigz /digoal/pgdata; date +%F%T;
速度可以达到 509MB/s,但是很耗CPU。
6、接下来要做的就是把pg_basebackup原来使用的gzip替换成pigz。
使用管道即可。
pg_basebackup -F t -D - | /digoal/pigz-2.3.3/pigz -6 -p 32 > /digoal/backup/test1.tar.gz
速度,428MB/s , 但是很耗CPU。
附
不压缩,流式备份:
pg_basebackup -D /digoal/backup -F p
备份结果集大小 819 GB
备份速度 269 MB/s
磁盘使用率 51%
CPU使用率 1核
并行压缩,流式备份:
pg_basebackup -F t -D - | /digoal/pigz-2.3.3/pigz -6 -p 24 > /digoal/backup/test1.tar.gz
备份结果集大小 46 GB
备份速度 428 MB/s
磁盘使用率 28.6%
CPU使用率 24核(可配置)
不压缩,拷贝备份:
(备份大小819GB, 399MB/s)
cp -r $PGDATA/ /digoal/backup/
备份结果集大小 819 GB
备份速度 399 MB/s
磁盘使用率 44.8%
CPU使用率 1核
并行压缩,拷贝备份
tar -cf /digoal/backup/test.tar.gz --use-compress-prog=pigz /digoal/pgdata
备份结果集大小 46 GB
备份速度 509 MB/s
磁盘使用率 33.8%
CPU使用率 24核(可配置)