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
操作时,从库上对应的表也会锁住无法查询。
Feedback
Was this page helpful?
Glad to hear it! Please tell us how we can improve.
Sorry to hear that. Please tell us how we can improve.
最后修改 2022-05-18