基于PostgreSQL流复制的容灾库架构设想及实现

本文探讨了PostgreSQL流复制的容灾库架构,利用recovery_min_apply_delay参数实现延迟应用,以应对误操作恢复。当发生delete、truncate、drop等误操作时,通过控制备库的replay时机,结合pg_dump进行数据恢复,从而减少业务停摆时间。
摘要由CSDN通过智能技术生成

点击上方"蓝字"

关注我们,享更多干货!

一、前言

这几天在对PostgreSQL流复制的架构进行深入研究,其中一个关键的参数:recovery_min_apply_delay引起了我的注意,设置该参数的大概意思是:在进行流复制的时候,备库会延迟主库recovery_min_apply_delay的时间进行应用。比如说,我们在主库上insert10条数据,不会立即在备库上生效,而是在recovery_min_apply_delay的时间后,备库才能完成应用。

另外,我们知道在PostgreSQL中,其mvcc机制并不像Oracle或者MySQL一样,将旧版本数据存放在另外的空间中,而是通过对事务号(xid)的控制对旧版本数据不可见的方式进行实现。所以PostgreSQL中无法实现类似于Oracle的闪回机制。

在日常操作过程中,对表进行delete、truncate、drop等误操作都不能通过闪回来快速恢复。不怕一万,就怕万一,在做数据库维护的6年多里,遇到过的误操作还是很多。那么在PostgreSQL这种无法实现闪回的数据库中,如果出现误操作如何快速恢复呢?

二、架构简介

对于PostgreSQL数据库这种无法进行闪回的数据库来讲,最常用的办法就是通过备份+归档的方式进行数据恢复。但是这种恢复方式也有弊端,当数据库非常大时,恢复全量备份也会非常的慢,而且如果全量备份是一周前或者更久前的,那么恢复归档也会需要比较长的时间。这段时间内,可能业务就会长时间停摆,造成一定的损失。

如果通过流复制延迟特性作为生产数据库的容灾库,则可以从一定程度上解决该问题,其简单架构如下:

三、恢复步骤

PostgreSQL流复制容灾库架构的误操作恢复步骤如下:

1.主库出现误操作,查看流复制的replay状态;

2.在recovery_min_apply_delay时间内,暂停备库的replay;

3.判断主库出现的误操作类型(delete/truncate/drop);

4.根据主库误操作类型,对备库进行相应的操作;

5.通过pg_dump将误操作表导出;

6.在主库对pg_dump出的表进行恢复。

假设当前备库与主库相差10min,则误操作可以分为以下两个场景:

1)delete操作:

首先我们需要知道的是,针对delete操作,PostgreSQL会给相关表加一个ROW EXCLUSIVE锁,而该锁不会对select等dql操作进行阻塞。

所以当我们在主库进行delete误操作后,备库则会晚10min中进行replay。且此时可以对该表进行查询和pg_dump的导出。针对于主库delete误操作,恢复步骤如下:

第一步,查看流复制replay的状态,重点关注replay_lsn字段:

select * from pg_stat_replication;
postgres=# select * from pg_stat_replication;
-[ RECORD 1 ]----+------------------------------
pid              | 55694
usesysid         | 24746
usename          | repl
application_name | walreceiver
client_addr      | 192.168.18.82
client_hostname  | 
client_port      | 31550
backend_start    | 2021-01-20 09:54:57.039779+08
backend_xmin     | 
state            | streaming
sent_lsn         | 6/D2A17120
write_lsn        | 6/D2A17120
flush_lsn        | 6/D2A17120
replay_lsn       | 6/D2A170B8
write_lag        | 00:00:00.000119
flush_lag        | 00:00:00.000239
replay_lag       | 00:00:50.653858
sync_priority    | 0
sync_state       | async
reply_time       | 2021-01-20 14:11:31.704194+08

此时可以发现数据库中的replay_lsn字段的lsn值要比sent_lsn/write_lsn/flush_lsn都要小;

第二步,为了防止处理或者导出时间过慢而导致的数据同步,立即暂停备库的replay:

select * from pg_wal_replay_pause();

查看同步状态:

postgres=# select * from pg_is_wal_replay_paused();  

 pg_is_wal_replay_paused 
-------------------------
 t
(1 row)

第三步,在备库查看数据是否存在:

select * from wangxin1;

第四步,通过pg_dump,将表内容导出:

pg_dump -h 192.168.18.182 -p 18802 -d postgres -U postgres -t wangxin1 --data-only --i
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值