PostgreSQL 流复制异步转同步

非常重要的synchronous_commit参数

流复制的同步方式,有主库配置文件postgresql.conf,中的synchronous_commit控制着。所以理解该参数的配置十分重要。

单实例环境

参数值说明优点缺点
on 或 local当事务提交时,WAL先写入WAL buffer 再写到 WAL文件(落盘)中。设置为on表示提交事务时需要等待本地WAL最终落盘后,才向客户端返回成功。非常安全数据库性能有损耗
off当事务提交时,不需要等待WAL先写入WAL buffer 再写到 WAL文件(落盘)中。提升数据库性能数据库宕机是最新提交的少量事务可能丢失

流复制环境

参数值说明优点缺点
remote_write当主库提交事务后,需等待备库接收主库发送的WAL日志流并写入WAL buffer, 就向客户端返回成功只有主库的WAL是落盘的事务响应时间快
on当主库提交事务后,需等待备库接收主库发送的WAL日志流并写入WAL buffer 以及写入WAL文件, 就向客户端返回成功主、备库WAL均落盘,有两份持有化文件保护事务响应时间相对较慢
remote_apply当主库提交事务后,需等待备库接收主库发送的WAL日志流并写入WAL buffer 以及写入WAL文件, 同时备库apply之后, 就向客户端返回成功数据保护最好影响事务性能

查看同步情况

在主库执行以下SQL , sync_state字段为async表示异步同步方式

postgres=# select usename , application_name , client_addr,sync_state from pg_stat_replication;
 usename | application_name |  client_addr   | sync_state 
---------+------------------+----------------+------------
 repuser | walreceiver      | 192.168.56.102 | async
(1 row)

配置同步复制

  • 主库配置postgresql.conf文件
[postgres@pg01 data]$ vi postgresql.conf 
synchronous_commit = on
synchronous_standby_names = 'walreceiver'

synchronous_commit : 开篇提到的那个重要参数!
synchronous_standby_names: 这里的name填写,刚刚查询到的application_name。

  • 重启主库服务
[root@pg01 PG_12_201909212]# service postgresql-12 restart
Stopping postgresql-12 service:                            [  OK  ]
Starting postgresql-12 service:                            [  OK  ]

再次查看主库字典

postgres=# select usename , application_name , client_addr,sync_state from pg_stat_replication;
 usename | application_name |  client_addr   | sync_state 
---------+------------------+----------------+------------
 repuser | walreceiver      | 192.168.56.102 | sync

数据保护测试

  1. 关闭备库。模拟备库宕机无法正常接收WAL
[root@pg02 ~]# service postgresql-12 stop
Stopping postgresql-12 service:                            [  OK  ]
  1. 主库尝试进行DML操作
dong=# insert into t1 select * from t1;




Cancel request sent
WARNING:  canceling wait for synchronous replication due to user request
DETAIL:  The transaction has already committed locally, but might not have been replicated to the standby.
INSERT 0 8

由于备库已关闭,无法接受从主库传来的WAL,根据同步规则,主库需要一直等待主库接收到WAL的消息。
手动进行了cancel, 数据库报错。说明在等待备库reguest相应。

所以,sync同步模式虽然可以很好的保护数据,但同时也带来了性能的影响,需慎重

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是 Docker PostgreSQL12 复制主从同步的配置和切换步骤: 1. 首先,在主数据库中修改 postgresql.conf 和 pg_hba.conf 文件,分别设置复制相关参数和允许从服务器连接。 postgresql.conf 文件中需要设置以下参数: ``` wal_level = replica max_wal_senders = 5 wal_keep_segments = 32 ``` pg_hba.conf 文件中需要添加以下规则: ``` host replication all <从服务器IP地址>/32 md5 ``` 2. 重新启动主服务器,使配置生效。 3. 在从服务器中创建一个空的目标数据库,并且在 postgresql.conf 文件中设置以下参数: ``` hot_standby = on ``` 4. 使用 pg_basebackup 命令将主服务器上的数据复制到从服务器上: ``` pg_basebackup -h <主服务器IP地址> -U <用户名> -D /var/lib/postgresql/data -P --xlog-method=stream ``` 5. 在从服务器中创建一个 recovery.conf 文件,指定复制配置参数: ``` standby_mode = on primary_conninfo = 'host=<主服务器IP地址> port=<主服务器端口> user=<用户名> password=<密码>' ``` 6. 启动从服务器。 7. 可以使用 pg_ctl 命令来检查主从同步状态: ``` pg_ctl status -D /var/lib/postgresql/data ``` 8. 如果需要切换主从角色,需要在从服务器上执行以下步骤: - 在主服务器上停止 PostgreSQL 服务; - 在从服务器上编辑 recovery.conf 文件,修改 primary_conninfo 参数为从服务器的连接信息; - 在从服务器上启动 PostgreSQL 服务; - 验证从服务器是否已成为新的主服务器。 希望这些步骤能够帮助到你,如果有任何问题,请随时问我。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值