一:准备环境
操作系统:CentOS Linux release 7.9.2009 (Core)
postgresql版本:psql (PostgreSQL) 13.8
主服务器:192.168.100.105
从服务器:192.168.100.106
postgresql下载地址:https://www.postgresql.org/ftp/source/
二:主从复制介绍
主/从数据库复制是将数据从主数据库复制到另外一个或者多个数据库的过程。主要好处是能够将数据分发到不同的数据库中,当主数据库出现故障时,可以请求从数据库中的数据,保证不会出现请求的中断。同样,我们也可以使用从数据库来分担主数据库的压力,加快数据的处理速度。
postgres在9.0之后引入了主从流复制机制,从数据库通过tcp流从主数据库中同步相应的数据
三:主服务器部署操作

1.将在官网下载的postgresql压缩包上传到服务器
  [root@pgsql-master ~]# ll postgresql-13.8.tar.gz
  -rw-r--r-- 1 root root 28046336 10月 24 15:28 postgresql-13.8.tar.gz
2.查看本地是否存在postgresql数据库并卸载
  [root@pgsql-master ~]# rpm -q postgresql && yum -y remove postgresql
3.安装postgresql需要依赖的工具
  [root@pgsql-master ~]# yum -y install gcc readline-devel zlib-devel
4.创建一个操作pg的用户postgres,以后所有关于数据库的操作都会使用这个用户--设计人员为了安全考虑,PostgreSQL 不能以 root 用户运行,所以必须建立对应的用户和组
  [root@pgsql-master ~]# useradd postgres
  [root@pgsql-master ~]# passwd postgres
5.解压postgresql安装包到/usr/src下
  [root@pgsql-master ~]# tar xf postgresql-13.8.tar.gz -C /usr/src
6.配置postgresql,并指定安装路径
  [root@pgsql-master ~]# cd /usr/src/postgresql-13.8/
  [root@pgsql-master postgresql-13.8]# ./configure --prefix=/usr/local/pgsql
7.编译并安装
  [root@pgsql-master postgresql-13.8]# make && make install
8.配置用户环境变量
  [root@pgsql-master ~]# vim /home/postgres/.bash_profile
  #表示pg安装的目录,和--prefix的目录一致
  export PGHOME=/usr/local/pgsql
  #pg数据目录,在初始化数据库时如果没有指定目录,则选择环境变量中的目录
  export PGDATA=/home/postgres/psql/data
  export PATH=$PATH:$HOME/bin:$PGHOME/bin
  [root@pgsql-master ~]# source /home/postgres/.bash_profile
  [root@pgsql-master ~]# psql --version   //查看版本,并且可以测试变量是否设置成功
  psql (PostgreSQL) 13.8
9.初始化数据库--由于配置了环境变量,所以此处我们直接执行initdb即可完成pg初始化
  初始化数据库要使用postgres用户
  [root@pgsql-master ~]# su - postgres
  [postgres@pgsql-master ~]$ initdb -E utf8 -D /home/postgres/psql/data
10.启动数据库
  [postgres@pgsql-master ~]$ pg_ctl -D /home/postgres/psql/data -l logfile start

四:从服务器部署操作

1.将在官网下载的postgresql压缩包上传到服务器
  [root@pgsql-slave ~]# ll postgresql-13.8.tar.gz
  -rw-r--r-- 1 root root 28046336 10月 24 15:28 postgresql-13.8.tar.gz
2.查看本地是否存在postgresql数据库并卸载
  [root@pgsql-slave ~]# rpm -q postgresql && yum -y remove postgresql
3.安装postgresql需要依赖的工具
  [root@pgsql-slave ~]# yum -y install gcc readline-devel zlib-devel
4.创建一个操作pg的用户postgres
  [root@pgsql-slave ~]# useradd postgres
  [root@pgsql-slave ~]# passwd postgres
5.解压postgresql安装包到/usr/src下
  [root@pgsql-slave ~]# tar xf postgresql-13.8.tar.gz -C /usr/src/
6.配置postgresql,并指定安装路径
  [root@pgsql-slave ~]# cd /usr/src/postgresql-13.8/
  [root@pgsql-slave postgresql-13.8]# ./configure --prefix=/usr/local/pgsql
7.编译并安装
  [root@pgsql-slave postgresql-13.8]# make && make install
8.配置用户环境变量
  [root@pgsql-slave ~]# vim /home/postgres/.bash_profile
  #表示pg安装的目录,和--prefix的目录一致
  export PGHOME=/usr/local/pgsql
  #pg数据目录,在初始化数据库时如果没有指定目录,则选择环境变量中的目录
  export PGDATA=/home/postgres/psql/data
  export PATH=$PATH:$HOME/bin:$PGHOME/bin
  [root@pgsql-slave ~]# source /home/postgres/.bash_profile
9.初始化数据库
  [root@pgsql-slave ~]# su - postgres
  [postgres@pgsql-slave ~]$ initdb -E utf8 -D /home/postgres/psql/data
