PostgreSQL 流复制异步转同步的操作
非常重要的synchronous_commit参数
流复制的同步方式,有主库配置文件postgresql.conf,中的synchronous_commit控制着。所以理解该参数的配置十分重要。
单实例环境on 或 local 当事务提交时,WAL先写入WAL buffer 再写到 WAL文件(落盘)中。设置为on表示提交事务时需要等待本地WAL最终落盘后,才向客户端返回成功。 数据库性能有损耗
remote_write 当主库提交事务后,需等待备库接收主库发送的WAL日志流并写入WAL buffer, 就向客户端返回成功 只有主库的WAL是落盘的 事务响应时间快
当主库提交事务后,需等待备库接收主库发送的WAL日志流并写入WAL buffer 以及写入WAL文件, 就向客户端返回成功 主、备库WAL均落盘,有两份持有化文件保护 事务响应时间相对较慢
remote_apply 当主库提交事务后,需等待备库接收主库发送的WAL日志流并写入WAL buffer 以及写入WAL文件, 同时备库apply之后, 就向客户端返回成功 数据保护最好 影响事务性能
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)
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。如有错误或未考虑完全的地方,望不吝赐教。
我想要获取技术服务或软件
服务范围:MySQL、ORACLE、SQLSERVER、MongoDB、PostgreSQL 、程序问题
服务方式:远程服务、电话支持、现场服务,沟通指定方式服务
技术标签:数据恢复、安装配置、数据迁移、集群容灾、异常处理、其它问题
本站部分文章参考或来源于网络,如有侵权请联系站长。
数据库远程运维 PostgreSQL 流复制异步转同步的操作
相关文章
- 什么是异步传输模式和同步传输模式_什么是异步传输模式交换技术
- 为什么vuex的Mutations是同步,而Actions是异步
- 跨系统实时同步数据解决方案
- 线程同步练习:存钱问题
- distcp 并行同步脚本
- 体验PostgreSQL之精彩:驱动新体验(postgresql驱动)
- ?探究PostgreSQL:一款强大的数据库系统(postgresql是什么)
- 快速学会PostgreSQL中导入SQL文件(postgresql导入sql文件)
- 性能调优优化PostgreSQL内核性能的必要之道(postgresql内核)
- 称谓PostgresQL专家的荣耀(postgresql专家)
- 招聘PostgreSQL攻城狮:让你的技能大放异彩(postgresql招聘)
- Linux 双机同步:无线同步数据的快捷方式(linux双机同步)
- 份使用PostgreSQL实现高效的热备份(postgresql热备)
- PostgreSQL实现表数据精准分区(postgresql表分区)
- PostgreSQL性能调优实践(postgresql调优)
- PostgreSQL实现高可用部署(postgresql高可用)
- PostgreSQL中文手册详解数据库操作技巧(postgresql中文手册)
- 快速同步:Linux下的代码同步技术(linux代码同步)
- 简易教程:Linux下如何快速安装PostgreSQL数据库(linux安装postgresql)
- 深入解析PostgreSQL扩展:优化数据库性能与拓展功能(postgresql扩展)
- PostgreSQL 语法简单易懂的使用方法(postgresql语法)
- MySQL表之间的数据同步机制(mysql 表 同步)
- PostgreSQL拼接技巧:实现高效数据整合(postgresql拼接)
- 编译PostgreSQL:一步一步实现数据库功能(postgresql编译)
- PostgreSQL论坛:聚焦数据库技术分享与交流!(postgresql论坛)
- 官方文档PostgreSQL:正式中文文档(postgresql中文)
- 表数据同步之Redis实现(表同步redis)
- 实现集群用4台MySQL服务器做数据同步(4台mysql实现同步)
- c#.net多线程编程教学——线程同步
- discuz免激活同步登入代码修改方法(discuz同步登录)