熟悉pg_probackup。第一部分

图片



嗨,我是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


这样就完成了第一个任务的解决方案-我们配置了备份,定义了副本保留策略。我们还将备份状态发送到监视系统。



接下来的部分,我们将着眼于创建一个沃尔玛文件归档和创建档案备份。



All Articles