在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
非常重要的synchronous_commit参数 流复制的同步方式,有主库配置文件postgresql.conf,中的synchronous_commit控制着。所以理解该参数的配置十分重要。 单实例环境
流复制环境
查看同步情况在主库执行以下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 数据保护测试关闭备库。模拟备库宕机无法正常接收WAL [root@pg02 ~]# service postgresql-12 stop Stopping postgresql-12 service: [ OK ] 主库尝试进行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同步模式虽然可以很好的保护数据,但同时也带来了性能的影响,需慎重 补充:PostgreSQL 流复制数据同步检查 如何分辨主、备 看进程主库 – walwriter [root@pg01 PG_12_201909212]# ps -ef| grep wal postgres 21157 21151 0 15:57 ? 00:00:00 postgres: walwriter postgres 21168 21151 0 15:57 ? 00:00:00 postgres: walsender repuser 192.168.56.102(38473) streaming 0/2A0001C0 备库 – walreceiver [root@pg02 ~]# ps -ef | grep wal postgres 13383 13369 0 14:08 ? 00:00:01 postgres: walreceiver streaming 0/2A0001C0 函数方法一句话判断哪个是主库、哪个是备库,返回的值: f 为主库 t 为备库 postgres=# select pg_is_in_recovery(); pg_is_in_recovery ------------------- f (1 row) 那我这个就是主库喽~ 检查流复制同步情况先确定主库传到哪儿了 在确定备库接收到哪儿了 最后确定备库应用到哪儿了 检查主库传输确定主库传到什么位置了 postgres=# select pg_current_wal_lsn(); pg_current_wal_lsn -------------------- 0/2A0001C0 (1 row) 检查备库恢复确定备库接收到哪儿了 postgres=# select pg_last_wal_receive_lsn(); pg_last_wal_receive_lsn ------------------------- 0/2A0001C0 (1 row) 确定备库应用到哪儿了 postgres=# select pg_last_wal_replay_lsn(); pg_last_wal_replay_lsn ------------------------ 0/2A0001C0 (1 row) 最近事务应用的时间 postgres=# select pg_last_xact_replay_timestamp(); pg_last_xact_replay_timestamp ------------------------------- 2020-03-05 15:20:22.125688+08 (1 row) 以上为个人经验,希望能给大家一个参考,也希望大家多多支持极客世界。如有错误或未考虑完全的地方,望不吝赐教。 |
请发表评论