广告
返回顶部
首页 > 资讯 > 数据库 >PostgreSql基于Standby的异步流主从复制
  • 393
分享到

PostgreSql基于Standby的异步流主从复制

2024-04-02 19:04:59 393人浏览 薄情痞子
摘要

一、概述postgresql从9.0版本之后推出一个类似于oracle的active dataguard和Mysql中继日志一样的日志传送。我们借助这个功能就可实现Postgresql的主从复制。基本原理就

一、概述

postgresql从9.0版本之后推出一个类似于oracle的active dataguard和Mysql中继日志一样的日志传送。我们借助这个功能就可实现Postgresql的主从复制。

基本原理就是,通常一台主数据库提供读写,然后把数据同步到另一台从库。从库不断apply从主库接收到的数据,从库不提供写服务,只对外提供读服务。在postgresql中提供读写全功能的服务器称为primary database或master database,在接收主库同步数据的同时又能提供读服务的从库服务器称为hot standby server。

PostgreSQL在数据目录下的pg_xlog子目录中维护了一个WAL日志文件,该文件用于记录数据库文件的每次改变,这种日志文件机制提供了一种数据库热备份的方案,即:在把数据库使用文件系统的方式备份出来的同时也把相应的WAL日志进行备份,即使备份出来的数据块不一致,也可以重放WAL日志把备份的内容推到一致状态。这也就是基于时间点的备份(Point-in-Time Recovery),简称PITR。而把WAL日志传送到另一台服务器有两种方式,分别是:

1. WAL日志归档(base-file)

2. 流复制(streaming replication)

第一种是写完一个WAL日志后,才把WAL日志文件拷贝到standby数据库中,简言之就是通过cp命令实现远程备份,这样通常备库会落后主库一个WAL日志文件。而第二种流复制是postgresql9.x之后才提供的新的传递WAL日志的方法,它的好处是只要master库一产生日志,就会马上传递到standby库,同第一种相比有更低的同步延迟,所以我们肯定也会选择流复制的方式。

在实际操作之前还有一点需要说明就是standby的搭建中最关键的一步——在standby中生成master的基础备份。postgresql9.1之后提供了一个很方便的工具—— pg_basebackup,关于它的详细介绍和参数说明可以在官网中查看(pg_basebackup tool),下面在搭建过程中再做相关具体说明。

二、基础环境介绍

系统平台:Centos release 6.6 (Final)

Postgresql:postgresql-9.6.6

SElinux=disabled

Iptables关闭

主库(master)IP:192.168.221.161

从库(standby)IP:192.168.221.160

 

基础环境搭建可以参考前一篇文章(Centos6.6下Postgresql9.6.6安装与配置),也就是PostgreSql的基本安装与配置。

三、主库配置

1. 在主库增加同步的用户名与密码

[postgres@MidApp ~]$ psql 
psql (9.6.6)
Type "help" for help.
 
postgres=# CREATE ROLE repluser REPLICATION LOGIN PASSWord '123456';
CREATE ROLE
postgres=#


2. 修改/home/postgres/pgsql/data/pg_hba.conf,最后一行添加

[root@MidApp tmp]# tail -6 /home/postgres/pgsql/data/pg_hba.conf 
# Allow replication connections from localhost, by a user with the
# replication privilege.
#local replication postgres trust
#host replication postgres 127.0.0.1/32 trust
#host replication postgres ::1/128 trust
Host replication repluser  192.168.221.160/32 md5


这行配置意思是允许用户repluser从192.168.221.160这台主机上以md5 加密的形式发起到本数据库的流复制连接

3. 在主配置文件下配置下面几个参数

listen_address = ‘*’(默认localhost)
wal_level = hot_standby(默认是minimal)
max_wal_senders=5(默认是0)
wal_keep_segments=64(默认是0)
synchronous_standby_names = 'standby01'


第一个参数表示监听所有IP;第二个参数表示启动hot standby;第三个参数表示主库可以有多少个并发的standby数据库,这里设置为5;第四个参数表示一个WAL日志文件大小,默认为16M

 PostgreSql基于Standby的异步流主从复制

第五个参数指定同步复制的Standby名称(从库的recovery.conf中有要定义的地方,不过这一个参数可以不设置)

4. 重启主库,让配置生效。

如果启动有报错,可以去日志排查。

四、从库配置

首先要保证主库、从库之间的同步之前的环境的是一致的,这样才方便做同步。我因为之前就在从库机器上配置过PG数据库,所以一开始走了不少弯路。最后把PG的家目录清空,重新再来一次才算成功。

1. 在从库上通过pg_basebackup命令行工具生成基础备份,命令如下,看到100%说明备份成功

