PostgreSQL 16.3 Docker Swarm主从集群pg_basebackup连接报错求助
解决PostgreSQL主从复制pg_hba.conf认证失败问题
1. 确认pg_hba.conf复制规则格式正确性
确保pg_hba.conf中包含格式正确的复制条目,注意replication是固定的专用数据库名,不是业务库名:
# 允许Swarm子网内的无密码复制连接(仅测试场景) host replication replicator 10.0.1.0/24 trust # 生产环境推荐的密码认证格式 host replication replicator 10.0.1.0/24 scram-sha-256
子网段需覆盖备机容器的实际IP(即报错中的10.0.1.109所属网段),若要允许所有IP可写0.0.0.0/0,但需确认无语法错误。
2. 强制重载PostgreSQL配置
进入主机PostgreSQL容器,先验证配置文件路径是否与你修改的一致:
SHOW hba_file;
确认后执行重载命令,避免需重启容器才生效:
SELECT pg_reload_conf();
3. 匹配Docker Swarm网络子网
报错中的10.0.1.109是容器在Swarm overlay网络内的IP,而非VPS的公网/内网IP。先查看Swarm网络的子网信息:
docker network inspect <你的Swarm overlay网络名称>
找到Subnet字段(比如10.0.1.0/24),确保pg_hba规则中的网段完全覆盖该范围。
4. 解决加密要求冲突
报错包含no encryption,若主机postgresql.conf中设置了ssl = on,而备机pg_basebackup未指定SSL参数,会触发认证失败。两种解决方式:
- 临时允许无加密复制(不推荐生产):在pg_hba中改用
hostnossl条目hostnossl replication replicator 10.0.1.0/24 scram-sha-256 - 备机执行
pg_basebackup时添加SSL参数:pg_basebackup -h <主机容器名或Swarm VIP> -U replicator -D /var/lib/postgresql/data -P -X stream --ssl-mode=require
5. 验证复制用户权限
确认复制用户拥有REPLICATION权限:
SELECT rolname, rolreplication FROM pg_roles WHERE rolname='replicator';
若rolreplication为false,执行授权命令:
ALTER USER replicator REPLICATION;
6. 检查容器配置文件挂载有效性
Docker Swarm部署时,若使用volume挂载pg_hba.conf和postgresql.conf,需进入主机容器查看文件内容,确认与本地修改的配置一致。若不一致,排查挂载路径错误或Swarm volume同步问题。
7. 测试基础连接可用性
在备机容器中先用psql测试复制连接:
psql -h <主机容器名> -U replicator -d replication
先解决基础连接问题,再执行pg_basebackup操作。
内容的提问来源于stack exchange,提问作者joccafi
相关产品推荐
相关产品推荐

