Pgpool2报错unable to read message kind的原因排查求助
Pgpool 报错:
unable to read message kind 问题排查 问题背景
本地虚拟机环境下Pgpool配置正常,但在VPS架构(1主库、1从库、1Pgpool节点)中重复配置后出现报错:
child pid 5286: ERROR: unable to read message kind
child pid 5286: DETAIL: kind does not match between main(53) slot[1] (4e)
PostgreSQL流复制功能正常,Pgpool节点可通过psql直接访问两台后端库,但Pgpool无法正常提供服务。核心Pgpool配置如下:
backend_clustering_mode = 'streaming_replication' # 后端节点配置 backend_hostname0 = '{my-ip-1}' backend_port0 = 5432 backend_weight0 = 0 backend_flag0 = 'DISALLOW_TO_FAILOVER' backend_hostname1 = '{my-ip-2}' backend_port1 = 5432 backend_weight1 = 1 backend_flag1 = 'DISALLOW_TO_FAILOVER' # 基础连接配置 listen_addresses = '*' port = 9999
报错原因及解决方法
该错误是Pgpool解析后端PostgreSQL响应时,发现消息类型不匹配导致的,核心排查方向如下:
1. 后端节点角色标识错误
在流复制模式下,Pgpool需要明确区分主从节点,但当前配置中两个节点都设置了DISALLOW_TO_FAILOVER,未指定主库:
- 将主库的
backend_flag0改为ALWAYS_PRIMARY,确保Pgpool将写请求路由到主库 - 主库的
backend_weight0不应设为0(0会排除负载均衡,但主库需要处理写操作,建议设为1) - 从库可保留
DISALLOW_TO_FAILOVER或使用默认的ALLOW_TO_FAILOVER
2. Pgpool与PostgreSQL版本不兼容
不同版本间的PostgreSQL协议存在差异,可能导致消息解析失败:
- 确认Pgpool版本与后端PostgreSQL版本的兼容性(例如Pgpool 4.x对应PostgreSQL 11及以上版本)
- 若版本不匹配,升级或降级Pgpool至兼容版本
3. 连接池缓存残留脏数据
旧的连接池缓存可能保留了错误会话状态:
- 停止Pgpool服务:
pgpool stop - 清理Pgpool运行时临时文件(默认路径为
/var/run/pgpool/) - 重新启动Pgpool:
pgpool start
4. 网络数据包被篡改或拦截
VPS环境中的防火墙、NAT或代理可能修改PostgreSQL协议包:
- 检查Pgpool节点到两个后端节点的5432端口是否完全开放,无中间设备拦截
- 使用
tcpdump抓包验证Pgpool与后端之间的协议包完整性
内容的提问来源于stack exchange,提问作者Miqueias Kevison
相关产品推荐
相关产品推荐