10.启动数据库
  [postgres@pgsql-slave ~]$ pg_ctl -D /home/postgres/psql/data -l logfile start

五:主服务器和从服务器数据库已部署完成,下面配置主从复制

1.master上操作
  1>首先在主服务器数据库安装目录下创建一个存放归档的文件夹
  [root@pgsql-master ~]# mkdir /usr/local/pgsql/archive
  [root@pgsql-master ~]# chown -R postgres:postgres /usr/local/pgsql/archive
  2>我们需要一个数据库用户进行主从同步。在主数据创建用户,赋予登录和复制的权限
  [postgres@pgsql-master ~]$ psql -p 5432 -U postgres -d postgres
  postgres=# create role replica login replication encrypted password '123456';
  3>允许新建的用户进行同步操作--在/home/postgres/psql/data目录下找到配置文件pg_hba.conf,在配置文件中加入如下两行
  [postgres@pgsql-master ~]$ vim /home/postgres/psql/data/pg_hba.conf
  host     all             all             192.168.100.106/32      trust      #允许从服务器连接到主服务器,ip为slaveip,掩码一定要为32位
  host replication         replica         192.168.100.106/32      md5        #允许从服务器使用replica用户来复制
  4>修改postgresql.conf配置文件
  [postgres@pgsql-master ~]$ vim /home/postgres/psql/data/postgresql.conf
  listen_addresses = '*'          # what IP add                            #允许所有监听 
  archive_mode = on               # enables archiving; off, on, or always  #允许归档
  archive_command = 'cp %p /usr/local/pgsql/archive/%f'                    #使用该命令归档logfile segment
  wal_level = replica             # minimal, replica, or logical           #主从设置为replica模式,流复制必选,9.6版本后就没有hot_standby热备模式了
  max_wal_senders = 32            # max number of walsender processes      #这个设置了可以最多有几个流复制连接,差不多有几个从,就设置几个wal_keep_segments = 256 # 设置流复制保留的最多的xlog数目   
  wal_sender_timeout = 60s        # in milliseconds; 0 disables            #设置流复制主机发送数据的超时时间  
  max_connections = 100           # (change requires restart)              #这个设置要注意下,从库的max_connections必须要大于主库的
  5>重启postgresql服务
  [postgres@pgsql-master ~]$ pg_ctl -D /home/postgres/psql/data/ -l logfile restart
2.slave操作
  1>为了保证基础数据的一致,我们先从主数据库将起data目录下的数据复制到从数据库的data目录下
  #先将data目录下的数据清空
  [root@pgsql-slave ~]# rm -rf /home/postgres/psql/data/*
  #从主数据库拷贝数据到从数据库(基础备份)
  [root@pgsql-slave ~]# pg_basebackup -R -D /home/postgres/psql/data/ -Fp -Xs -v -P -h 192.168.100.105 -p 5432 -U replica
  [root@pgsql-slave ~]# chown -R postgres:postgres /home/postgres/psql/data/
  2>新建归档存储的文件夹
  [root@pgsql-slave ~]# mkdir /usr/local/pgsql/archive
  [root@pgsql-slave ~]# chown -R postgres:postgres /usr/local/pgsql/archive
  3>修改postgresql.conf配置文件
  [postgres@pgsql-slave data]$ vim /home/postgres/psql/data/postgresql.conf
  hot_standby = on                        # "off" disallows queries during recovery
  primary_conninfo = 'host=192.168.100.105 port=5432 user=replica password=123456'
  recovery_target_timeline = 'latest'     # 'current', 'latest', or timeline ID
  max_connections = 150                   # (change requires restart)   #要大于主节点
  max_standby_streaming_delay = 30s       # max delay before canceling queries
  wal_receiver_status_interval = 10s      # send replies at least this often
  hot_standby_feedback = on
  4>启动postgresql服务
  [postgres@pgsql-slave data]$ pg_ctl -D /home/postgres/psql/data/ -l logfile start

六:验证主从配置是否成功

1.登录主服务器查看是否有从服务器连接
  [postgres@pgsql-master ~]$ psql
  postgres=# select client_addr,sync_state from pg_stat_replication;
     client_addr   | sync_state
  -----------------+------------
   192.168.100.106 | async
  (1 row)
2.登录主服务器创建一个表,插入数据
  postgres=# create table student (id int,name varchar(3),number int);
  CREATE TABLE
  postgres=# INSERT INTO student (id, name, number) VALUES (1, '张三',    '1023');
  INSERT 0 1
  postgres=# SELECT * FROM student WHERE id=1;
   id | name | number
  ----+------+--------
    1 | 张三 |   1023
  (1 row)
3.登录从服务器查看数据是否同步
  [postgres@pgsql-slave data]$ psql
  postgres=# SELECT * FROM student WHERE id=1;
   id | name | number
  ----+------+--------
    1 | 张三 |   1023
  (1 row)