[root@DB tmp]# pg_basebackup -h 192.168.221.161 -F p -P -D /home/postgres/pgsql/data -p5432 -U repluser --password
Password: 
22802/22802 kB (100%), 1/1 tablespace
NOTICE:  WAL archiving is not enabled; you must ensure that all required WAL segments are copied through other means to comple


参数说明:-h 指定连接的数据库IP;

-F 指定输出的格式,支持p(plain原样输出)或者t(tar格式输出)

-P 在备份过程中实时打印备份进度

-D 指定备份的目录

-U 指定连接的用户名

-p 指定要连接的端口

--password 指定要连接的用户密码

其他参数介绍:

-R 会在备份后自动生成recovery.conf文件,我也是事后才知道这个参数

-l 指定一个备份的标识

具体的参数介绍可以使用pg_basebackup --help查看,也可以查看官网介绍https://www.postgresql.org/docs/current/static/app-pgbasebackup.html

特别备注:我这里没有加-R参数,所以要手动拷贝一下recovery.conf

cp /home/postgres/pgsql/share/recovery.conf.sample /home/postgres/pgsql/data/recovery.conf


添加以下信息:

standby_mode = on
primary_conninfo = 'application_name=standby01 user=repluser password=123456 host=192.168.221.161 port=5432 sslmode=disable sslcompression=1'


2. 修改从库的主配置文件/home/postgres/pgsql/data/postgresql.conf

hot_standby = on


将hot_standby改为启用状态

3. 接下来可以启动从库了

[root@DB tmp]# /etc/init.d/postgresql start
Starting PostgreSQL: -bash: /home/postgres/pgsql/data/serverlog: Permission denied
ok


第一次启动报错,这是因为上面生成备份的命令我使用root用户执行的,导致PG家目录的属性变成了root,所以要重新设置权限

