嗨,我是BARS Group的首席系统管理员Alexander Nikitin。在本文中,我想向您介绍pg_probackup工具。
Pg_probackup是Postgres Professional的一项开发,可帮助制作PostgreSQL DBMS的备份。与标准pg_basebackup实用程序不同,此工具允许您在数据块级别(默认为8Kb)创建增量备份,验证备份和DBMS,设置存储策略等等。
在本文中,我无意描述使用pg_probackup的所有可能方面,我只是想了解如何在工作中使用此工具。
将考虑以下用例:
- wal-
1
鉴于:我们有两台服务器(OS CentOS 7),第一台有数据库(主机名srv_db1,用户postgres,已安装PostgreSQL 12.4),第二台将存储备份(主机名srv_bkp,用户backup_user)。
您必须配置备份,以便PostgreSQL集群的副本存储在srv_bkp服务器上。
解决方案:
pg_probackup可以通过ssh工作,在使用ssh连接作为通信和传输通道的远程主机上启动代理。因此,您需要确保srv_bkp主机上的backup_user可以连接到srv_db1主机上的postgres用户。
1)使用backup_user连接到srv_bkp并执行以下命令:
ssh-keygen -t rsa
ssh-copy-id postgres@srv_db1
打开偏执模式并编辑srv_db1服务器上的〜/ .ssh / authorized_keys文件,在包含
密钥的行之前,插入以下内容:
command="pg_probackup-12 agent"
因此,您应该以如下形式结束:
command="pg_probackup-12 agent" ssh-rsa AAAA....
这样,我们说只能通过SSH启动“ pg_probackup-12代理”(您可以在此处了解更多信息)。
2)我们在两台机器上都安装了pg_probackup(在示例中,我们正在CentOS上工作,但是对于其他发行版,安装过程在文档中进行了描述):
yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
rpm -ivh https://repo.postgrespro.ru/pg_probackup/keys/pg_probackup-repo-centos.noarch.rpm
yum install pg_probackup-12
yum install pg_probackup-12-debuginfo
在撰写本文时,将安装pg_probackup的最新可用版本-2.4.2。
3)在srv_bkp上创建一个别名(这不是必需的,但是更方便),并定义一个变量,该变量包含带有备份的目录的路径(预先创建了该目录):
mkdir /home/backup_user/backup_db
echo "BACKUP_PATH=/home/backup_user/backup_db">>~/.bash_profile
echo "export BACKUP_PATH">>~/.bash_profile
echo "alias pg_probackup='pg_probackup-12'">>~/.bash_profile
加载配置文件
. .bash_profile
4)在srv_bkp上,初始化备份目录并添加一个新实例:
pg_probackup init
将PostgreSQL实例添加到目录中,为其命名为db1,指定ssh连接参数-主机,用户名和PGDATA的路径。
pg_probackup add-instance --instance=db1 --remote-host=srv_db1 --remote-user=postgres --pgdata=/var/lib/pgsql/12/data
如果出现该行
INFO: Instance 'db1' successfully inited
因此初始化成功。
让我们定义一个保留备份的策略:
pg_probackup set-config --instance db1 --retention-window=7 --retention-redundancy=2
最终的策略归结为以下几点:
有必要将所有备份保留在7天之内,
而完整备份的数量必须至少为2天
。5)要创建备份,您需要连接到DBMS,因此我们在PostgreSQL集群中创建一个将要建立连接的数据库管理备份过程(从安全角度来看,这比连接到产品数据库更好),并且还可以更改数据库参数:
$ createdb backupdb
加入新的数据库
psql -d backupdb
创建一个代表要管理备份过程的数据库角色:
BEGIN;
CREATE ROLE backup WITH LOGIN REPLICATION password 'Strong_PWD';
GRANT USAGE ON SCHEMA pg_catalog TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.current_setting(text) TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.pg_is_in_recovery() TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.pg_start_backup(text, boolean, boolean) TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.pg_stop_backup(boolean, boolean) TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.pg_create_restore_point(text) TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.pg_switch_wal() TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.pg_last_wal_replay_lsn() TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.txid_current() TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.txid_current_snapshot() TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.pg_control_checkpoint() TO backup;
COMMIT;
让我们注意一下listen_addresses参数:
show listen_addresses;
如果是localhost,则更改为*
alter system set listen_addresses='*';
如果更改了listen_addresses,则必须重新启动PostgreSQL。
让我们看看我们在哪里找到pg_hba.conf文件
psql –c 'show hba_file'
将以下规则添加到pg_hba.conf中:
# pg_probackup access permission
host backupdb backup srv_bkp md5
host replication backup srv_bkp md5
我们重新阅读配置:
psql -c 'select pg_reload_conf()'
我们检查是否有错别字:
psql -c 'select * from pg_hba_file_rules'
在srv_bkp上,在backup_user用户的主目录中,创建一个文件,在其中写入服务器名称或其ip地址,端口,数据库名称,用户名和密码。需要此文件,以便在创建备份副本时自动输入密码。
echo "srv_db1:5432:replication:backup:Strong_PWD">>~/.pgpass
echo "srv_db1:5432:backupdb:backup:Strong_PWD">>~/.pgpass
对此文件设置必要的访问权限
chmod 600 ~/.pgpass
并创建第一个备份:
pg_probackup backup --instance=db1 -j2 --backup-mode=FULL --compress --stream --delete-expired --pguser=backup --pgdatabase=backupdb --remote-host=srv_db1 --remote-user=postgres
如果我们正确执行了所有操作,则屏幕上将出现以下内容:
INFO: Backup start, pg_probackup version: 2.4.2, instance: db1, backup ID: QFERC9, backup mode: FULL, wal mode: STREAM, remote: true, compress-algorithm: zlib, compress-level: 1
WARNING: This PostgreSQL instance was initialized without data block checksums. pg_probackup have no way to detect data block corruption without them. Reinitialize PGDATA with option '--data-checksums'.
INFO: PGDATA size: 3373MB
INFO: Start transferring data files
INFO: Data files are transferred, time elapsed: 1m:0s
INFO: wait for pg_stop_backup()
INFO: pg_stop backup() successfully executed
INFO: Syncing backup files to disk
INFO: Backup files are synced, time elapsed: 1s
INFO: Validating backup QFERC9
INFO: Backup QFERC9 data files are valid
INFO: Backup QFERC9 resident size: 975MB
INFO: Backup QFERC9 completed
INFO: Evaluate backups by retention
INFO: Backup QFERC9, mode: FULL, status: OK. Redundancy: 1/2, Time Window: 0d/7d. Active
INFO: There are no backups to merge by retention policy
INFO: There are no backups to delete by retention policy
INFO: There is no WAL to purge by retention policy
请注意pg_probackup发出的警告-我们的集群未启用校验和检查,因此它无法检查数据块的正确性。换句话说,您无法避免不良数据块不进入备份这一事实。
让我们看看当前的设置:
pg_probackup show-config --instance db1
现在,我们缩短用于创建备份的命令-我们将一些参数写入db1实例的配置中:
pg_probackup set-config --instance=db1 --remote-host=srv_db1 --remote-user=postgres --pguser=backup --pgdatabase=backupdb --log-filename=backup_cron.log --log-level-file=log --log-directory=/home/backup_user/backup_db/log
让我们来比较一下:过去和现在如何
pg_probackup show-config --instance db1
它是 | 已经成为 |
---|---|
# Backup instance information
pgdata = /var/lib/pgsql/12/data system-identifier = 6863327140287059463 xlog-seg-size = 16777216 # Connection parameters pgdatabase = backup_user # Replica parameters replica-timeout = 5min # Archive parameters archive-timeout = 5min # Logging parameters log-level-console = INFO log-level-file = OFF log-filename = pg_probackup.log log-rotation-size = 0TB log-rotation-age = 0d # Retention parameters retention-redundancy = 2 retention-window = 7 wal-depth = 0 # Compression parameters compress-algorithm = none compress-level = 1 # Remote access parameters remote-proto = ssh |
# Backup instance information
pgdata = /var/lib/pgsql/12/data system-identifier = 6863327140287059463 xlog-seg-size = 16777216 # Connection parameters pgdatabase = backupdb pghost = srv_db1 pguser = backup # Replica parameters replica-timeout = 5min # Archive parameters archive-timeout = 5min # Logging parameters log-level-console = INFO log-level-file = LOG log-filename = backup_cron.log log-directory = /home/backup_user/backup_db/log log-rotation-size = 0TB log-rotation-age = 0d # Retention parameters retention-redundancy = 2 retention-window = 7 wal-depth = 0 #压缩参数 compress-algorithm =无 压缩级别= 1 #远程访问参数 remote-proto = ssh remote-host = srv_db1 remote-user = postgres |
让我们在DELTA模式下进行增量复制,而无需指定config中设置的参数:
pg_probackup backup --instance=db1 -j2 --progress -b DELTA --compress --stream --delete-expired
让我们看看我们得到了什么
BACKUP INSTANCE 'db1'
=====================================================================================================================================
Instance Version ID Recovery Time Mode WAL Mode TLI Time Data WAL Zratio Start LSN Stop LSN Status
=====================================================================================================================================
db1 12 QFERKZ 2020-08-21 05:55:52-04 DELTA STREAM 1/1 9s 136kB 32MB 1.00 0/B0000028 0/B0000168 OK
db1 12 QFERC9 2020-08-21 05:51:34-04 FULL STREAM 1/0 1m:3s 959MB 16MB 3.52 0/AE000028 0/AE0001A0 OK
有很多信息,详细说明可以在文档中找到,不过,让我们继续介绍以下几点:
恢复时间-使用此备份可以恢复的最短时间
模式-进行复制的模式,当前有4种可用模式-一种全屏(FULL)和三种增量版(PAGE,DELTA和PTRACK)
WAL模式-此处可以使用以下选项-流和存档。在STREAM模式下创建的副本包含恢复到一致WAL状态所需的所有文件。为了使此模式起作用,有必要将REPLICATION角色赋予我们的备份用户。 ARCHIVE模式假定我们已经配置了WAL归档,然后必要的WAL文件将位于pg_probackup已知的路径中。
状态-状态很多,它们都在文档中进行了描述,但是如果我们看到的不是OK,则可以查阅文档并查看出了什么问题。
您可能已经猜到了,我们可以解析pg_probackup show命令的输出并获取上一次备份的状态,将其处理并将其发送到监视系统,并且我们已经可以设置规则来触发负责DBMS的员工的通知。
让我们创建一个bkp_base.sh脚本,它将开始备份并将结果发送到监视系统:
#! /bin/sh
#
. /home/backup_user/.bash_profile
# , (FULL, DELTA ..)
pg_probackup backup --instance=db1 -j 2 --progress -b $1 --compress --stream --delete-expired
# zabbix.
if [ "$(pg_probackup show --instance=db1 --format=json | jq -c '.[].backups[0].status')" == '"OK"' ]; then
result=0;
else
result=1;
fi
# zabbix zabbix_trapper pg.db_backup
# , , , .
/opt/zabbix/bin/zabbix_sender -c /opt/zabbix/etc/pg.zabbix_agentd.conf -k pg.db_backup -o $result
我们在crontab中编写了对结果脚本的调用,例如,您可以设置以下时间表:
00 01 * * 7 /home/backup_user/scr/bkp_base.sh FULL
00 01 * * 1,2,3,4,5,6 /home/backup_user/scr/bkp_base.sh DELTA
这样就完成了第一个任务的解决方案-我们配置了备份,定义了副本保留策略。我们还将备份状态发送到监视系统。
在接下来的部分,我们将着眼于创建一个沃尔玛文件归档和创建档案备份。