前言:

之前的备份是每日凌晨做全备,没有增量备份的策略。 这样导致每天备份时间越来越长以及磁盘占有率越来越高的问题越来越明显。
之前全备采用的工具是 PG 原生自带的命令 pgdump, 这个命令是不支持增量的, 而业界PG的备份工具又是鱼龙混杂的,种类繁多。

我们对比了pgbackrest,barman, pg_rman,bart… 等等, 测试了我们必要的功能点像是: 加密, 压缩,parallel, standby 节点支持备份,远程备份,以及PITR

那么,pgbackreset是一个比较理想的灾备工具,关键的功能是PITR和wal日志文件自动管理以及增量备份和差异化备份,其次是pgbackrest的备份效率从近一段时间的使用来看是比pg_dump 这样的逻辑备份更快的,因为它是物理备份方式,备份和还原都是基于wal日志文件来进行的

这里其实是有一个非常重要的概念,那就是wal日志文件,基于wal日志文件我们才可以做到按秒级灾备恢复,不像pg_dump ,它的备份恢复仅仅是一个大致的时间,pg_dump 备份期间以及备份完成后到下一次备份的时间段内的数据库改变是无法做到记录保存,自然的,恢复也就是仅仅一个大致时间段了

🆗,那么pgbackrest的wal日志文件管理又是什么原理呢?这个就比较简单了,wal日志文件归档之时就是postgresql.conf 文件内定义的归档命令执行的时候,自然的,pg_wal 这个wal日志文件存放的地方将不会有太多的wal日志文件了,通俗的说,pgbackrest将会有效的防止wal日志膨胀,只需要关心pgbackrest的仓库磁盘空间够不够wal日志文件的存放了,如何存放,如何使用也就是如何恢复,这些事情交给pgbackrest就好了,你只需要告诉pgbackrest你希望恢复到哪个时间段或者哪个事务id等等诸如此类需求就可以了

下面有一些概念,需要提前说一说,一个是wal日志由于是一个稀疏格式的data类型文件,因此,该文件可压缩的比率是非常高的,虽然它创建出来的时候默认就是占用16M磁盘空间,但如果采用合理的压缩方式比如lz4命令压缩,将会非常小,而pgbackrest是可以间接调用压缩命令的,比如bzip2,gzip,lz4,zstd等等这些命令,因此,整体来说,pgbackrest备份占用的空间基本和pg_dump 逻辑备份基本一致,这也就是意味着pgbackrest可以备份的数据量级是可以很高的,虽然压缩会占用cpu资源,但这些是完全值得的

其次,pgbackrest可以管理,也就是灾备恢复多个数据库实例,因此,集群的整体备份和管理也就方便了很多,比如,有多个pg库,那么,可以存放到统一的一个专用的服务器上进行灾备

最后,需要提醒的,也是一个需要注意的问题是,pgbackrest不像pg_dump的逻辑备份恢复,是需要停机恢复的,停机时间视恢复速度而定,如果对冷恢复有介意,即使半个小时,十几分钟这样的停机时间也介意的话,那么,pgbackrest不是你的首要选择,当然,也并不是彻底没有办法,可以高可用+主备切换等等技术手段规避冷恢复造成停机进而影响业务这种问题,不过这些不在本文的讨论范围内

源码包下载地址:Github 链接: https://github.com/pgbackrest/pgbackrest

yum install bzip2 bzip2-devel zlib zlib-devel readline readline-devel perl perl-devel gcc gcc-c++ postgresql-libs postgresql-devel libyaml-devel libyaml libxml2-devel libxml2 -y

的安装部署

部署方式有两种,第一种是yum安装方式,需要配置postgresql官方的源,命令为yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm;第二种是源码编译方式,目前来说,没有找到过现成的二进制pgbackrest文件

yum安装方式就没什么好说的了,配置好PGDG官方yum源就可以了,下面主要说明一下编译安装

编译安装pgbackrest主要是需要安装依赖libyamllibyaml-devel 这些依赖已经制作成了离线yum,上传到服务器上后,解压挂载为仓库就可以使用了

安装命令为:

编译的依赖安装完毕后,将附件2,也就是pgbackrest的源码包上传到服务器上后,解压,进入解压目录,然后编译三连,命令如下:

make install 命令将会自动把pgbackrest命令加入系统环境变量

测试pgbackrest是否安装正常:

pgbackrest的版本号表示pgbackrest安装成功

的配置说明

其实pgbackrest的安装部署是十分简单的,关键难点在于配置,而pgbackrest不管是什么方式安装的,基本都是没有什么配置模板的,其次是命令行里可以写配置参数,配置文件里也可以写配置参数,但优先级并不清楚,总的来说,该软件是和其它软件不太一样,显得很怪异。

pgbackrest备份可以分为两种情况,第一种情况是远程备份,也就是备份文件存放在远程服务器上,pgbackrest通过ssh或者s3对象存储拉取数据库的wal日志文件以及数据库的其它文件,恢复的时候是在数据库端操作,第二种情况是本地备份,也就是备份数据文件存放在数据库端,恢复的时候还是在数据库端操作

下面将以VMware虚拟机来说明如何执行远程备份/本地备份和恢复操作

VMware虚拟机有两台,第一台服务器的IP地址是192.168.76.11,计划在该服务器上做远程备份,该服务器只安装了pgbackrest,没有安装任何其它的软件,此服务器后面就称呼为远程备份端

