业务无法通过hgproxy访问数据库

文章目录

环境

系统平台:N/A

版本:4.5,9.0

症状

版本说明

  • HGDB 4.5系列或9系列。
  • hgproxy版本6.0及以上。

故障描述

业务无法通过 hgproxy 的代理端口连接数据库;后端 HGDB 端口(默认 5866)本身可正常提供服务,业务直连 HGDB 端口正常。通过 hgproxy 端口(示例为 9999)连接时报错如下(Druid 数据源初始化阶段):

复制代码
2026-08-05 10:00:00.608 ERROR --- [main] c.alibaba.druid.pool.DruidDataSource : init datasource error,
  url: jdbc:highgo://IP地址:9999/zbdlry?currentSchema=dbo&stringtype=unspecified&sslmode=disable&connectTimeout=5&socketTimeout=30
com.highgo.jdbc.util.PSQLException: 尝试连线已失败。
        at com.highgo.jdbc.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:347)
        at com.highgo.jdbc.core.ConnectionFactory.openConnection(ConnectionFactory.java:51)
        at com.highgo.jdbc.jdbc.PgConnection.<init>(PgConnection.java:249)
        at com.highgo.jdbc.Driver.makeConnection(Driver.java:602)
        (省略后续 Druid / 动态数据源调用栈)

问题原因

1.查询后端HGDB当前会话数,远小于 max_connections,排除后端数据库自身连接耗尽。

2.检查hgproxy配置文件,num_init_children 当前为32。

  • num_init_children 控制hgproxy可同时处理的最大客户端连接数。
  • 该值过低时,并发连接数超过上限后新连接被排队并在客户端超时后失败,导致业务无法通过hgproxy建连,而直连后端HGDB端口不受影响。

解决方案

1.定位 hgproxy 配置文件路径(通过进程参数确认):

复制代码
[root@hgdb2 bin]# ps -ef | grep -i hgproxy
root   950   1  0 14:55 ?  00:00:05 /usr/local/hgproxy/bin/hgproxy -f /usr/local/hgproxy/etc/hgproxy.conf -a /usr/local/hgproxy/etc/hgproxy_hba.conf -n

2.编辑配置文件 hgproxy.conf,取消注释并调整 num_init_children(注意配置文件默认该行为注释状态 #num_init_children = 32,必须去掉行首 # 才会生效):

复制代码
[root@hgdb2 bin]# grep -i num_init_children /usr/local/hgproxy/etc/hgproxy.conf
# num_init_children = 32

建议取值:按业务实际峰值并发数设置;若并发难以预估,可先设为后端数据库 max_connections 值。集群中实际提供代理服务的节点均需修改,保持一致。

3.依次重启所有节点的hgproxy服务:

复制代码
[root@hgdb2 bin]# systemctl restart hgproxy

验证

业务连通确认:从业务侧或测试客户端使用hgproxy端口(如 9999)发起连接,确认不再出现"尝试连线已失败"。

日志确认:查看hgproxy日志,确认无新的连接被拒绝 / 排队超时报错。

相关状态检查示例:

复制代码
[root@hgdb2 bin]# systemctl status hgproxy
● hgproxy.service - hgproxy
   Loaded: loaded (/usr/lib/systemd/system/hgproxy.service; enabled; vendor preset: disabled)
   Active: active (running) since Mon 2026-08-24 14:55:21 CST; 44min ago
 Main PID: 950 (hgproxy)
   CGroup: /system.slice/hgproxy.service
           ├─  950 /usr/local/hgproxy/bin/hgproxy -f /usr/local/hgproxy/etc/hgproxy.conf -a /usr/local/hgproxy/etc/hgproxy_hba.conf -n
           ├─ 1054 hgproxy: HgproxyLogger
           ├─ 1561 hgproxy: health check process(1)
           ├─73938 hgproxy: wait for connection request
           ├─73939 hgproxy: wait for connection request
           ... (以下为 N 个 wait for connection request 子进程,N 应与 num_init_children - reserved_connections 一致)
           └─73981 hgproxy: worker process
相关推荐
鱼很腾apoc1 小时前
【MySQL】 第1期 从核心概念到表约束全解析
linux·c语言·数据库·学习·mysql
10mAh1 小时前
【SQL】NOT IN 遇到 NULL 为什么返回空集?三值逻辑与反关联实战
jvm·数据库·sql
Alinket1 小时前
毫米波雷达 vs 摄像头 vs 手环:养老跌倒监测三类方案怎么选
网络·数据库·健康医疗·信息与通信·iot
七夜zippoe2 小时前
Agent 权限边界:别让 AI 误删你的生产库(安全设计)
数据库·人工智能·安全·ai·权限边界·安全设计
泡海椒2 小时前
JQuickExcel 批量导入:用 importDataInBatch 控制大文件消费边界
数据库·oracle
码流子2 小时前
事件告警延迟拆解:从摄像头到手机通知,延迟卡在哪六个环节
数据库·人工智能·物联网
啵啵啵鱼3 小时前
对数据的增删改查
数据库·mysql·ai·idea·ai编程·navicat·obsidian
靠沿3 小时前
MySQL数据库基础——索引的使用&alter、explain关键字
java·数据库·mysql
赵渝强老师3 小时前
【赵渝强老师】Oracle的行地址:ROWID
数据库·oracle