前提条件

3台服务器并安装Docker

配置PostgreSQL主节点

  1. 远程连接PostgreSQL主节点,依次运行以下命令,安装PostgreSQL。

    1. 输入mkdir postgresql命令,创建postgresql文件夹。

    2. 输入cd postgresql命令,进入postgresql文件夹。

    3. 输入vim docker-compose.yml命令,并将以下内容写入,创建docker-compose.yml文件。

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      version: '3.1'
      services:
      postgres:
      image: postgres:16.1
      container_name: postgresql
      restart: always
      environment:
      - POSTGRES_DB=postgres
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=<数据库密码>
      - TZ=Asia/Shanghai
      volumes:
      - ./data/:/var/lib/postgresql/data
      ports:
      - "5432:5432"
    4. 输入docker-compose up -d命令,启动PostgreSQL。

  2. 在主节点上创建数据库账号replica(用于主从复制),并设置密码及登录权限和备份权限。

    1. 输入命令docker exec -it postgresql bash,进入postgresql容器。

    2. 输入命令su - postgres,登录postgres用户。

    3. 输入psql命令进入PostgreSQL交互终端,当显示postgres=#时表示成功进入交互终端。

    4. 输入以下SQL语句创建数据库账号replica,并设置密码及登录权限和备份权限。

      1
      CREATE ROLE replica login replication encrypted password '<备份账户密码>';
    5. 输入以下SQL语句查询账号是否创建成功。返回记录包含replica,表示已创建成功。

      1
      SELECT usename from pg_user;
    6. 终端输入\q,退出SQL终端。输入exit命令,退出postgres用户,再输入exit命令,退出容器。

  3. 修改创建的postgresql文件夹下data文件中pg_hba.conf文件,检查并设置replica用户白名单,允许从节点密码认证连接和允许用户从replication数据库进行数据同步。

    1
    2
    host    all             all             all                     scram-sha-256  #允许用户密码认证连接
    host replication all all scram-sha-256 #允许用户从replication数据库进行同步
  4. 修改创建的postgresql文件夹下data文件中postgresql.conf文件,分别找到以下参数,并将参数修改为以下内容。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    listen_addresses = '*'   #监听的IP地址
    wal_level = replica #启用热备模式
    max_wal_senders = 10 #同步最大的进程数量
    wal_sender_timeout = 60s #流复制主机发送数据的超时时间
    max_connections = 100 #最大连接数,从库的max_connections必须要大于主库的
    # 注意,如果配置同步复制,建议是一主二从,防止从库同步异常导致主库hang住。
    synchronous_commit = on #开启同步复制
    synchronous_standby_names = 'ANY 1 (slave1, slave2)'
    #只要primary端wal传到任意一台standby并commit就OK,这里填写的是备库primary_conninfo中application_name参数值。
  5. 运行docker restart postgresql命令,重启服务。

配置PostgreSQL从节点

  1. 远程连接PostgreSQL从节点1,同上PostgreSQL主节点安装操作,安装PostgreSQL。

  2. 使用pg_basebackup基础备份工具指定备份目录(注意:备份后主节点不可进行任何操作,直到验证从节点正常才可操作主节点)。

    1. 输入命令docker exec -it postgresql bash,进入postgresql容器。

    2. 进入 /var/lib/postgresql/data 目录,在目录下创建 data_new 文件夹

    3. 运行以下命令,使用pg_basebackup基础备份工具指定备份目录。

      1
      pg_basebackup -h <主节点ip> -p 5432 -U replica -D <保存路径> -X stream -P -R

      注意:-R选项用于创建用于replication的配置文件,生成$PGDATA/standby.signal文件,该文件必须存在,用来标识这是一个备库。

    4. 输入exit命令,退出容器。

  3. 修改创建的postgresql文件夹下data文件夹下data_new文件夹中postgresql.conf文件,分别找到以下参数,并将参数修改为以下内容。

    1
    2
    3
    4
    5
    6
    recovery_target_timeline = 'latest' #流复制同步到最新的数据
    max_connections = 1000 # 最大连接数,从节点需设置比主节点大
    hot_standby = on # 开启热备
    max_standby_streaming_delay = 30s # 数据流备份的最大延迟时间
    wal_receiver_status_interval = 1s # 从节点向主节点报告自身状态的最长间隔时间
    hot_standby_feedback = on # 如果有错误的数据复制向主进行反馈
  4. 修改创建的postgresql文件夹下data文件夹下data_new文件夹中postgresql.auto.conf文件,在 primary_conninfo 参数配置添加application_name=slave1

    1
    primary_conninfo = '******** application_name=slave1'
  5. 输入命令,将data_new文件夹中内容替换创建的postgresql文件夹下data文件夹内容。

  6. 运行docker restart postgresql命令,重启服务。

  7. 远程连接PostgreSQL从节点2,重复从节点1操作(将slave1改为slave2)。

检测验证

在主节点中进入PostgreSQL交互终端,输入以下SQL语句,在主库中查看从库状态。

  1. 运行以下命令,登录postgres用户。

    1
    su - postgres
  2. 输入psql命令进入PostgreSQL交互终端,当显示postgres=#时表示成功进入交互终端。

  3. 运行以下命令,在主库中查看从库状态,返回结果如下图,表示可成功查看到从库状态。

    1
    select * from pg_stat_replication;

    一主二从pg_stat_replication

  4. 终端输入\q,并按Enter退出SQL终端。输入exit命令,并按Enter退出PostgreSQL。