流复制同步异步转换

Posted 瀚高PG实验室

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了流复制同步异步转换相关的知识,希望对你有一定的参考价值。

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

介绍

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

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

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

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

同步异步转换

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

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

示例

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生效。即使为同步复制,主库事务也无需等待。此种情况也可以看做是另一种“同步转异步”

示例

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.

以上是关于流复制同步异步转换的主要内容,如果未能解决你的问题,请参考以下文章

金庸武功之“”左右互搏术“”postgresql 主从异步流复制配置

PostgreSql基于Standby的异步流主从复制

pg流复制

从同步代码调用异步方法并阻塞直到任务完成的正确方法是啥? [复制]

PG流复制一些东西

pgsql物理复制(pgsql 备库的搭建以及角色互换,提升)