chown -R postgres:postgres /home/postgres/pgsql/*


再次启动正常,查看进程也OK

[root@DB tmp]# /etc/init.d/postgresql start
Starting PostgreSQL: ok
[root@DB tmp]# ps -ef | grep postg
root      52577  82731  0 15:12 pts/0    00:00:00 su - postgres
postgres  52578  52577  0 15:12 pts/0    00:00:00 -bash
postgres  74295      1  0 20:01 ?        00:00:00 /home/postgres/pgsql/bin/postmaster -D /home/postgres/pgsql/data
postgres  74296  74295  0 20:01 ?        00:00:00 postgres: startup process   recovering 000000010000000000000003 
postgres  74297  74295  5 20:01 ?        00:00:00 postgres: wal receiver process   streaming 0/3000140            
postgres  74298  74295  0 20:01 ?        00:00:00 postgres: checkpointer process                                  
postgres  74299  74295  0 20:01 ?        00:00:00 postgres: writer process                                        
postgres  74300  74295  0 20:01 ?        00:00:00 postgres: stats collector process

                         

五、结果验证

1. 在主库通过select usename,application_name,client_addr,state from pg_stat_replication查询一下:

[postgres@MidApp ~]$ psql 
psql (9.6.6)
Type "help" for help.
 
postgres=# select usename,application_name,client_addr,state from pg_stat_replication;
 usename  | application_name |   client_addr   |   state   
----------+------------------+-----------------+-----------
 repluser | standby01        | 192.168.221.160 | streaming
(1 row)
 
postgres=#


可以看到192.168.221.160上的repluser在通过流复制的方式同步主库的数据

2. 创建表验证一下

主库上建表,并插入数据验证

postgres=# create table test01(id int primary key,note text);
CREATE TABLE
postgres=# \d
         List of relations
 Schema |  Name  | Type  |  Owner   
--------+--------+-------+----------
 public | test01 | table | postgres
(1 row)
 
postgres=# insert into test01 values(1,'1111111');
INSERT 0 1
postgres=# select * from test01;
 id |  note   
----+---------
  1 | 1111111
(1 row)


在从库上查看:

[postgres@DB data]$ psql 
psql (9.6.6)
Type "help" for help.
 
postgres=# \d
         List of relations
 Schema |  Name  | Type  |  Owner   
--------+--------+-------+----------
 public | test01 | table | postgres
(1 row)
 
postgres=# select * from test01;
 id |  note   
----+---------
  1 | 1111111
(1 row)


尝试插入数据看一下:

postgres=# insert into test01 values(2,'2222222');
ERROR:  cannot execute INSERT in a read-only transaction


可以看到,从库可以查看从主库同步过来的数据,但并不能写数据。

六、总结

以上是搭建Postgresql主从同步的全过程,一路踩了好多坑,记录下了,希望能帮助到别人


您可能感兴趣的文档:

--结束END--

本文标题: PostgreSql基于Standby的异步流主从复制

本文链接: https://www.lsjlt.com/news/43938.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • PostgreSql基于Standby的异步流主从复制
    一、概述PostgreSQl从9.0版本之后推出一个类似于Oracle的active dataguard和MySql中继日志一样的日志传送。我们借助这个功能就可实现PostgreSql的主从复制。基本原理就...
    99+
    2022-10-18
  • Mysql 主从复制之半同步复制(基于gtid)
    Mysql主从复制mysql主从复制原理:从库有两个线程IO线程和SQL线程1.从库的IO线程向主库的主进程发送请求,主库验证从库,交给主库IO线程负责数据传输;2.主库IO线程对比从库发送过来的maste...
    99+
    2022-10-18
  • 基于GTID的主从复制搭建
    前置检查server-id = 10,master/slave不允许重复log-bingtid-mode = ONenforce-gtid-consistency = ON1,利用mysqlpump复制ma...
    99+
    2022-10-18
  • 基于二进制文件的主从复制
    1.设置主服务器配置         必须在主服务器上启用二进制日志,因为二进制日志是将更改从主服务器复制到从服务器的基础,如果未启用log-bin,则无法进行复制         复制组内的每个服务器必须配置有唯一的id,此id...
    99+
    2021-08-12
    基于二进制文件的主从复制
  • MySQL基于SSL协议的主从复制
       数据对于大部分公司来说都是最重要的部分,而MySQL的服务器在同步数据时,默认是使用明文进行传输,所以接下来就来说说MySQL基于SSL协议进行密文传输数据的主从复制模式。逻辑拓...
    99+
    2022-10-18
  • MySQL:安装和基于SSL加密的主从复制(基于5.7)
       小生博客:http://xsboke.blog.51cto.com             ...
    99+
    2022-10-18
  • mysql基于日志的主从复制是什么
    这篇文章主要介绍了mysql基于日志的主从复制是什么,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获。下面让小编带着大家一起了解一下。       ...
    99+
    2022-10-18
  • 如何搭建基于Docker的MySQL主从复制
    下文主要给大家带来如何搭建基于Docker的MySQL主从复制,希望这些内容能够带给大家实际用处,这也是我编辑如何搭建基于Docker的MySQL主从复制这篇文章的主要目的。好了,废话不多说,大家直接看下文...
    99+
    2022-10-18
  • MySql之基于ssl安全连接的主从复制
    MySql基于ssl安全连接的主从复制一、设备环境centos7.2   两台MySQL 5.7MySQL 5.7 主要特性:原生支持Systemd更好的性能:对于多...
    99+
    2022-10-18
  • docker下如何部署MySQL8基于GTID的主从复制
    这篇文章给大家介绍docker下如何部署MySQL8基于GTID的主从复制,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。安装docker#yum install docker添加doc...
    99+
    2022-10-18
  • 半同步与异步的MySQL主从复制如何配置
    这篇文章主要介绍了半同步与异步的MySQL主从复制如何配置,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、MySQL主从复制原理这里我以M...
    99+
    2022-10-18
  • 关于Mysql搭建主从复制功能的步骤实现
    目录1.描述2.开始远程连接3.开启bin-log日志4.重启两台mysql5.授权Ⅰ授权Ⅱ6.配置从服务器7.启动从库的复制功能8.检查从库复制功能状态1.描述 在实际的生产中,为了解决Mysql的单点故障已经提高My...
    99+
    2023-05-23
    Mysql 主从复制 搭建主从复制
  • MySQL基于SSL安全连接的主从复制(过程详解)
    目录主从复制的原理部署master1. 主机创建 SSL/RSA 文件2. 赋予权限并重启。3. 登录mysql查看ssl是否开启,并创建一个复制用户。4. master开启二进制日志,重启后查看二进制日志文件。5. 防...
    99+
    2023-04-06
    mysql 基于ssl主从复制 mysql 主从复制
  • docker下MySQL8基于GTID的主从复制如何完成部署
    本文主要给大家介绍docker下MySQL8基于GTID的主从复制如何完成部署,文章内容都是笔者用心摘选和编辑的,具有一定的针对性,对大家的参考意义还是比较大的,下面跟笔者一起了解下docker下MySQL...
    99+
    2022-10-18
  • MySQL基于SSL安全连接的主从复制怎么实现
    本文小编为大家详细介绍“MySQL基于SSL安全连接的主从复制怎么实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“MySQL基于SSL安全连接的主从复制怎么实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。生...
    99+
    2023-07-05
  • MYSQL的架构中主从异步复制是怎么进行的
    这篇文章将为大家详细讲解有关MYSQL的架构中主从异步复制是怎么进行的,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。/主服务器从服务器Ip192.168.3...
    99+
    2022-10-18
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作