原理

PostgreSQL的流复制究竟是什么?
通过wal日志来进行数据同步之类的
但是准确的来说:PostgreSQL通过wal日志来传送的方式有两种:基于文件的日志传送和流复制。不同于基于文件的日志传送,流复制的关键在于“流”,所谓流,就是没有界限的一串数据,类似于河里的水流,是连成一片的。因此流复制允许一台后备服务器比使用基于文件的日志传送更能保持为最新的状态。
备库不断的从主库同步相应的数据,并在备库apply每个WAL record,这里的流复制每次传输单位是WAL日志的record

优点

1、延迟极低,不怕大事务2、支持断点续传3、支持多副本4、配置简单5、备库与主库物理完全一致,并支持只读

搭建环境,IP地址和版本等。

主服务器:192.168.137.31从服务器:192.168.137.32操作系统:CentOS 7.5数据库版本:PostgreSQL-13

环境准备

设置host(主从都要设置)

  1. echo "192.168.137.31 pg1" >> /etc/hosts
  2. echo "192.168.137.32 pg2" >> /etc/hosts

配置主服务器

修改主配置文件postgresql.conf
在/data/pgsql/13/data/postgresql.conf中启用并按照如下的配置修改这些行:

  1. wal_level = replica
  2. synchronous_commit = local
  3. synchronous_standby_names = '*'
  4. max_wal_senders = 20
  5. wal_keep_size = 64
  6. wal_sender_timeout = 60s
  7. hot_standby = on
  8. max_standby_streaming_delay = 30s
  9. wal_receiver_status_interval = 10s
  10. full_page_writes = on
  11. wal_log_hints = on

创建同步专用用户replicauser,给默认的postgres用户添加密码:

  1. create role replicauser with replication login password '123456';
  2. alter user replicauser with password '123456';

修改验证配置
/data/pgsql/13/data/pg_hba.conf也进行修改操作,ADDRESS字段修改成主从服务器的IP地址:

  1. # TYPE DATABASE USER ADDRESS METHOD
  2. host replication replicauser pg2 trust

replicauser 是用于同步的专门用户,后面的步骤中会创建
启动主postgresql

  1. systemctl restart postgresql-13

配置standby服务器

在standby服务器上操作,由于配置了trust,所以standby上的数据同步操作不需要密码。
切换到postgres账户下执行

  1. $ pg_basebackup -h pg1 -p 5432 -U replicauser -D /data/pgsql/13/data/ -P -Xs -R

如果standby目录/data/pgsql/13/data已存在,且不为空,需要清空,使用下面的命令

  1. rm -fr /data/pgsql/13/data/*

修改配置文件postgresql.conf

  1. recovery_target_timeline = 'lastest'

数据同步完成后,切换到root用户,启动postgresql

  1. # chmod -R 0700 /data/pgsql/13/data
  2. systemctl start postgresql-13

此时,主从2台服务器应该处理同步状态了

验证主从同步

在primary上查看postgresql的同步状态,:

  1. postgres=# \x
  2. postgres=# select * from pg_stat_replication;

可以从以上结果看到客户端信息和主从同步的状态等。

准备切换

pg_ctl promote # 删掉standby.signal
将 postgresql.auto.conf 中的primary_conninfo注释掉

备库验证

select pg_is_in_recovery();