pg_basebackup是一个非常简便快速的备份工具,它可以对整个实例做物理备份(基于二进制数据),常用于搭建流复制环境或恢复新的备份实例。
PostgreSQL 15对pg_basebackup的compress子项做了一些增强,主要包括:
- 新增lz4和zstd(Zstandard)方法,支持服务端及客户端的lz4和zstd压缩;
- compress子项可控制压缩方法及压缩选项;
- zstd压缩可使用多线程workers并行处理;
- 文本备份方式可在服务端压缩后传输到客户端解压;
compress子项可以指定压缩方法和压缩级别,语法如下:
--compress=[{client|server}-]METHOD[:DETAIL]
PostgreSQL 15之前的版本只能设置压缩级别,压缩级别通过在冒号(:)后直接使用数字或者指定"level=number"来指定,对于zstd压缩,还可以设置"workers=number"并行处理的工作线程数。
具体使用示例如下:
环境准备
本文测试环境使用虚拟机Centos7.6 1G物理内存测试PostgreSQL 15.0,并使用老朋友pgbench进行灌数。
pgbench --initialize --scale=100
初始化因子设置为100, 测试的主表pgbench_accounts数据为一千万行,磁盘空间大约占1.3GB。
下面分别使用不同的备份格式测试不同的压缩方式。
一、使用文本格式,不压缩
$ pg_basebackup -Fp --compress=none -D data
时间花销:56s,空间占用:1.5GB
二、使用tar包格式,gzip压缩
$ pg_basebackup -Ft --compress=gzip -D data
$ pg_basebackup -Ft --compress=client-gzip -D data
时间花销:38s,空间占用:84MB
上面两种方式类似,客户端gzip压缩可以使用"client-gzip",或者简化为"gzip"。
$ pg_basebackup -Ft --compress=server-gzip:5 -D data
$ pg_basebackup -Ft --compress=server-gzip:level=5 -D data
时间花销:27s,空间占用:100MB
服务端gzip压缩可以使用"server-gzip",压缩级别可以直接在冒号后使用数字,或者使用"level=5"来指定,压缩级别的范围是1到9,数字越大,压缩率越高。
三、使用tar包格式,lz4压缩
lz4压缩比gzip压缩速度更快一些,但压缩率不如gzip,如果期望速度更快,可以使用lz4替代gzip。
$ pg_basebackup -Ft --compress=server-lz4:5 -D data
$ pg_basebackup -Ft --compress=server-lz4:level=5 -D data
时间花销:26s,空间占用:167MB
服务端lz4压缩可以使用"server-lz4",压缩级别的写法与前面类似,也是两种写法,压缩级别的范围是1到12,数字越大,压缩率越高。
四、使用tar包格式,zstd压缩
zstd压缩结合了gzip与lz4压缩的优点,不仅速度快,压缩率也高,同时还支持使用多个zstd workers并行备份数据,如果CPU比较充足,zstd是很好的性能提升方式。
$ pg_basebackup -Ft --compress=server-zstd:level=5,workers=1 -D data
时间花销:26s,空间占用:84MB
五、使用文本格式,lz4压缩
如果不喜欢用tar包格式,因为tar包备份的格式无法直接使用pg_verifybackup来校验备份数据的完整性,使用文本格式备份也能进行服务端压缩,然后客户端自动解压。
$ pg_basebackup -Fp --compress=server-lz4 -D data
时间花销:50s,空间占用:1.5GB
使用文本格式备份时虽然压缩并没有给我们带来任何性能收益,但是可以高效的传输数据,加速服务端的备份数据从网络传输到远程客户端存储上。当网络带宽较小时,这种方式会比较有用。
总体来说,服务端的压缩加速比客户端要差一些,但是在网络带宽不好的情况下,可以在服务端压缩后再传输到客户端。
保持联系
从2019年12月开始写第一篇文章,分享的初心一直在坚持,本人现在组建了一个PG乐知乐享交流群,欢迎关注我文章的小伙伴加我微信进群吹牛唠嗑,交流技术。