You need to enable JavaScript to run this app. 通过SSH隧道搭建pglogical出现Connection reset by peer报错如何解决
优惠活动
大模型
产品
解决方案
定价
更多

通过SSH隧道搭建pglogical出现Connection reset by peer报错如何解决

排查方向如下:


1. 订阅端DSN路由规则不匹配

  • AWS RDS是托管服务,其发起的对外连接遵循RDS实例所属VPC的路由、安全组规则,你配置订阅时填写的host=10.2.0.8是SSH隧道的AWS侧入口地址,需确认两点:
    • RDS实例的出站安全组规则是否允许访问10.2.0.8的PostgreSQL端口(默认5432)
    • 10.2.0.8所属资源的入站安全组/防火墙规则是否允许RDS实例的私有IP段访问对应端口
  • 你之前用psql、postgres_fdw验证连通性是在AWS侧的EC2/ECS实例上操作,和RDS本身的网络权限是隔离的,不能直接等同。

2. 发布端replication连接权限未放通

  • pglogical用的是逻辑复制连接,和普通业务连接权限分开配置,哪怕postgres_fdw能正常连本地PG,也不代表复制权限已开:
    • 检查本地发布端的pg_hba.conf是否添加了RDS实例IP段的replication权限,配置示例:
    host    replication     all     <RDS私有IP段>/16     md5
    
    • 修改后需重载配置SELECT pg_reload_conf();生效。

3. pglogical基础参数配置缺失

确认两端PostgreSQL已开启必要参数,修改后需重启进程生效,可执行show <参数名>验证:

  • 发布端参数:
wal_level = logical
max_wal_senders = 10 # 至少大于订阅数+1
max_replication_slots = 10 # 至少大于订阅数
shared_preload_libraries = 'pglogical'
  • 订阅端参数:
max_replication_slots = 10 # 至少大于订阅数
max_worker_processes = 16 # 至少大于10,预留pglogical工作进程
shared_preload_libraries = 'pglogical'

4. 复制用户权限不足

确认DSN中使用的数据库用户权限符合要求:

  • 发布端用户需要有replication权限、同步表的SELECT权限、pglogical schema的使用权限
  • RDS订阅端用户需要绑定rds_superuser角色、同步表的写入权限、pglogical schema的使用权限

5. 长连接被中间设备切断

pglogical是长连接传输数据,若没有保活机制会被中间防火墙、SSH隧道默认规则切断,可添加两层保活配置:

  • SSH隧道启动参数添加保活:
ssh -o ServerAliveInterval=30 -o ServerAliveCountMax=5 <原有隧道配置参数>
  • 两端PostgreSQL添加TCP保活参数:
tcp_keepalives_idle = 30
tcp_keepalives_interval = 10
tcp_keepalives_count = 5

6. pglogical版本不兼容

确认两端安装的pglogical大版本一致,比如发布端用pglogical 2.3.x,RDS侧也需要安装适配PG10的2.3.x版本pglogical扩展,大版本不匹配会导致握手阶段直接断开连接。


内容的提问来源于stack exchange,提问作者Pavel Kucera

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.12 03:21:04