流复制同步异步转换

作者:瀚高PG实验室(Highgo PG Lab)-Chrisx


@[toc]


## 介绍


数据库流复制支持同步和异步方式,同步方式能提供最大保护,异步方式能提供最大可用。同步方式在网络异常或备库宕机情况下,主库操作也会受影响,事务操作会出现等待状态。当出现以上场景时,我们总是希望进行降级,将同步转为异步,避免主库hang住。


 - 如果实在无法保持所要求数量的同步后备,那么应该减少synchronous_standby_names中指定的事务提交应该等待其回应的同步后备的数量(或者禁用),并且在主服务器上重载配置文件。

   

 - 即便当同步复制被启用时,个体事务也可以被配置为不等待复制,做法是将synchronous_commit参数设置为local或off。


基于以上描述,可以实现流复制同步异步转换操作。必要时,可直接将同步复制降级为异步复制。


## 同步异步转换


修改synchronous_standby_names,然后reload生效。也就是说转换过程不需要重启服务器,这一点非常方便的。


 - 同步流复制,synchronous_standby_names指定需要启用同步复制策略的备用服务器

 - 异步流复制,synchronous_standby_names为空


示例


```sql

alter system set synchronous_standby_names='standby12';

select pg_reload_conf();


此时关闭备库,主库执行insert,主库hang住


alter system set synchronous_standby_names='';

select pg_reload_conf();


此时insert就执行成功了

```


## 同步复制不等待

修改synchronous_commit参数设置为local或off,reload生效。即使为同步复制,主库事务也无需等待。此种情况也可以看做是另一种“同步转异步”


示例


```sql

alter system set synchronous_standby_names='standby12';

alter system set synchronous_commit=local;

select pg_reload_conf();


此时关闭备库,主库执行insert,主库不受影响。但是注意


DETAIL:  The transaction has already committed locally, but might not have been replicated to the standby.

```


请使用浏览器的分享功能分享到微信等