流复制同步异步转换
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 主从异步流复制配置