本文共 11039 字,大约阅读时间需要 36 分钟。
作者:王志斌,曾获得中国PostgreSQL数据库管理工程师(PGCE),是PostgreSQL官方认证讲师,盘古云课堂特邀金牌讲师。
Pgbackrest作为PostgreSQL数据库的备份和还原工具,在软件设计上综合考虑了功能和性能,包括完整性、一致性、安全性、数据压缩、异步并行等方面,其主要技术特性主要包括如下内容,如图所示:
支持备份存储S3和Azure兼容对象存储上,如对象存储Minio。
支持gzip, bzip, lz4, zstd的压缩算法,并提供不同压缩等级。
在异步模式下通过并行推送和获取以加快处理速度,提高备份与还原处理效率。
采用checksum 算法,验证备份期间复制的每个文件的校验和。在完全备份期间,将验证所有页面的校验和,而在差异备份和增量式备份期间,将验证已更改文件的校验和。
通过定义加密类型及密码,来保证备份数据的存储安全性。
在技术特性基础上,pgbackrest实现了备份、还原、保留策略、云端备份等相关功能,如图所示:
功能列表
全量备份:将数据库集群的全部内容复制到备份中。数据库集群的第一个备份始终是全量备份。始终能够直接还原全量备份。全量备份不依赖于完整备份之外的任何文件来保持一致性。
增量备份:仅复制自上次全量备份以来已更改的那些数据库集群文件。通过复制所选差异备份中的所有文件以及先前全量备份中的相应未更改文件来还原差异备份。差异备份的优点在于,与全量备份相比,它需要的磁盘空间更少,但是,差异备份和全量备份都必须有效才能还原差异备份。
差异备份:仅复制自上次备份(可以是另一个增量备份,差异备份或全量备份)以来发生更改的那些数据库集群文件。由于增量备份仅包括自上次备份以来已更改的文件,因此它们通常比全量备份或差异备份小得多。与差异备份一样,增量备份依赖于其他备份才能有效还原增量备份。由于增量备份仅包括自上次备份以来的那些文件,因此,所有先前的增量备份(回到先前的差异备份),先前的差异备份和先前的全量备份都必须有效,才能执行增量备份的还原。如果不存在差异备份,则所有先前的所有增量备份都将还原为必须存在的先前的完整备份,并且完整备份本身必须有效才能还原增量备份。
支持保留的备份数量,可以指定全量、差异备份的具体数量。
支持全量、增量、差异还原以及时间点还原,还同时支持还原指定数据库、表空间和链接支持等。
支持异步的推送和获取,利用pgbackrest并发特性,提升备份和还原的性能,同时在处理过程中对重新数据进行校验和处理,保证备份和还原数据正确性。
检查命令验证pgBackRest和archive_command设置是否已正确配置以进行归档和备份。
支持通过SQL查询方式,在PostgreSQL中创建函数查询检查信息,也可以通过Jq从Json中提取数据来进行查询。
基于用户提供的密码及加密类型对存储库进行加密,防止未经授权访问存储库中的数据。
根据用户设定的压缩算法及压缩等级,将压缩后的数据存储到存储库中。
注:pgbackrest目前支持Postgresql 8.3以上版本
Pgbackrest作为一款优秀的备份和还原工具,与PostgreSQL自带的pg_basebackup相比功能更加强大,尤其是体现在与应用场景的结合使用,下面主要从单机、远程、云端三个场景进行操作介绍:
操作环境系统版本:Centos 7
Pgbackrest版本:v2.24 PostgreSQL版本:12.2主机和备份存储在同一台物理主机上,为了确保备份数据的安全性,一般不推荐生成环境使用。
首选需要进行源码下载和编译,然后配置pgbackrest的相关目录,并修改对应权限。
下载源码文件。
wget https://github.com/pgbackrest/pgbackrest/archive/release/2.26.tar.gz
安装编译相关依赖环境。
sudo yum install -y libxml2 libxml2-devel openssl openssl-devel
进行源码编译。
cd src/./configure && make
拷贝执行程序到/usr/bin目录。
sudo cp pgbackrest /usr/bin
修改权限。
sudo chmod 755 /usr/bin/pgbackrest
创建配置日志目录。
sudo mkdir -p -m 770 /var/log/pgbackrest
修改访问权限
sudo chown pgbackrest:pgbackrest /var/log/pgbackrest
创建配置目录。
sudo mkdir -p /etc/pgbackrestsudo mkdir -p /etc/pgbackrest/conf.d
创建配置文件。
sudo touch /etc/pgbackrest/pgbackrest.confsudo chmod 640 /etc/pgbackrest/pgbackrest.conf
修改访问权限。
sudo chown pgbackrest:pgbackrest /etc/pgbackrest/pgbackrest.conf
创建仓库路径。
sudo mkdir -p /var/lib/pgbackrestsudo chmod 750 /var/lib/pgbackrestsudo chown pgbackrest:pgbackrest /var/lib/pgbackrest
操作上述命令后,pgbackrest的配置基本完成,下面将进行配置节的操作。
在服务器上配置Pgbackrest节的相关内容,并修改Pgbackrest的配置文件。最后通过check命令来进行节的检查。
生成备份所需的密码。
openssl rand -base64 48Dpy3iBVyfoAsDH+OQyApvpNT5ijs3jPI3fuVgTRKKbckN9HZe74ObGtsdkrhaa7T
修改配置文件。
vim /etc/pgbackrest/pgbackrest.conf
配置仓库路径。
[postgres]pg1-path=/home/postgres/pg/data/[global]repo1-path=/var/lib/pgbackrestrepo1-retention-full=2repo1-cipher-pass=Dpy3iBVyfoAsDH+OQyApvpNT5ijs3jPI3fuVgTRKKbckN9HZe74ObGtsdkrhaa7Trepo1-cipher-type=aes-256-cbcprocess-max=3[global:archive-push]compress-level=3
配置归档。
vim /home/postgres/pg/data/postgresql.confarchive_command = 'pgbackrest --stanza=postgres archive-push %p'archive_mode = onlisten_addresses = '*'log_line_prefix = ''max_wal_senders = 3wal_level = replica
重启数据库。
pg_ctl -D /home/postgres/pg/data restart
创建.pgpass文件,并设置环境变量。
vim ~/.pgpasslocalhost:5432:postgres:postgres:postgreschmod 0600 ~/.pgpass
设置环境变量。
vim ~/.bashrcexport PGPASSFILE=~/.pgpass
创建节
pgbackrest --stanza=postgres --log-level-console=info stanza-create
检查配置
pgbackrest --stanza=postgres --log-level-console=info check
验证Pgbackrest的三种备份方式:即全量备份、增量备份、差异备份。
创建全量备份。
pgbackrest --stanza=postgres --log-level-console=info backup
插入部分数据后。
create table test1 (id int, rq date);insert into test1 select generate_series(1,100000),now()+0;
执行增量备份。
pgbackrest --stanza=postgres --log-level-console=info --type=incr backup
查看备份信息。
pgbackrest info
插入部分数据后。
create table test2 (id int, rq date);insert into test2 select generate_series(1,100000),now()+0;
执行差异备份。
pgbackrest --stanza=postgres --log-level-console=info --type=diff backup
可以通过以下命令,查看备份的详细信息。
pgbackrest info
远程仓库一般指通过建立单独的远端仓库,将数据备份到另一台物理主机上,实现可靠存储。
假设两台服务器,分别命名为Pg1和Pgbackrest1,其中:
Pg1:数据库服务器 Pgbackrest1: 远端仓库服务器 在Pgbackrest1上创建用户,并设置密码。useradd pgbackrestpasswd pgbackrest
在Pg1上创建用户,并设置密码。
useradd postgrespasswd postgres
在两个服务器上修改相关文件
vim /etc/hosts192.168.56.3 Pg1192.168.56.4 Pgbackrest1vim /etc/ssh/sshd_configPubkeyAuthentication yesStrictHostKeyChecking no
在Pgbackrest1上创建ssh
su - pgbackrest mkdir -m 750 /home/pgbackrest/.ssh ssh-keygen -f /home/pgbackrest/.ssh/id_rsa -t rsa -b 4096 -N “”在Pg1上创建ssh
su - postgresmkdir -m 750 -p /home/postgres/.sshssh-keygen -f /home/postgres/.ssh/id_rsa -t rsa -b 4096 -N ""
在Pgbackrest1上执行
ssh-copy-id -i ~/.ssh/id_rsa.pub postgres@Pg1
在Pg1上执行
ssh-copy-id -i ~/.ssh/id_rsa.pub pgbackrest@Pgbackrest1
在Pgbackrest1上修改文件执行权限,(如何编译pgbackrest参见单机使用部分)。
chmod 755 /usr/bin/pgbackrest
在Pgbackrest1上创建配置文件和路径。
mkdir -p -m 770 /var/log/pgbackrestchown pgbackrest:pgbackrest /var/log/pgbackrestmkdir -p /etc/pgbackrestmkdir -p /etc/pgbackrest/conf.dtouch /etc/pgbackrest/pgbackrest.confchmod 640 /etc/pgbackrest/pgbackrest.confchown pgbackrest:pgbackrest /etc/pgbackrest/pgbackrest.conf
在Pgbackrest1上创建仓库路径
mkdir -p /var/lib/pgbackrestchmod 750 /var/lib/pgbackrestchown pgbackrest:pgbackrest /var/lib/pgbackrest
在Pgbackrest1上修改配置文件
vim /etc/pgbackrest/pgbackrest.conf内容如下:[postgres]pg1-host=Pg1pg1-path=/home/postgres/postgres/datapg1-host-user=postgrespg1-user=sys[global]repo1-path=/var/lib/pgbackrestrepo1-retention-full=2start-fast=y
在Pg1上执行,配置pgbackrest相关目录
chmod 755 /usr/bin/pgbackrestmkdir -p -m 770 /var/log/pgbackrestchown postgres:postgres /var/log/pgbackrestmkdir -p /etc/pgbackrestmkdir -p /etc/pgbackrest/conf.dtouch /etc/pgbackrest/pgbackrest.confchmod 640 /etc/pgbackrest/pgbackrest.confchown postgres:postgres /etc/pgbackrest/pgbackrest.conf
在Pg1上执行,修改pgbackrest配置文件
vim /etc/pgbackrest/pgbackrest.conf增加如下内容:[postgres]pg1-path=/home/postgres/postgres/datapg1-user=postgres[global]log-level-file=detailrepo1-host=Pgbackrest1
在Pg1上执行,配置数据库密码
vim ~/.pgpasslocalhost:5432:postgres:postgres:postgreschmod 0600 ~/.pgpass
在Pg1上执行,设置环境变量
vim ~/.bashrcexport PGPASSFILE=~/.pgpass
在Pg1上,更新postgresql.conf文件
archive_command = 'pgbackrest --stanza=postgres archive-push %p'archive_mode = onlisten_addresses = '*'log_line_prefix = ''max_wal_senders = 3wal_level = replica
重新启动PostgreSQL使配置文件更改生效。
在Pgbackrest1上创建节
pgbackrest --stanza=postgres stanza-create --log-level-console=info
在Pgbackrest1上创建备份
pgbackrest --stanza=postgres backup --log-level-console=info
可以在备份路径下找到创建的路径和文件。
在Pg1上创建表,插入测试数据
psql -Upostgres -dpostgrescreate table test(id int);insert into test select generate_series(1,1000);
在Pgbackrest1上再次创建备份
pgbackrest --stanza=postgres backup --log-level-console=info
此时已经保存了两份备份,第一份为全量备份、第二份为增量备份。
在Pg1上运行pgbackrest还原,需要先停止PostgreSQL,然后执行还原操作。
pgbackrest --stanza=postgres --log-level-console=info --delta restore
因为此时还原操作默认从第一份全量备份进行还原,没有之前的数据,所以从增量备份中还原数据,需要在–recovery-option中使用recovery_target来运行还原命令
pgbackrest --stanza=postgres--delta restore --recovery-option=recovery_target=immediate
再次检查数据库,发现之前插入的数据已经还原。
由于现在很多企业的服务都逐步向云端迁移,而在云端环境中,对象存储越来越多被使用,因此本节将介绍在云端场景下,Minio作为对象存储,模拟Pgbackrest通过S3接口,将数据库备份存储到对象存储中,以下是具体配置过程:
首先创建minio的环境及相关配置,包括用户、数据目录、桶等内容。
$ useradd -s /sbin/nologin -d /opt/minio minio
$ mkdir -p /opt/minio/bin$ mkdir -p /opt/minio/data
$ yum install -y wget$ wget https://dl.min.io/server/minio/release/linux-amd64/minio -O /opt/minio/bin/minio$ chmod +x /opt/minio/bin/minio
$ cat<
参数解释如下:
MINIO_VOLUMES:存储数据的目录 MINIO_DOMAIN: 访问的域名 MINIO_OPTS:证书访问路径 MINIO_ACCESS_KEY:用户名 MINIO_SECRET_KEY:访问密码$ chown -R minio:minio /opt/minio$ cat<
$ mkdir ~/certs$ cd ~/certs$ openssl genrsa -out ca.key 2048$ openssl req -new -x509 -extensions v3_ca -key ca.key -out ca.crt -days 99999 -subj "/C=BE/ST=Country/L=City/O=Organization/CN=some-really-cool-name"$ openssl genrsa -out server.key 2048$ openssl req -new -key server.key -out server.csr -subj "/C=BE/ST=Country/L=City/O=Organization/CN=some-really-cool-name"$ openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 99999 -sha256$ mkdir -p -m 755 /opt/minio/certs$ cp server.crt /opt/minio/certs/public.crt$ cp server.key /opt/minio/certs/private.key$ chown -R minio:minio /opt/minio/certs$ chmod -R 644 /opt/minio/certs/public.crt$ chmod -R 644 /opt/minio/certs/private.key
Create the systemd service:$ cat<
注:红色字体部分需要根据实际环境进行调整。
$ yum install -y epel-release$ yum --enablerepo epel-testing install -y s3cmd$ cat<~/.s3cfghost_base = minio.localhost_bucket = pgbackrest.minio.localbucket_location = eu-west-3use_https = trueaccess_key = minioadminsecret_key = minioadminEOF$ s3cmd mb --no-check-certificate s3://pgbackrestBucket 's3://pgbackrest/' created$ mkdir /opt/minio/data/pgbackrest/repo$ sudo chown minio: /opt/minio/data/pgbackrest/repo$ s3cmd ls --no-check-certificate s3://pgbackrest/repo DIR s3://pgbackrest/repo/
$ cat<
可以切换到pgbackres用户,进行节的创建,检查
$ su - pgbackrest$ pgbackrest --stanza=postgres stanza-create$ pgbackrest --stanza=postgres check
执行全量备份,并查看备份的详细情况
$ pgbackrest --stanza=postgres --type=full backup$ pgbackrest --stanza=postgres info
主数据库和备用数据库都需要执行备份,大多数文件将从备用数据库复制以减少主数据库上的负载。可以以任何顺序配置数据库主机。pgbackrest将自动确定哪个是primary,哪个是standby。
通过配置备用主机并启用backup-standby选项,当存在多个备用数据库,则找到的第一个正在运行的备用数据库将用于备份。
[postgres]pg1-host=pg-primarypg1-path=/home/postgres/pg/datapg2-host=pg-standbypg2-path=/home/postgres/pg/data[global]backup-standby=yprocess-max=3repo1-path=/var/lib/pgbackrestrepo1-retention-full=2start-fast=y
一个错误的原因可能是很多不同问题导致的,如下:
建议:
pgbackrest能够为配置文件中的每个命令单独设置选项。
示例,每个命令都可以优化process-max?选项:
[global]# used where not overriddenprocess-max=2[global:backup]# more cores for backupprocess-max=4[global:restore]# all the cores for restoreprocess-max=8[global:archive-push]# more cores for archive-pushprocess-max=3[global:archive-get]# fewer cores for archive-getprocess-max=1
RFC-2818不允许通配符在点(.)上匹配,因此s3存储桶名称不能包含点。如果S3存储桶名称中有点,则会出现错误,如在证书的通用名称或使用者替代名称中无法找到主机名’my.backup.bucket.s3.amazonaws.com’。
[1] https://postgresconf.org/conferences/AsiaChina2020/program/proposals/backup-best-practices-with-pgbackrest
[2] https://pgbackrest.org/1/user-guide.html [3] https://pgbackrest.org/1/configuration.html [4] https://pgbackrest.org/1/command.html [5] https://pgstef.github.io/2019/07/19/pgbackrest_s3_configuration.html [6] https://tools.ietf.org/html/rfc2818了解更多PostgreSQL热点资讯、新闻动态、精彩活动,请访问中国PostgreSQL官方网站:
解决更多PostgreSQL相关知识、技术、工作问题,请访问中国PostgreSQL官方问答社区:
下载更多PostgreSQL相关资料、工具、插件问题,请访问中国PostgreSQL官方下载网站:
转载地址:http://ammxf.baihongyu.com/