PGSQL Delayed Cluster 延时集群

本文介绍PostgreSQL延时从库集群 —— 专门用于应对删库删表问题的特殊从库

高可用与主从复制可以解决机器硬件故障带来的问题,但无法解决软件Bug与人为操作导致的故障,例如:误删库删表。误删数据通常需要用到冷备份,但另一种更优雅高效快速的方式是事先准备一个延迟从库。

您可以使用 备份集群 的功能创建延时从库,例如,现在您希望为pg-test 集群指定一个延时从库:pg-testdelay,该集群是pg-test1小时前的状态。因此如果出现了误删数据,您可以立即从延时从库中获取并回灌入原始集群中。

  1. # pg-test是原始数据库
  2. pg-test:
  3. hosts:
  4. 10.10.10.11: { pg_seq: 1, pg_role: primary }
  5. vars:
  6. pg_cluster: pg-test
  7. pg_version: 14
  8. pg_users: [ { name: test , password: test , pgbouncer: true , roles: [ dbrole_admin ] } ]
  9. pg_databases: [ { name: test } ]
  10. # pg-test2将作为pg-test1的Standby Cluster
  11. pg-test2:
  12. hosts:
  13. 10.10.10.12: { pg_seq: 1, pg_role: primary , pg_upstream: 10.10.10.11 , pg_delay: 10min }
  14. 10.10.10.13: { pg_seq: 2, pg_role: replica }
  15. vars:
  16. pg_cluster: pg-test2
  17. pg_version: 14 # 制作Standby Cluster时,数据库大版本必须保持一致!

创建完毕后,在元节点使用 pg edit-config pg-testdelay编辑延时集群的Patroni配置文件,修改 standby_cluster.recovery_min_apply_delay 为你期待的值,例如1h,应用即可。(注意分钟的单位是min不是m

  1. standby_cluster:
  2. create_replica_methods:
  3. - basebackup
  4. host: 10.10.10.11
  5. port: 5432
  6. + recovery_min_apply_delay: 1h

注意事项

您需要确保整个原始集群始终有微量的写入(例如用一张心跳表来实现),否则如果当整个集群处于完全没有写入的静止状态时,当主库上执行DROP TABLETRUNCATE TABLE操作时,从库上对应的表也会锁住无法查询。

最后修改 2022-06-05: add pgsql/deploy document (34a3325)