PostgreSQL日志传送的方法有两种,一种是基于文件(base-file)的传送方式,一种是流复制(streamingreplication)的方式。
基于文件(base-file)的传送方式,这种方式是PostgreSQL9.0之前就提供的方法。也就是服务器写完一个WAL日志文件后,才把WAL日志文件拷贝到standby数据库上去应用。
流复制的方式是PostgreSQL提供的一种服务器间的数据复制方式。这是PostgreSQL9.0才提供的新方法。这个方法就是事务提交后,主服务器则在WAL记录产生时即将它们以流式传送给后备服务器而不必等到WAL文件被填充。就是把生成的日志异步的传送到standby数据库上应用,这比基本文件的日志传送方法有更低的数据延迟。
本文参考了其他博客和官网介绍,演示在linux系统下两个postgresql 数据库流复制的情况。
目录
环境准备
1. 两个单台的pg数据库已搭建好,单台pg详细安装过程查看之前的这篇文章。
2. 查看防火墙是否关闭
systemctl status firewalld
systemctl stop firewalld
3.服务器两台
服务器 | IP地址 |
主数据库服务器 | 192.168.56.10 |
备数据库服务器 | 192.168.56.11 |
redhat 7.6
数据库安装目录:/data/postgresql/
主服务器配置
1. 修改postgresql.conf文件
vi /data/postgresql/data/postgresql.conf
修改内容:
listen_addresses = '*'
max_connections = 100 #默认参数,非主从配置相关参数,表示到数据库的连接数
wal_level = hot_standby #主从设置为热血模式,流复制必选
synchronous_commit = on
archive_mode = on
archive_command = 'cp %p /data/postgresql/xlog_archive/%f'
max_wal_senders=5 #流复制允许连接进程
wal_keep_segments =32
hot_standby = on
max_standby_archive_delay = -1
max_standby_streaming_delay = -1
wal_receiver_status_interval = 2
hot_standby_feedback = on
restart_after_crash = off
2. 创建复制用户,主从同步使用
su postgres #Linux命令#进入postgres用户
psql #Linux命令 #进入postgresql数据库
create role repl with login replication password 'password';
3. 修改pg_hba.conf
host replication all 0.0.0.0/0 md5
4.重启/停止主库服务
pg_ctl restart -D /data/postgresql/data
pg_ctl stop -D /data/postgresql/data
备服务器配置
1. 基础备份,从库安装完成后,不初始化,若已经初始化,删除其data目录
rm -rf /data/postgresql/data/*
2. 通过pg_basebackup命令搭建主备流复制环境, 拷贝主数据库的data目录
su - postgres
pg_basebackup -h 10.251.95.28 -p 5432 -U repl -D /data/postgresql/data -X stream -P -R
其中输入的密码为在主库创建repl用户时的密码password
下图表示从主数据库的数据目录拷贝成功
备注:
-h,主库主机,-p,主库服务端口;
-U,复制用户;
-F,p是默认输出格式,输出数据目录和表空间相同的布局,t表示tar格式输出;
-P,同--progress,显示进度;
-D,输出到指定目录;
-R, 生成recovery.conf文件
因为主库采用的是md5认证,这里需要密码认证。
3.从库配置文件配置
创建或修改恢复文件recovery.conf
vi /data/postgresql/data/recovery.conf
修改内容:
recovery_target_timeline = 'latest'
standby_mode = on
primary_conninfo = 'host=192.168.56.10 port=5432 user=repl application_name=myapp-1 password=password keepalives_idle=60 keepalives_interval=5 keepalives_count=5'
restore_command = 'cp /data/postgresql/xlog_archive/%f %p'
备注:
standby_mode = on #指明从库身份
primary_conninfo = '***' #连接到主库信息
recovery_target_timeline = 'latest' #同步到最新数据
4. 启动从库服务
pg_ctl start -D /data/postgresql/data
主从配置验证
方式1:
主数据服务器:
pg_controldata -D /data/postgresql/data
从数据服务器:
pg_controldata -D /data/postgresql/data
方式2:
#主库创建表test:
create table test(id int primary key,name varchar(20));
insert into test values (1,'str1');
select * from test;
#从库可查询,从库只能读,不可插入数据
select * from test;
insert into test values (2,'str2');
参考文章: