chenp32788 2025-08-09 16:07 采纳率: 0%
浏览 4

postgresql主从复制问题

我在VM虚拟机里装了两个Linux系统,每个系统里面用docker 安装了postgresql数据库,现在两台数据库做集群主备切换,备库可以连接主库,一切正常,主库设置了复制用户。备库在用docker run --rm -it --network host postgres:16 pg_basebackup -h 192.168.223.128 -U replicator -D /tmp/pgdata -Fp -Xs -P
初始化时,一直报no pg_hba.conf entry for replication connection from host "192.168.223.129", user "replicator", no encryption错误,在主库日志上也能看到这个报错日志,虚拟机用的net网络,请问是怎么回事

  • 写回答

4条回答 默认 最新

  • 檀越@新空间 2025-08-09 16:08
    关注

    下午好🌅🌅🌅
    本答案参考通义千问

    你遇到的问题是 PostgreSQL 主从复制中 pg_basebackup 报错,具体错误信息是:

    no pg_hba.conf entry for replication connection from host "192.168.223.129", user "replicator", no encryption

    这个错误的原因是 主库的 pg_hba.conf 配置没有允许备库的 IP 地址通过复制连接。下面我们来详细分析并提供解决方案。


    一、问题原因分析

    1. pg_hba.conf 文件配置缺失

    PostgreSQL 的 pg_hba.conf 文件控制客户端连接权限,包括 复制连接(replication)。如果未在该文件中添加对应的规则,就会出现上述错误。

    2. IP 地址不匹配或网络配置问题

    虽然你说“备库可以连接主库”,但可能只是普通的连接(如使用 psql 连接),而 复制连接需要特定的配置。此外,虚拟机的网络模式(如 host 模式)可能导致 IP 地址无法正确识别。


    二、解决方案步骤

    第一步:检查主库的 pg_hba.conf 配置

    查找 pg_hba.conf 的位置

    # 在主库容器中执行以下命令
    psql -U postgres -c "SHOW hba_file;"
    

    打开 pg_hba.conf 文件

    sudo nano /path/to/pg_hba.conf
    

    添加如下行(假设主库 IP 是 192.168.223.128,备库 IP 是 192.168.223.129):

    # Allow replication connections from the standby server
    host    replication     replicator      192.168.223.129/32       trust
    

    注意: 如果使用的是 host 网络模式,那么主库和备库可能共享同一个 IP,这时候需要根据实际网络情况调整 IP 或使用 0.0.0.0/0(不推荐生产环境)。


    第二步:重启 PostgreSQL 服务使配置生效

    # 在主库容器中执行
    sudo systemctl restart postgresql
    

    或者直接重启 Docker 容器(如果你使用的是 Docker):

    docker restart <postgres_container_id>
    

    第三步:确保主库监听所有接口

    检查主库的 postgresql.conf 文件中的 listen_addresses 设置:

    # 在主库容器中执行
    psql -U postgres -c "SHOW listen_addresses;"
    

    如果输出为 localhost,则需要修改为:

    listen_addresses = '*'
    

    然后重启 PostgreSQL:

    sudo systemctl restart postgresql
    

    第四步:确认备库的 IP 地址是否正确

    在备库中执行:

    ifconfig
    

    或:

    ip a
    

    查看你的网络接口(如 eth0enp0s3)对应的 IP 地址,确保与 pg_hba.conf 中的 IP 匹配。


    第五步:重新运行 pg_basebackup 命令

    在备库中再次运行:

    docker run --rm -it --network host postgres:16 \
      pg_basebackup -h 192.168.223.128 -U replicator -D /tmp/pgdata -Fp -Xs -P
    

    注意: 如果使用的是 --network host,请确保主库和备库在同一个网络中,并且 IP 可以互相访问。


    三、示例配置文件内容

    pg_hba.conf 示例(主库)

    # TYPE  DATABASE        USER            ADDRESS                 METHOD
    local   all             all                                     peer
    host    all             all             127.0.0.1/32            md5
    host    all             all             ::1/128                 md5
    host    replication     replicator      192.168.223.129/32      trust
    

    postgresql.conf 示例(主库)

    listen_addresses = '*'
    

    四、常见错误排查建议

    | 错误信息 | 解决方案 | |----------|----------| | no pg_hba.conf entry for replication connection | 修改 pg_hba.conf,添加复制用户和 IP 的规则 | | no encryption | 如果不需要加密,可以使用 trust 方法;若需加密,可配置 SSL | | connection refused | 检查主库是否监听所有地址(listen_addresses = '*') | | password authentication failed | 确保 pg_hba.conf 中的 method 设置为 md5scram-sha-256 并设置密码 |


    五、总结

    | 步骤 | 内容 | |------|------| | 1 | 修改主库的 pg_hba.conf,添加复制用户的 IP 和权限 | | 2 | 重启 PostgreSQL 服务 | | 3 | 确保主库监听所有 IP 地址 | | 4 | 确认备库的 IP 地址是否正确 | | 5 | 重新运行 pg_basebackup 命令 |


    如果你仍然遇到问题,可以提供以下信息帮助进一步诊断:

    • 主库的 pg_hba.conf 内容
    • 主库的 postgresql.conf 内容
    • 备库的 IP 地址
    • Docker 的网络配置(如 --network host 是否生效)

    希望这些信息能帮你解决问题!如果需要代码示例或进一步说明,请告诉我。

    评论

报告相同问题?

问题事件

  • 创建了问题 8月9日