首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >postgresql之pgrwl的使用

postgresql之pgrwl的使用

原创
作者头像
保持热爱奔赴山海
发布2025-06-18 17:04:47
发布2025-06-18 17:04:47
3470
举报
文章被收录于专栏:数据库相关数据库相关

pgrwl 是一个云原生 PostgreSQL WAL 接收器。流式传输、压缩、加密、上传、保留和监控您的 WAL 存档。

官方文档: https://github.com/hashmap-kz/pgrwl

这里简单起见,直接使用docker演示。

准备一个pg,单机即可,并创建好备份用的数据库账号。

docker pull quay.io/hashmap_kz/pgrwl:latest

Receive Mode

作用:接收wal log并存到本地

代码语言:txt
复制
生成配置文件
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 Mode

作用:在还原期间使用 Serve 模式从存储中提供存档的 WAL 文件。看github上,大致功能是从s3(或sftp)中提取wal-log。

具体暂时没测过。

Backup Mode

作用:备份数据库实例

代码语言:txt
复制
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机器上)

代码语言:txt
复制
$ 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 流 ,另一个处于备份模式,用于计划的基本备份 。

  • 在接收模式下,pgrwl 会持续流式传输 WAL文件,应用可选的压缩和加密,将它们上传到远程存储 (例如 S3 或 SFTP),并强制执行保留策略,例如,将 WAL 文件保留四天 。
  • 在备份模式下,它会按照配置的计划执行 PostgreSQL 集群的完整基本备份

例如, 每三天一次, 使用流式 BaseBackup,具有可选的压缩和加密功能。生成的备份也会上传到配置的远程存储 ,并受保留策略的约束以进行清理。内置的 cron 调度程序支持全自动备份,无需外部编排。

在恢复期间,可以将相同的 receive StatefulSet 重新配置为在 serve 模式下运行,

通过 HTTP 公开以前存档的 WAL,以通过 restore_command 支持时间点恢复(PITR) 。

通过此设置,您可以在发生崩溃时使用最新的基础备份和可用的 WAL 段将集群恢复到过去三天内的任何一秒 。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Receive Mode
  • Serve Mode
  • Backup Mode
  • 灾难恢复使用案例
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档