• Docker部署 PostgreSQL 12.4主从环境


    环境架构

    基于PG 12.4 版本安装

    主服务器ip:172.24.6.227

    从服务器ip:172.24.6.228

    步骤1:下载镜像

    docker pull postgres:12.4-alpine
    

    官方镜像地址:https://hub.docker.com/_/postgres?tab=description

    可根据自己需要下载其他版本的 PG。注意PG12版本前新建recovery.conf2步骤3:运行容器

    步骤2:运行容器

    通过指定端口映射,目录映射,容器名运行容器。

    • 主服务器
    1. mkdir -p /home/pg_p/data
    2. docker run --name pg_p --restart=always -v /home/pg_p/data:/var/lib/postgresql/data -e POSTGRES_PASSWORD=123456 -p 15432:5432 -d postgres:12.4-alpine
    • 从服务器
    1. mkdir -p /home/pg_p/data
    2. docker run --name pg_p --restart=always -v /home/pg_p/data:/var/lib/postgresql/data -e POSTGRES_PASSWORD=123456 -p 15432:5432 -d postgres:12.4-alpine

    参数说明:

    • –name:指定容器名,随便写
    • –restart=always:表示容器随着docker进程自动启动
    • –network,–ip:容器指定IP
    • -v :将容器内的目录映射(/var/lib/postgresql/data)到本机目录(/home/pg_s/data)
    • -e:其他参数
    • -p:端口映射,将容器内的端口映射到本机端口,前面是本机端口,后面是容器端口。
    • -d:镜像名称

    步骤3:正常配置主从相关参数

    进入容器命令:

    1. [root@lei ~]# docker exec -it pg_p /bin/bash
    2. bash-5.0# su - postgres
    3. bff818d570c9:~$ psql
    4. psql (12.4)
    5. Type "help" for help.
    6. postgres=#

    主数据库

    • 创建复制用户:
    1. CREATE ROLE replica login replication encrypted password 'replica';
    2. postgres=# \du
    3. List of roles
    4. Role name | Attributes | Member of
    5. -----------+------------------------------------------------------------+-----------
    6. postgres | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
    7. replica | Replication | {}
    • 修改 pg_hba.conf

    修改pg_hba.conf,允许 replica用户从 172.24.6.228从库上连接主库。配置文件在本地:/home/pg_p/data目录下,如

    host   replication      replica       172.24.6.228/32          trust   #允许172.24.6.228使用 replica 用户来复制
    
    • 修改postgresql.conf

    必须修改的配置是前面三个,后面几个看情况修改。

    1. listen_addresses = '*' # 监听所有IP
    2. archive_mode = on # 允许归档
    3. wal_level = replica # 开启热备
    4. archive_command = '/bin/date' # 用该命令来归档logfile segment,这里取消归档。
    5. max_wal_senders = 32 # 这个设置了可以最多有几个流复制连接,差不多有几个从,就设置几个
    6. wal_keep_segments = 64 # 设置流复制保留的最多的xlog数目,一份是 16M,注意机器磁盘 16M*64 = 1G
    7. wal_sender_timeout = 60s # 设置流复制主机发送数据的超时时间
    8. max_connections = 200 # 这个设置要注意下,从库的max_connections必须要大于主库的
    • 最后重启容器,使配置生效。
    docker restart pg_p
    • 验证配置是否生效
    1. postgres=# show archive_mode;
    2. archive_mode
    3. --------------
    4. on
    5. (1 row)

    从库

    修改从库相关配置,以及从主库初始化数据过来。

    • 初始化数据

    进入容器删除原始数据文件,利用pg_basebackup从主库初始化数据。

    1. [root@lei ~]# docker exec -it pg_s /bin/bash
    2. bash-5.0# su - postgres
    3. # 删除原有数据文件
    4. cedd81ee4e30:~$ rm -rf /var/lib/postgresql/data/*
    5. # 备份恢复
    6. cedd81ee4e30:~$ pg_basebackup -h 172.24.6.227 -p 15432 -U replica -Fp -Xs -Pv -R -D /var/lib/postgresql/data
    7. pg_basebackup: initiating base backup, waiting for checkpoint to complete
    8. pg_basebackup: checkpoint completed
    9. pg_basebackup: write-ahead log start point: 0/2000028 on timeline 1
    10. pg_basebackup: starting background WAL receiver
    11. pg_basebackup: created temporary replication slot "pg_basebackup_43"
    12. 24636/24636 kB (100%), 1/1 tablespace
    13. pg_basebackup: write-ahead log end point: 0/2000138
    14. pg_basebackup: waiting for background process to finish streaming ...
    15. pg_basebackup: syncing data to disk ...
    16. pg_basebackup: base backup completed

    pg_basebackup参数说明:

    1. pg_basebackup -h 172.24.6.227 -p 15432 -U replica -Fp -Xs -Pv -R -D /var/lib/postgresql/data
    2. -h, --host=HOSTNAME 数据库服务器主机或套接字目录
    3. -p, --port=PORT 数据库服务器端口号
    4. -U, --username=NAME 以指定的数据库用户连接
    5. -F, --format=p|t 输出格式(plain(默认),tar)
    6. -X, --wal-method=none|fetch|stream 包含指定方法所需的 WAL 文件
    7. -P, --progress 显示进度信息
    8. -R, --write-recovery-conf 用于复制的写入配置
    9. -D, --pgdata=DIRECTORY 接收基本备份到目录
    • 新增并配置standby.signal文件
    standby_mode = 'on'
    
    • 修改 postgresql.conf
    1. wal_level = replica # WAL 日志级别为 replica
    2. primary_conninfo = 'host=172.24.6.214 port=15432 user=replica password=123456' # 主库连接信息
    3. hot_standby = on # 恢复期间,允许查询
    4. recovery_target_timeline = latest # 默认
    5. max_connections = 120 # 大于等于主节点,正式环境应当重新考虑此值的大小
    • 重启容器
    docker restart pg_s

    步骤4:验证主从是否正常

    方法1:主库上执行以下命令,可以看到从库信息

    1. postgres=# select client_addr,sync_state from pg_stat_replication;
    2. client_addr | sync_state
    3. ---------------+------------
    4. 172.24.6.228 | async
    5. (1 row)

    方法2:主库上新建数据库

    主库

    1. CREATE DATABASE test01
    2. postgres=#
    3. postgres=# \c test01
    4. You are now connected to database "test01" as user "postgres".
    5. test01=# create table test(name varchar(50));
    6. CREATE TABLE
    7. test01=# insert into test values('tom');
    8. INSERT 0 1

    从库

    1. postgres-# \l
    2. List of databases
    3. Name | Owner | Encoding | Collate | Ctype | Access privileges
    4. -----------+----------+----------+------------+------------+-----------------------
    5. test01 | postgres | UTF8 | en_US.utf8 | en_US.utf8 |
    6. postgres | postgres | UTF8 | en_US.utf8 | en_US.utf8 |
    7. template0 | postgres | UTF8 | en_US.utf8 | en_US.utf8 | =c/postgres +
    8. | | | | | postgres=CTc/postgres
    9. template1 | postgres | UTF8 | en_US.utf8 | en_US.utf8 | =c/postgres +
    10. | | | | | postgres=CTc/postgres
    11. (4 rows)
    12. postgres-# \c test01
    13. You are now connected to database "test01" as user "postgres".
    14. test01=# select * from test;
    15. name
    16. ------
    17. tom
    18. (1 row)

    大功告成!!!

  • 相关阅读:
    Ubuntu 18.04 中 卸载/安装G2O库
    53.最大子数组和
    js实现图片懒加载
    LPRNet, 车牌识别网络
    TypeScript 基础知识之对象、数组
    hevc vps解析
    Redis十大数据类型
    [JS入门到进阶] 手写解析uin8数组的工具:解析二进制字节,太快太方便了!
    多元线性回归方法的应用,人工神经网络回归分析
    二刷力扣--字符串
  • 原文地址:https://blog.csdn.net/sunayn/article/details/127867420