WAL配置SSL关闭,Docker-Compose主从库WAL复制配置故障求助
Hey,我之前折腾Postgres主从复制在Docker Compose里跑的时候也踩过不少坑,结合你说的情况,给你梳理几个关键的排查和修复方向,应该能帮到你:
先检查主库的核心配置是否到位
主库必须开启WAL相关配置才能支持复制,你需要确保postgresql.conf里有这些设置:wal_level = replica max_wal_senders = 5 # 至少要大于1,允许从库连接 wal_keep_size = 16MB # 保留足够的WAL日志供从库同步 archive_mode = on archive_command = 'cp %p /var/lib/postgresql/archive/%f' # 归档命令,按需调整路径同时在
pg_hba.conf里要添加允许从库复制用户连接的规则:host replication replicator 0.0.0.0/0 md5注意Docker容器里的配置文件挂载路径要正确,确保容器启动时能加载到修改后的配置,而不是用默认配置。
从库的初始化逻辑不能少
从库不能直接启动空的Postgres实例,得先从主库拉取基础数据。你可以给从库加一个启动初始化脚本,比如init-slave.sh,内容大概是:#!/bin/bash set -e # 如果还没初始化过,就从主库拉取数据 if [ ! -f "/var/lib/postgresql/data/recovery.conf" ]; then # 替换成你的主库服务名、复制用户密码 pg_basebackup -h postgres-master -U replicator -D /var/lib/postgresql/data -P -X stream -C -S standby1 # 生成recovery配置 echo "standby_mode = 'on'" > /var/lib/postgresql/data/recovery.conf echo "primary_conninfo = 'host=postgres-master port=5432 user=replicator password=your_replica_password'" >> /var/lib/postgresql/data/recovery.conf echo "trigger_file = '/tmp/promote_to_master'" >> /var/lib/postgresql/data/recovery.conf fi # 启动Postgres exec postgres然后在Docker Compose里把这个脚本挂载到从库的
/docker-entrypoint-initdb.d/目录下,记得给脚本加可执行权限:chmod +x init-slave.sh。Docker Compose的依赖和健康检查要配置
从库必须等主库完全就绪后再启动,否则会连接失败。你可以在docker-compose.yml里给主库加健康检查,让从库依赖主库的健康状态:services: postgres-master: image: postgres:15 # 用你实际的Postgres版本 ports: - "5432:5432" volumes: - master-data:/var/lib/postgresql/data - ./master/postgresql.conf:/var/lib/postgresql/data/postgresql.conf - ./master/pg_hba.conf:/var/lib/postgresql/data/pg_hba.conf environment: - POSTGRES_USER=postgres - POSTGRES_PASSWORD=your_master_password - POSTGRES_DB=your_db_name healthcheck: test: ["CMD-SHELL", "pg_isready -U postgres"] interval: 5s timeout: 5s retries: 5 postgres-slave: image: postgres:15 ports: - "5433:5432" volumes: - slave-data:/var/lib/postgresql/data - ./slave/init-slave.sh:/docker-entrypoint-initdb.d/init-slave.sh environment: - POSTGRES_USER=postgres - POSTGRES_PASSWORD=your_slave_password depends_on: postgres-master: condition: service_healthy权限问题别忽略
Docker里Postgres进程是用postgres用户运行的,所以你挂载的本地目录、初始化脚本的权限要正确,不然会出现无法写入的错误。比如本地的master-data和slave-data卷,启动后容器会自动设置权限,但自定义脚本要确保是可执行的。日志是排查问题的关键
如果上面的调整还是没解决问题,先看看主从库的容器日志,命令是:docker logs postgres-master docker logs postgres-slave日志里会给出具体的错误信息,比如连接超时、密码错误、配置参数无效等,根据日志再针对性调整就好。
内容的提问来源于stack exchange,提问作者Oracy Martos

