pgrwl 是一个云原生 PostgreSQL WAL 接收器。流式传输、压缩、加密、上传、保留和监控您的 WAL 存档。
官方文档: https://github.com/hashmap-kz/pgrwl
这里简单起见,直接使用docker演示。
准备一个pg,单机即可,并创建好备份用的数据库账号。
docker pull quay.io/hashmap_kz/pgrwl:latest
作用:接收wal log并存到本地
生成配置文件
cat <<EOF > receive_mode_config.yml
main:
listen_port: 7070
directory: wals
receiver:
slot: pgrwl_v5
log:
level: trace
format: text
add_source: true
EOF
启动
docker run -ti --rm --name pgrwl-demo -v ./receive_mode_config.yml:/tmp/config.yml -e PGRWL_MODE=receive -e PGHOST=192.168.3.14 -e PGPORT=5432 -e PGUSER=dts -e PGPASSWORD=dts quay.io/hashmap_kz/pgrwl start --config /tmp/config.yml
然后,可以在上游的pg上做一些操作,例如:
create database db1;
SELECT pg_switch_wal();
create database db2;
SELECT pg_switch_wal();
然后,去pgrwl容器里查看下接受到的 wal log情况
docker exec -ti pgrwl-demo bash
b9f93b90d65a:/#
b9f93b90d65a:/# cd /wals/
b9f93b90d65a:/wals# pwd
/wals
8d487e8f00a0:/wals# ls -lhrt
total 100M
-rw-r----- 1 root root 16.0M Jun 18 07:53 000000010000000000000001
-rw-r----- 1 root root 16.0M Jun 18 07:53 000000010000000000000002
-rw-r----- 1 root root 16.0M Jun 18 07:53 000000010000000000000003
-rw-r----- 1 root root 16.0M Jun 18 07:54 000000010000000000000004
-rw-r----- 1 root root 16.0M Jun 18 07:54 000000010000000000000005
-rw-r----- 1 root root 16.0M Jun 18 07:58 000000010000000000000006
-rw-r----- 1 root root 16.0M Jun 18 07:59 000000010000000000000007.partial
可以看到 /wals 目录下,已经将上游的wal log同步过来了。作用:在还原期间使用 Serve 模式从存储中提供存档的 WAL 文件。看github上,大致功能是从s3(或sftp)中提取wal-log。
具体暂时没测过。
作用:备份数据库实例
cat <<EOF > backup_mode_config.yml
main:
listen_port: 7070
directory: wals
backup:
cron: "0 0 0 */3 * *"
retention:
enable: true
type: time
value: "96h"
log:
level: trace
format: text
add_source: true
EOF
docker run -ti --rm --name pgrwl-demo -v ./backup_mode_config.yml:/tmp/config.yml -v ./wals:/wals -e PGHOST=192.168.3.14 -e PGPORT=5432 -e PGUSER=dts -e PGPASSWORD=dts quay.io/hashmap_kz/pgrwl backup --config /tmp/config.yml
查看生成的备份文件
# root @ centos73 in ~
$ ls -lhrt
drwxr-xr-x 3 root root 21 2025-06-18 16:41 wals
# root @ centos73 in ~
$ l wals
总用量 0
drwxr-x--- 3 root root 28 2025-06-18 16:41 backups
# root @ centos73 in ~
$ l wals/backups
总用量 0
drwxr-x--- 2 root root 49 2025-06-18 16:41 20250618084149
# root @ centos73 in ~
$ l wals/backups/20250618084149
总用量 76M
-rw-r--r-- 1 root root 76M 2025-06-18 16:41 base.tar
-rw-r--r-- 1 root root 33 2025-06-18 16:41 20250618084149.json更复杂的写法:(将备份文件传到远程ssh机器上)
$ cat backup_mode_config.yml
main:
listen_port: 7070
directory: wals
backup:
cron: "0 0 0 */3 * *"
retention:
enable: true
type: time
value: "96h"
log:
level: trace
format: text
add_source: true
storage:
name: sftp
compression:
algo: gzip
encryption:
algo: aes-256-gcm
pass: "Abcd@1234"
sftp:
host: 192.168.31.12
port: 22
user: root
pass: "Abcd1111"
base_dir: "/mnt/wal-archive"
pkey_path: "/root/.ssh/id_rsa"
启动容器:
docker run -ti --rm --name pgrwl-demo -v /root/.ssh/id_rsa:/root/.ssh/id_rsa -v ./backup_mode_config.yml:/tmp/config.yml -v ./wals:/wals -e PGHOST=192.168.3.14 -e PGPORT=5432 -e PGUSER=dts -e PGPASSWORD=dts quay.io/hashmap_kz/pgrwl backup --config /tmp/config.yml
然后,在 192.168.31.12 机器的 /mnt/wal-archive 目录下,就可以看到传过来的备份文件了。
[root@192.168.31.12 ~]# tree /mnt/wal-archive/
/mnt/wal-archive/
└── wals
└── backups
└── 20250618084824
├── 20250618084824.json.gz.aes
└── base.tar.gz.aes整个过程可能如下所示(一个典型的、粗略的和简化的示例):
典型的生产设置在集群中运行两个 pgrwl StatefulSet。
一个处于接收模式,用于连续 WAL 流 ,另一个处于备份模式,用于计划的基本备份 。
例如, 每三天一次, 使用流式 BaseBackup,具有可选的压缩和加密功能。生成的备份也会上传到配置的远程存储 ,并受保留策略的约束以进行清理。内置的 cron 调度程序支持全自动备份,无需外部编排。
在恢复期间,可以将相同的 receive StatefulSet 重新配置为在 serve 模式下运行,
通过 HTTP 公开以前存档的 WAL,以通过 restore_command 支持时间点恢复(PITR) 。
通过此设置,您可以在发生崩溃时使用最新的基础备份和可用的 WAL 段将集群恢复到过去三天内的任何一秒 。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。