流复制是PostgreSQL 9.0之后才提供的新的传递WAL日志的方法。通过流复制,备库不断的从主库同步相应的数据,并在备库apply每个WAL record,这里的流复制每次传输单位是WAL日志的record。就如oracle的dataguard技术一样,pg的流复制也是按照同步模式的不同,分为同步流复制和异步流复制。同步流复制虽然能在主库坏掉时确保数据的一致,但是当网络或者备库有问题的时候,会导致主库事务hang住。异步流复制则没有这样的缺点,不会影响生产库的性能,但是在主库坏掉的时候,可能会丢掉一小部分数据。
主库 | 备库 |
192.168.0.1 | 192.168.0.2 |
主库操作
1.给数据库创建一个用户作为主从同步使用的账号
postgres=# create role repl login replication encrypted password ‘123456’;
2.修改postgresql 配置文件
(1)Pg_hba.conf
host all all 192.168.0.2/24 md5
host replication repl 192.168.0.2/24 md5
第一行: #允许备库192.168.0.2这个服务器连接到主服务器
第二行: #允许使用replica用户来复制,第二个字段必须要填repl (上一步添加的用户)
添加完可以登录主数据库使用“select pg_reload_conf();”查看是否生效:如下图:
3.修改postgresql.conf文件
listen_addresses = ‘*’ #这个一般安装服务器之后都会进行配置,检查下wal_level=replica #默认replica,不动
wal_keep_segments= 256 #设置流复制保留的最多的xlog数目
配置完成后重启数据库:systemctl restart postgresql.重启完成后在从服务器测试是否连接成功
提示输入密码:测试完成
备库操作
1.停止postgresql服务,清空data目录
这里一定要先停止postgresql服务再清空data目录,rm -rf /var/lib/postgresql/12/main。因为每个用户安装目录不一样所以data文件目录不一样。这里一定要区分。
2.从主节点拷贝数据到从节点
从主服务器拷贝数据库数据到从服务器,这时候需要切换当前用户为postgres。如果不切换的话备份下来的文件 所属用户不是postgres,会报错权限问题
1)sudo -i -u postgres
2)pg_basebackup -h 192.168.0.1 -U repl -D /var/lib/postgresql/12/main -X stream -P #repl为在主库添加的用户。执行完改命令后进入该目录,
如果忘记切换为postgres用户,这时候要注意拷贝的数据所属用户可能是你当前登录的用户,
这里要把当前目录下文件所属目录改为数据库用户,否则会出现权限错误
chown -R postgres:postgres *
3.配置postgresql.auto.conf文件
在文件中添加
primary_conninfo=‘host=192.168.0.1 port=5432 user=repl password=123456’ #主服务器的信息以及连接的用户,如果不想手动添加,那我们在使用pg_basebackup命令时加一个 -R 参数即可。具体参数用法自行查阅资料
4.创建standby.signal文件
在db-slave目录中,standby.signal将自动创建一个新文件,pg_basebackup指示该从集群将以standby模式运行。该文件standby.signal是PG12中的新增功能,用以替代旧版本standby_mode = ‘on’,以前在文件recovery.conf中定义。如果此文件不存在,请手动创建
![在这里插入图片描述](
d8d19e1b69.png)5.配置postgresql.conf文件
recovery_target_timeline = ‘latest’ #指定恢复到特定时间轴。默认设置是沿着执行基本备份时的当前时间线恢复。将此设置为 latest 将恢复到存档中找到的最新时间轴
配置完成重启数据库服务:systemctl restart postgresql,重启完成后回到主服务器上测试是否配置完成
postgres=# select pid,usename,application_name,client_addr,state,sync_state from pg_stat_replication;
可以在sync_state该列下看到async,async表示异步流复制。表示流复制环境搭建完成。
主备切换
pg12开始新增了一个pg_promote()函数,让我们可以通过SQL命令激活备库。
pg_promote()语法:
pg_promote(wait boolean DEFAULT true, wait_seconds integer DEFAULT 60)
两个参数:
wait: 表示是否等待备库的 promotion 完成或者 wait_seconds 秒之后返回成功,默认值为 true。
wait_seconds: 等待时间,单位秒,默认 60
切换举例:
1.关闭主库数据库服务器(模拟主数据库宕机)
Systemctl stop postgresql.service
2.激活备库
Sudo -i -u postgres
psql
select pg_promote(true,60);
3.验证
在原备库执行select pg_is_in_recovery(); pg_is_in_recovery 显示F表示备库已经被激活了。如下图:
4.激活备库之后,我们把主库修复好了之后再根据之前的步骤配置就可以将主库作为新的备库使用
1.创建文件
在备库目录下添加triggerfile文件,文件名是postgresql.conf里配置项的文件名
triggerfile文件中随便填写什么内容都可以,或者只是新建一个文件。
停掉主库,我们会发现备库已经起来了~~ 如下图:
接下来的步骤就是修复原主库了,主库修复后根据之前的步骤配置为新备库使用