Bootstrap

docker-compose启动postgres数据库,实现主从备份

1. 主库

  • 创建pg-m 目录,并进入该目录
  • 创建docker-compose.yml文件,内容如下:
version: "3.1"
services:
  pg_master:
    image: postgres:15.3
    container_name: pg_master
    environment:
      POSTGRES_PASSWORD: liubei@161
      POSTGRES_USER: liubei
      POSTGRES_DB: xishu
      TZ: Asia/Shanghai
    ports:
      - 15432:5432
    volumes:
      - ./data:/var/lib/postgresql/data
    restart: always
  • 启动容器
[root@liubei pg-m]# docker-compose up -d
[root@liubei pg-m]# docker-compose ps
  Name                 Command              State            Ports
---------------------------------------------------------------------------
pg_master   docker-entrypoint.sh postgres   Up      0.0.0.0:15432->5432/tcp
  • 进入容器,登录数据库
[root@liubei pg-m]# docker exec -it pg_master bash
root@6234c01debbf:/# psql -U liubei -d xishu
  • 创建复制用户
xishu=# CREATE USER replic WITH REPLICATION ENCRYPTED PASSWORD 'liubei@161';
  • 修改配置文件

修改 data/postgresql.conf文件,添加如下内容:

listen_addresses = '*'   #监听所有IP
archive_mode = on      #允许归档
archive_command = '/bin/date'    #用该命令来归档logfile segment,这里取消归档。
wal_level = replica    #开启热备
max_wal_senders = 10    #这个设置了可以最多有几个流复制连接,差不多有几个从,就设置几个
wal_keep_size = 1024    #设置wal的大小,单位M。
wal_sender_timeout = 60s #设置流复制主机发送数据的超时时间
max_connections = 100    #这个设置要注意下,从库的max_connections必须要大于主库的
  • 修改权限文件data/pg_hba.conf,添加如下内容
host    replication     replic        0.0.0.0/0           trust
  • 重启主库
[root@liubei pg-m]# docker-compose restart

2. 从库

  • 创建pg-s目录,进入该目录
  • 创建docker-compose.yml文件,内容如下:
version: "3.1"
services:
  pg_master:
    image: postgres:15.3
    container_name: pg_master
    environment:
      POSTGRES_PASSWORD: liubei@161
      POSTGRES_USER: liubei
      POSTGRES_DB: xishu
      TZ: Asia/Shanghai
    ports:
      - 15432:5432
    volumes:
      - ./data:/var/lib/postgresql/data
      - ./data1:/var/lib/postgresql/data1 #这个目录用于首次同步master数据用
    restart: always
  • 启动容器
[root@liubei pg-s]# docker-compose up -d
[root@liubei pg-s]# docker-compose ps
  Name                 Command              State            Ports
---------------------------------------------------------------------------
pg_master   docker-entrypoint.sh postgres   Up      0.0.0.0:25432->5432/tcp
  • 进入容器,从主库复制内容
[root@liubei pg-s]# docker exec -it pg_slave bash
root@ba12ab948d00:/# pg_basebackup -h 10.10.239.157 -p 15432 -U replic -Fp -Xs -Pv -R -D /var/lib/postgresql/data1
  • 停止容器
[root@liubei pg-s]# docker-compose down
  • 替换数据
[root@liubei pg-s]# rm -rf data/*
[root@liubei pg-s]# mv data1/* data
  • 修改yml文件,删除如下这一行
      - ./data1:/var/lib/postgresql/data1 #这个目录用于首次同步master数据用
  • 添加 data/standby.signal文件,内容如下
Tandby_mode = 'on'
  • 修改 data/postgresql.conf 文件,内容如下:
wal_level replica   # WAL 日志级别为 replica
primary_conninfo = 'host=10.10.181.157 port=15432 user=replic password=liubei@161'   # 主库连接信息
hot_standby = on                     # 恢复期间,允许查询
recovery_target_timeline = latest    # 默认
max_connections = 120
  • 重启从库
[root@liubei pg-s]# docker-compose restart

3. 测试

  • 登录主库,查看链接的从库
xishu=# select client_addr,sync_state from pg_stat_replication;
  client_addr  | sync_state
---------------+------------
 192.168.128.1 | async
(1 row)
  • 在主库上建立表
xishu=# CREATE TABLE users02(
   ID INT PRIMARY KEY     NOT NULL,
   name           CHAR(50)    NOT NULL,
   mail        CHAR(50),
   phone        CHAR(50)
);
  • 在从库上看查看结果
xishu=# \d
         List of relations
 Schema |  Name   | Type  | Owner
--------+---------+-------+--------
 public | users   | table | liubei
(1 rows)


在这里插入图片描述

;