加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-13 16:44:33 所属栏目:百科 来源:网络整理
导读:一、概述 PostgreSQl 从 9.0 版本之后推出一个类似于 Oracle 的 active dataguard 和 MySql 中继日志一样的日志传送。我们借助这个功能就可实现 PostgreSql 的主从复制。 基本原理就是,通常一台主数据库提供读写,然后把数据同步到另一台从库。从库不断 app

一、概述

PostgreSQl9.0版本之后推出一个类似于Oracleactive dataguardMySql中继日志一样的日志传送。我们借助这个功能就可实现PostgreSql的主从复制。

基本原理就是,通常一台主数据库提供读写,然后把数据同步到另一台从库。从库不断apply从主库接收到的数据,从库不提供写服务,只对外提供读服务。在postgresql中提供读写全功能的服务器称为primary databasemaster 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)

Postgresqlpostgresql-9.6.6

SELINUX=disabled

Iptables关闭

主库(master)IP:192.168.221.161

从库(standby)IP:192.168.221.160

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

三、主库配置

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

[postgres@MidApp~]$psql
psql(9.6.6)
Type"help"forhelp.

postgres=#CREATEROLErepluserREPLICATIONLOGINPASSWORD'123456';
CREATEROLE
postgres=#


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

[root@MidApptmp]#tail-6/home/postgres/pgsql/data/pg_hba.conf
#Allowreplicationconnectionsfromlocalhost,byauserwiththe
#replicationprivilege.
#localreplicationpostgrestrust
#hostreplicationpostgres127.0.0.1/32trust
#hostreplicationpostgres::1/128trust
Hostreplicationrepluser192.168.221.160/32md5


这行配置意思是允许用户repluser192.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

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

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

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

四、从库配置

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

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

[root@DBtmp]#pg_basebackup-h192.168.221.161-Fp-P-D/home/postgres/pgsql/data-p5432-Urepluser--password
Password:
22802/22802kB(100%),1/1tablespace
NOTICE:WALarchivingisnotenabled;youmustensurethatallrequiredWALsegmentsarecopiedthroughothermeanstocomple


参数说明:-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=standby01user=repluserpassword=123456host=192.168.221.161port=5432sslmode=disablesslcompression=1'


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

hot_standby=on


hot_standby改为启用状态

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

[root@DBtmp]#/etc/init.d/postgresqlstart
StartingPostgreSQL:-bash:/home/postgres/pgsql/data/serverlog:Permissiondenied
ok


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

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


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

[root@DBtmp]#/etc/init.d/postgresqlstart
StartingPostgreSQL:ok
[root@DBtmp]#ps-ef|greppostg
root5257782731015:12pts/000:00:00su-postgres
postgres5257852577015:12pts/000:00:00-bash
postgres742951020:01?00:00:00/home/postgres/pgsql/bin/postmaster-D/home/postgres/pgsql/data
postgres7429674295020:01?00:00:00postgres:startupprocessrecovering000000010000000000000003
postgres7429774295520:01?00:00:00postgres:walreceiverprocessstreaming0/3000140
postgres7429874295020:01?00:00:00postgres:checkpointerprocess
postgres7429974295020:01?00:00:00postgres:writerprocess
postgres7430074295020:01?00:00:00postgres:statscollectorprocess


五、结果验证

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

[postgres@MidApp~]$psql
psql(9.6.6)
Type"help"forhelp.

postgres=#selectusename,statefrompg_stat_replication;
usename|application_name|client_addr|state
----------+------------------+-----------------+-----------
repluser|standby01|192.168.221.160|streaming
(1row)

postgres=#


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

2.创建表验证一下

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

postgres=#createtabletest01(idintprimarykey,notetext);
CREATETABLE
postgres=#d
Listofrelations
Schema|Name|Type|Owner
--------+--------+-------+----------
public|test01|table|postgres
(1row)

postgres=#insertintotest01values(1,'2222211');
INSERT01
postgres=#select*fromtest01;
id|note
----+---------
1|2222211
(1row)


在从库上查看:

[postgres@DBdata]$psql
psql(9.6.6)
Type"help"forhelp.

postgres=#d
Listofrelations
Schema|Name|Type|Owner
--------+--------+-------+----------
public|test01|table|postgres
(1row)

postgres=#select*fromtest01;
id|note
----+---------
1|2222211
(1row)


尝试插入数据看一下:

postgres=#insertintotest01values(2,'2222222');
ERROR:cannotexecuteINSERTinaread-onlytransaction


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

六、总结

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读