文章目录
环境
系统平台: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