PostgreSQL 流复制异步转同步的操作

 更新时间:2020年12月31日 08:40:55   作者:董董-酱  
这篇文章主要介绍了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

数据保护测试

关闭备库。模拟备库宕机无法正常接收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)

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。如有错误或未考虑完全的地方,望不吝赐教。

相关文章

  • postgresql查询自动将大写的名称转换为小写的案例

    postgresql查询自动将大写的名称转换为小写的案例

    这篇文章主要介绍了postgresql查询自动将大写的名称转换为小写的案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • Ubuntu中卸载Postgresql出错的解决方法

    Ubuntu中卸载Postgresql出错的解决方法

    这篇文章主要给大家介绍了关于在Ubuntu中卸载Postgresql出错的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2017-09-09
  • PostgreSQL中如何将对象oid和对象名相互转换

    PostgreSQL中如何将对象oid和对象名相互转换

    文章介绍了在PostgreSQL中如何使用内部数据类型将对象OID(对象标识符)转换为对象名,从而简化系统视图的关联查询,文章还提供了不同类型OID与对象名之间的转换关系,并通过示例展示了如何将对象名转换为OID
    2024-11-11
  • CentOS 9 Stream 上安装 PostgreSQL 16的步骤

    CentOS 9 Stream 上安装 PostgreSQL 16的步

    在CentOS9Stream上安装PostgreSQL16,首先添加PostgreSQL官方仓库,然后禁用系统自带PostgreSQL版本,避免冲突,使用dnf命令安装PostgreSQL16,并初始化数据库,本文给大家介绍CentOS 9 Stream 上安装 PostgreSQL 16的步骤,感兴趣的朋友一起看看吧
    2024-11-11
  • PostgreSQL事务回卷实战案例详析

    PostgreSQL事务回卷实战案例详析

    前段时间在公司小范围做了一个关于PG事务实现的讲座,最后总结了一个摘要性的东西,分享一下,这篇文章主要给大家介绍了关于PostgreSQL事务回卷实战案例的相关资料,需要的朋友可以参考下
    2022-03-03
  • 关于PostgreSQL JSONB的匹配和交集问题

    关于PostgreSQL JSONB的匹配和交集问题

    这篇文章主要介绍了PostgreSQL JSONB的匹配和交集问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • 关于PostgreSql数据库与mysql数据库的不同点以及注意事项

    关于PostgreSql数据库与mysql数据库的不同点以及注意事项

    PostgreSQL和MySQL是两种流行的关系型数据库管理系统(RDBMS),它们都可以用来存储和管理数据,但是它们在某些方面有所不同,下面这篇文章主要给大家介绍了关于PostgreSql数据库与mysql数据库的不同点以及注意事项的相关资料,需要的朋友可以参考下
    2023-05-05
  • PostgreSQL的upsert实例操作(insert on conflict do)

    PostgreSQL的upsert实例操作(insert on conflict do)

    这篇文章主要介绍了PostgreSQL的upsert实例操作(insert on conflict do),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • PostgreSQL归档配置及自动清理归档日志的操作

    PostgreSQL归档配置及自动清理归档日志的操作

    这篇文章主要介绍了PostgreSQL归档配置及自动清理归档日志的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • postgresql关于like%xxx%的优化操作

    postgresql关于like%xxx%的优化操作

    这篇文章主要介绍了postgresql关于like%xxx%的优化操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01

最新评论