删库跑路不用怕,来看看pgbackrest最佳实践

作者

马文斌

时间

2024-02-26

标签

pgbackrest 备份 实践

服务器介绍

ip软件角色
192.168.1.14postgresprimary
192.168.1.15postgresstandby
192.168.1.16pgbackrest远程备份工具端

主从库远程备份

安装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. 在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
  2. 在 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

注意事项:

  1. 关于pgbackrest 配置文件的解释:

带 “host” 的参数是个服务器主机相关的,比如 repo1-host-user=pgbackrest 是代表备份记住登陆的ssh用户

不带 “host” 的参数的是postgresql 数据库相关的,比如 pg1-user=postgres 是代表登陆数据库的用户
  1. 从库不需要配置 pgbackrest 文件 也不需要备份集群初始化,只需要配置ssh免密登陆,因为远程备份期间,pgbackrest 工具会ssh到从库去拉数据文件

  2. 备份集群初始化顺序,先远程工具端初始化 --> 再数据库端初始化

    pgbackrest pgbackrest --stanza=test --log-level-console=info stanza-create
  3. pgbackrest 一台机上安装后,二进制bin文件可以直接拷贝到新的服务器上使用,无需再次安装

  4. 备份集群的名字 [test] 要和 postgresql归档库中的 名字要一致,不然会备份不了,也就是

    图片

图片

6. 要开启从库备份,则要在 pgbackrest.conf配置文件上加上这个参数,意思是允许从库备份

[global]
backup-standby=y

7 .远程备份期间 pgbackrest 会多次ssh 到主库和从库,所以免密ssh登陆一定要配置要,如果有堡垒机环境的是用不了ssh的,那很遗憾 无法使用这个pgbackrest 软件做备份

作者公众号:

参考

https://github.com/pgbackrest/pgbackrest

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qq_26009505

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值