作者
马文斌
时间
2024-02-26
标签
pgbackrest 备份 实践
服务器介绍
ip | 软件 | 角色 |
---|---|---|
192.168.1.14 | postgres | primary |
192.168.1.15 | postgres | standby |
192.168.1.16 | pgbackrest | 远程备份工具端 |
主从库远程备份
安装pgbackrest 备份工具
提前安装依赖包:
yum install make gcc postgresql12-devel openssl-devel libxml2-devel lz4-devel libzstd-devel bzip2-devel libyaml-devel libssh2-devel postgresql-libs
在postgres 主机上配置环境变量
vim /etc/profile 添加一下内容: export PATH=$PATH:/usr/local/pg-12/bin:/usr/local/pgbackrest/bin export LD_LIBRARY_PATH=/usr/local/pg-12/lib
官网下载安装
wget https://github.com/pgbackrest/pgbackrest/archive/refs/tags/release/2.49.tar.gz cd /usr/local/src/ tar -zxf pgbackrest-release-2.49.tar.gz && cd pgbackrest-release-2.49/src ./configure --prefix=/usr/local/pg_backrest make make install su - pgbackrest sudo mkdir -p -m 770 /var/log/pgbackrest sudo chown pgbackrest:pgbackrest /var/log/pgbackrest sudo mkdir -p /etc/pgbackrest sudo mkdir -p /etc/pgbackrest/conf.d sudo touch /etc/pgbackrest/pgbackrest.conf sudo chmod 640 /etc/pgbackrest/pgbackrest.conf sudo chown pgbackrest:pgbackrest /etc/pgbackrest/pgbackrest.conf
主库配置文件
vim /etc/pgbackrest/pgbackrest.conf
[test] pg1-path=/data/pgdata pg1-socket-path=/tmp pg1-user=postgres [global] repo1-host=192.168.1.16 repo1-host-user=pgbackrest log-level-file=detail log-path=/var/log/pgbackrest
主库参数解释:
[test] 部分 这个 test 是备份集群的名字,多个备份集群可以添加 比如:[test-1],[test-2] 等等 pg1-path=/data/pgdata: 指定 PostgreSQL 数据库实例的数据目录路径。这是 pgBackRest 需要备份的主要内容所在的位置。 pg1-socket-path=/tmp: 指定 PostgreSQL 服务器的套接字文件(socket file)路径。pgBackRest 使用这个路径来通过 UNIX 套接字连接到数据库。 pg1-user=postgres: 定义 pgBackRest 连接到 PostgreSQL 实例时应该使用的用户名。这个用户需要有足够的权限来读取数据库文件和执行备份相关的操作。 [global] 部分 这部分的配置适用于 pgBackRest 的全局设置,影响所有备份和恢复操作。 repo1-host=192.168.1.16: 指定远程备份仓库的主机地址。这表明备份数据将被存储在指定 IP 地址的服务器上。pgBackRest 支持多个备份仓库,这里的 repo1 表示第一个仓库。 repo1-host-user=pgbackrest: 定义访问远程备份仓库主机时使用的用户名。pgBackRest 将以这个用户的身份在远程主机上执行操作。 log-level-file=detail: 设置文件日志记录的详细级别。detail 级别会记录更详细的操作信息,有助于故障排查和监控备份过程。 log-path=/var/log/pgbackrest: 指定日志文件的存储路径。pgBackRest 会将运行日志写入这个目录下,便于后续的日志分析和问题定位。
远程备份工具端配置文件
vim /etc/pgbackrest/pgbackrest.conf
[test] pg1-path=/data/pgdata pg1-port=5432 pg1-socket-path=/tmp pg1-user=postgres pg1-host-config-path=/etc/pgbackrest pg1-host=192.168.1.14 pg1-host-port=22 pg1-host-user=postgres pg2-path=/data/pgdata pg2-port=5432 pg2-socket-path=/tmp pg2-user=postgres pg2-host-config-path=/etc/pgbackrest pg2-host=192.168.1.15 pg2-host-port=22 pg2-host-user=postgres [global] backup-standby=y process-max=3 start-fast=y repo1-path=/pgbackrest/backup repo1-retention-full=2 backup-user=postgres log-level-console=info log-level-file=debug buffer-size=16MiB compress-type=gz [global:archive-push] compress-level=3
工具端参数解释
[test] 这个 test 是备份集群的名字,多个备份集群可以添加 比如:[test-1],[test-2] 等等 pg1-path 和 pg2-path:指定了两个数据库实例的数据目录路径。 pg1-port 和 pg2-port:定义了两个实例的端口号,通常 PostgreSQL 默认端口是 5432。 pg1-socket-path 和 pg2-socket-path:指定了 UNIX 套接字文件的路径,用于本地连接。 pg1-user 和 pg2-user:定义 pgBackRest 连接到各个 PostgreSQL 实例时使用的用户名。 pg1-host-config-path 和 pg2-host-config-path:指定远程主机上 pgBackRest 配置文件的路径。 pg1-host, pg2-host:定义了各实例所在的主机地址。 pg1-host-port 和 pg2-host-port:指定了用于 SSH 连接的端口号,默认为 22。 pg1-host-user 和 pg2-host-user:定义了 SSH 连接时使用的用户名。 [global] 部分 这部分定义了全局备份策略和行为。 backup-standby=y:启用备份从备用服务器进行,这有助于减少对生产数据库的性能影响。 process-max=3:定义了 pgBackRest 同时执行任务的最大进程数。 start-fast=y:启用快速启动模式,尝试减少备份期间的停机时间。 repo1-path:指定了备份仓库的路径。 repo1-retention-full=2:定义了完整备份的保留数量,超过这个数量的旧备份将被删除。 backup-user:指定执行备份操作的用户。 log-level-console:设置控制台日志级别。 log-level-file:设置文件日志的详细级别。 buffer-size:定义了缓冲区大小,用于优化性能。 compress-type=gz:指定了压缩类型,这里使用的是 gzip。 [global:archive-push] 部分 这部分专门用于配置归档推送操作。 compress-level=3:定义了压缩级别,数值越高,压缩效果越好,但需要更多的 CPU 资源。
ssh免密登陆配置:
-
在1.14 和 1.15 服务器上postgres用户 配置 1.16 pgbackrest 的用户公钥
vim /home/postgres/.ssh/authorized_keys 添加 ssh-rsa AAAAB3NzNqA8iyWQPwd1QXHwWZQiMqHwViSj pgbackrest@ck-1.16 授权: chmod go-w /home/postgres/ chmod 700 /home/postgres/.ssh/ chmod 600 /home/postgres/.ssh/authorized_keys
-
在 1.16 服务器上 pgbackrest 用户 配置 1.14和1.15 postgre 的用户公钥
添加用户 groupadd pgbackrest adduser -gpgbackrest -n pgbackrest vim /home/pgbackrest/.ssh/authorized_keys 添加一下秘钥 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAA postgres@ck-1.15 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAA postgres@ck-1.14 授权: chmod go-w /home/pgbackrest/ chmod 700 /home/pgbackrest/.ssh/ chmod 600 /home/pgbackrest/.ssh/authorized_keys
设置postgresql归档
这个设置完,数据库得重启一次才行,因为 archive_mode 是psotmaster进程控制的,得重启才生效,不是sighup参数
archive_command = 'pgbackrest --stanza=test archive-push %p' archive_mode = on listen_addresses = '*' log_line_prefix = '' max_wal_senders = 3 wal_level = replica
开始备份
初始化
备份工具端初始化: pgbackrest pgbackrest --stanza=test --log-level-console=info stanza-create 主库初始化: pgbackrest pgbackrest --stanza=test --log-level-console=info stanza-create
完全备份
在备份机上操作即可 pgbackrest --stanza=test --log-level-console=info backup --type=full
增备
pgbackrest pgbackrest --stanza=test --log-level-console=info backup --type=incr
差异备份
pgbackrest pgbackrest --stanza=test --log-level-console=info backup --type=diff
查看备份库文件
[pgbackrest@ck-1.16 test]$ pwd /pgbackrest/backup/backup/test [pgbackrest@ck-1.16 test]$ ll total 28 drwxr-x--- 3 pgbackrest pgbackrest 4096 Feb 22 14:47 20240222-144623F drwxr-x--- 3 pgbackrest pgbackrest 4096 Feb 22 15:23 20240222-152217F drwxr-x--- 3 pgbackrest pgbackrest 4096 Feb 22 15:24 20240222-152217F_20240222-152451I drwxr-x--- 3 pgbackrest pgbackrest 4096 Feb 22 15:27 20240222-152217F_20240222-152747D drwxr-x--- 3 pgbackrest pgbackrest 4096 Feb 22 14:47 backup.history -rw-r----- 1 pgbackrest pgbackrest 3236 Feb 22 15:27 backup.info -rw-r----- 1 pgbackrest pgbackrest 3236 Feb 22 15:27 backup.info.copy lrwxrwxrwx 1 pgbackrest pgbackrest 33 Feb 22 15:27 latest -> 20240222-152217F_20240222-152747D
文件命令规律
F 结尾是全备,--type=full I 结尾是增备,--type=incr D 结尾是差异备份,--type=diff
恢复
这个恢复操作的一台新的postgresql主机上操作,并配置好 pgbackrest.conf 文件 和 备份机可以免密登陆 ssh 登陆
pgbackrest.conf 配置文件
[test] pg1-path=/data/pgdata pg1-socket-path=/tmp pg1-user=postgres [global] repo1-host=192.168.1.16 repo1-host-user=pgbackrest log-level-file=detail log-path=/var/log/pgbackrest
查看备份信息
pgbackrest info [pgbackrest@ck-1.16 ~]$ pgbackrest info stanza: test status: ok cipher: none db (current) wal archive min/max (12): 0000000100000002000000C4/0000000100000002000000CA full backup: 20240222-144623F timestamp start/stop: 2024-02-22 14:46:23+08 / 2024-02-22 14:47:13+08 wal start/stop: 0000000100000002000000C4 / 0000000100000002000000C4 database size: 2.9GB, database backup size: 2.9GB repo1: backup set size: 355.9MB, backup size: 355.9MB full backup: 20240222-152217F timestamp start/stop: 2024-02-22 15:22:17+08 / 2024-02-22 15:23:07+08 wal start/stop: 0000000100000002000000C6 / 0000000100000002000000C6 database size: 2.9GB, database backup size: 2.9GB repo1: backup set size: 355.9MB, backup size: 355.9MB incr backup: 20240222-152217F_20240222-152451I timestamp start/stop: 2024-02-22 15:24:51+08 / 2024-02-22 15:24:54+08 wal start/stop: 0000000100000002000000C8 / 0000000100000002000000C8 database size: 2.9GB, database backup size: 80.3KB repo1: backup set size: 355.9MB, backup size: 693B backup reference list: 20240222-152217F diff backup: 20240222-152217F_20240222-152747D timestamp start/stop: 2024-02-22 15:27:47+08 / 2024-02-22 15:27:50+08 wal start/stop: 0000000100000002000000CA / 0000000100000002000000CA database size: 2.9GB, database backup size: 80.3KB repo1: backup set size: 355.9MB, backup size: 711B backup reference list: 20240222-152217F
恢复命令
pgbackrest --stanza=test --delta --log-level-console=detail --type=time "--target=2024-02-22 15:27:50+08" restore --repo-path=/pgbackrest/backup/ --pg1-path=/data/pgdata
注意事项:
-
关于pgbackrest 配置文件的解释:
带 “host” 的参数是个服务器主机相关的,比如 repo1-host-user=pgbackrest 是代表备份记住登陆的ssh用户 不带 “host” 的参数的是postgresql 数据库相关的,比如 pg1-user=postgres 是代表登陆数据库的用户
-
从库不需要配置 pgbackrest 文件 也不需要备份集群初始化,只需要配置ssh免密登陆,因为远程备份期间,pgbackrest 工具会ssh到从库去拉数据文件
-
备份集群初始化顺序,先远程工具端初始化 --> 再数据库端初始化
pgbackrest pgbackrest --stanza=test --log-level-console=info stanza-create
-
pgbackrest 一台机上安装后,二进制bin文件可以直接拷贝到新的服务器上使用,无需再次安装
-
备份集群的名字 [test] 要和 postgresql归档库中的 名字要一致,不然会备份不了,也就是
6. 要开启从库备份,则要在 pgbackrest.conf配置文件上加上这个参数,意思是允许从库备份
[global] backup-standby=y
7 .远程备份期间 pgbackrest 会多次ssh 到主库和从库,所以免密ssh登陆一定要配置要,如果有堡垒机环境的是用不了ssh的,那很遗憾 无法使用这个pgbackrest 软件做备份
作者公众号:
参考
https://github.com/pgbackrest/pgbackrest