PostgreSQL pg_basebackup 并行压缩备份

less than 1 minute read

背景

在使用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核(可配置)  

Flag Counter

digoal’s 大量PostgreSQL文章入口