具体操作的时候注意ip的替换以及max_connections参数的变更

环境

docker

postgres 10.14

详细步骤

环境准备

1
2
3
4
5
6
   docker network create --driver bridge --subnet=172.18.12.0/16 --gateway=172.18.12.1 mynet

   docker run --name pgsmaster -p 5432:5432  --network=mynet --ip 172.18.12.100  -e POSTGRES_PASSWORD=pgsmaster -v $(pwd)/pgsmaster:/var/lib/postgresql/data -d postgres:10.14


   docker run --name pgsslave -p 5433:5432  --network=mynet --ip 172.18.12.101 -e POSTGRES_PASSWORD=pgsslave -v $(pwd)/pgsslave:/var/lib/postgresql/data -d postgres:10.14

进入master容器

1
2
    su - postgres
    CREATE ROLE replica login replication encrypted password 'replica';

修改 /var/lib/postgresql/data/pg_hba.conf 添加如下记录

1
   host   replication      replica       172.18.12.101/32          trust   #允许172.18.12.101使用 replica 用户来复制

修改 /var/lib/postgresql/data/postgresql.conf

1
2
3
    listen_addresses = '*'        # 监听所有IP
    archive_mode = on             # 允许归档
    wal_level = replica           # 开启热备

进入slave容器

1
2
3
4
5
    su - postgres
    # 先清空数据,然后再从master同步数据
    rm -rf /var/lib/postgresql/data/*
    # 这一步要速度快,要不然容器会以为data下面为空而退出
    pg_basebackup -h 172.18.12.100 -p 5432 -U replica -Fp -Xs -Pv -R -D /var/lib/postgresql/data

修改 /var/lib/postgresql/data/postgresql.conf

1
2
3
    wal_level = replica   # WAL 日志级别为 replica
    hot_standby = on                     # 恢复期间,允许查询
    max_connections = 120                # 大于等于主节点,正式环境应当重新考虑此值的大小

修改/var/lib/postgresql/data/recovery.conf

1
2
    standby_mode = 'on'
    primary_conninfo = 'host=172.18.12.100 port=5432 user=replica password=replica'   # 主库连接信息

进入master容器校验

1
2
   su - postgres
   select client_addr,sync_state from pg_stat_replication;

参考资料

利用Docker部署 PostgreSQL 12.4主从_Expec-乐的博客-CSDN博客