PGSQL Delayed Cluster 延时集群
本文介绍PostgreSQL延时从库集群 —— 专门用于应对删库删表问题的特殊从库
高可用与主从复制可以解决机器硬件故障带来的问题,但无法解决软件Bug与人为操作导致的故障,例如:误删库删表。误删数据通常需要用到冷备份,但另一种更优雅高效快速的方式是事先准备一个延迟从库。
您可以使用 备份集群 的功能创建延时从库,例如,现在您希望为pg-test
集群指定一个延时从库:pg-testdelay
,该集群是pg-test
1小时前的状态。因此如果出现了误删数据,您可以立即从延时从库中获取并回灌入原始集群中。
# pg-test是原始数据库
pg-test:
hosts:
10.10.10.11: { pg_seq: 1, pg_role: primary }
vars:
pg_cluster: pg-test
pg_version: 14
pg_users: [ { name: test , password: test , pgbouncer: true , roles: [ dbrole_admin ] } ]
pg_databases: [ { name: test } ]
# pg-test2将作为pg-test1的Standby Cluster
pg-test2:
hosts:
10.10.10.12: { pg_seq: 1, pg_role: primary , pg_upstream: 10.10.10.11 , pg_delay: 10min }
10.10.10.13: { pg_seq: 2, pg_role: replica }
vars:
pg_cluster: pg-test2
pg_version: 14 # 制作Standby Cluster时,数据库大版本必须保持一致!
创建完毕后,在元节点使用 pg edit-config pg-testdelay
编辑延时集群的Patroni配置文件,修改 standby_cluster.recovery_min_apply_delay
为你期待的值,例如1h
,应用即可。(注意分钟的单位是min
不是m
)
standby_cluster:
create_replica_methods:
- basebackup
host: 10.10.10.11
port: 5432
+ recovery_min_apply_delay: 1h
注意事项
您需要确保整个原始集群始终有微量的写入(例如用一张心跳表来实现),否则如果当整个集群处于完全没有写入的静止状态时,当主库上执行DROP TABLE
或TRUNCATE TABLE
操作时,从库上对应的表也会锁住无法查询。
最后修改 2022-06-05: add pgsql/deploy document (34a3325)