第二台服务器的IP地址是192.168.76.22,计划在该服务器上部署postgresql,也需要安装pgbackrest,其它软件不需要安装,此服务器后面就称呼为数据库端

需要特别注意的是,远程备份和本地备份不能同时存在,要么就远程备份---本地恢复这样的模式,要么就本地备份---本地恢复这样的模式,两种模式不能混杂,主要原因是数据库通常就一个实例,它的archive-command是指定了stanza名称的

  • 本地恢复模式

远程服务器上的pgbackrest的配置文件

数据库端的pgbackrest的配置文件:

该文件的主要作用是执行恢复操作的时候,从远程备份节点拉取wal日志文件以及恢复需要的其它文件,因此,它指定的是repo1-host=192.168.76.11

数据库的主配置文件postgresql.conf 的wal日志文件归档命令:

数据库的主配置文件修改完毕后,重启数据库以使之生效,并配置两个服务器之间的免密(免密操作基础知识,就不在这里废话了,主要是两个服务器的普通用户postgres这个用户之间的免密),经过stanza-create,check后,就可以在远程服务器端执行备份操作并在备份完成后在数据库端执行恢复操作了(初始化顺序不能错,必须是先远程仓库端,然后在数据库端)

该步骤的作用是在远程备份服务器端生成备份需要的相关文件和目录

必须在远端服务器执行,命令以及日志如下(可以反复执行stanza-create,但数据库必须是启动状态):

  1. 备份系统

check的作用是检查数据库的wal日志文件是否可以正确归档(可以反复执行check,每一次检查会归档一次wal日志文件到远端服务器的仓库内)

check命令执行了三次,看仓库文件,可以看到有三个wal日志文件的压缩包:

完整备份:pgBackRest将数据库的全部内容复制到备份中。数据库的第一次备份始终是完整备份。pgBackRest能够直接恢复完整备份。完整备份不依赖于完整备份之外的任何备份。

差异备份:PGbackrest只复制自上次全量备份以后更改的数据库文件。PGbackrest通过复制的差异备份中的所有文件和上一次全量备份中未更改文件进行对比来恢复差异备份。差异备份的优点是它需要的磁盘空间比完全备份少,但是,差异备份和完全备份必须都有效才能还原差异备份。

增量备份: PGbackrest只复制自上次备份(可以是另一个增量备份、差异备份或完全备份)以来已更改的数据库群集文件。由于增量备份仅包括自上次备份以来更改的文件,因此它们通常比完整备份或差异备份小得多。与差异备份一样,增量备份取决于其他备份是否有效来进行恢复增量备份。由于增量备份仅包括自上次备份以来的文件,因此,所有先前备份,包括上一次的增量备份、上一次得差异备份和上一次的完全备份都必须有效,才能执行增量备份的还原。如果不存在差异备份,则所有以前的增量备份都将返回到以前的完整备份(必须存在),并且完整备份本身必须有效才能还原增量备份。

即使指定了模式也仍然是全备:

指定为增量备份(这里需要注意,pgbackrest在备份成功后,会执行一次过期文件清理,过期的wal日志文件清理后,才算完成一个完整的备份周期):

经过若干次备份后,仓库内有很多wal日志文件压缩包了,可以看看备份了些什么文件(还是在远端执行,不需要在数据库执行):

例如,在非数据库服务器执行恢复将会报错,提示必须在运行postgresql的实例上进行,这是为了数据库的安全:

在数据库运行的时候恢复也会报错,因此,必须要先停止数据库:

小结一下,此种模式需要远端服务器和数据库本地服务器都安装pgbackrest,并且都写有配置文件,初始化pgbackrest只在远端服务器执行,也就是stanza-createcheck和备份也都是在远端服务器执行,而恢复必须在运行有postgresql实例的数据库端操作,数据库必须是关闭的

下面是数据库的恢复操作介绍

恢复--按时间恢复,先查看备份情况(此命令会将所有备份信息打印,在远程仓库端执行)

根据备份信息,选择一个时间段(2024-03-28 12:41:51+08

---2024-03-28 12:43:48+08),恢复范围是第一个全备完成时间到最后一个备份完成时间

恢复完成后,通常不需要做任何改动,直接启动数据库就可以立刻使用了,在测试中遇到过数据库进入只读状态,但具体原因不清楚

  • 本地恢复模式

本地备份指的是备份文件存放在本地服务器上,数据库的恢复操作也仅仅在本地执行

本地备份和恢复比较简单,主要是配置文件内的数据库相关配置项不能有pg-host或者pg1-host等等类似字段,否则pgbackrest会认为这个一个远程连接

配置文件如下:

在数据库服务器内需要根据以上配置文件创建相关目录,并赋予用户权限,为了方便,使用postgres用户,防止备份失败的情况

剩下的和远程备份方式一样,postgresql.conf 这个数据库主配置文件内添加archive-cmd命令,并执行

pgbackrest --stanza=main --config=/etc/pgbackrest.conf stanza-create

最后就是

pgbackrest --stanza=main --config=/etc/pgbackrest.conf check

pgbackrest --stanza=main --config=/etc/pgbackrest.conf --type=full backup

pgbackrest --stanza=main --config=/etc/pgbackrest.conf --type=incr backup

04-03 08:41