通过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
相关产品推荐
相关产品推荐

