Nginx Stream本身不提供连接池,仅做四层TCP透传;其“高可用”体现为:统一接入、故障自动转移、长连接稳定分发,需配合后端数据库集群与客户端连接池协同实现。

Nginx Stream 本身不提供连接池功能,它做的是四层 TCP 连接透传,不是连接复用或池化。所谓“通过 Nginx 实现数据库连接池高可用”,实际是指:用 Nginx Stream 作为前置负载入口,配合后端数据库集群(如 MySQL 主从、Redis 哨兵/主从),实现客户端连接的统一接入、故障自动转移与长连接稳定分发——这间接提升了应用侧连接管理的可靠性,效果接近连接池的高可用能力。
下面分几个关键环节说明怎么做才真正有效:
明确角色分工:Nginx 不代管连接,只负责可靠转发
- 客户端(如 Java 应用)仍需使用自己的连接池(HikariCP、Lettuce 等),Nginx 不替代它
- Nginx Stream 只在传输层做“管道”:接收客户端 TCP 连接 → 转发到某个后端实例 → 保持字节流双向透传
- 所以配置重点不是“建池”,而是不让连接意外中断、不让请求发到坏节点、让同一逻辑会话尽量稳定
MySQL 代理的关键配置要点
MySQL 是二进制协议、长连接、握手敏感,配置不当容易出现“连得上但认证失败”或“空闲断连”:
使用
proxy_responses 1
等待 MySQL 服务返回第一个响应包(通常是 Initial Handshake Packet)再认为连接成功,避免仅靠 TCP 握手误判后端存活-
设置匹配业务的超时组合
proxy_connect_timeout 3s; # 建连不能拖太久 proxy_timeout 30000s; # 必须 ≥ MySQL 的 wait_timeout(默认 28800s),否则 Nginx 先断开
-
关闭 Nagle 算法 + 加大缓冲区
tcp_nodelay on; # 减少小包延迟,对交互式 SQL 更友好 proxy_buffer_size 512k; # 防止 mysqldump 或大结果集被截断
-
启用保活机制
so_keepalive on; # 让内核定期发 keepalive 包,防中间设备(如防火墙)静默断连
Redis 代理需注意连接语义一致性
Redis 协议简单但对原子性敏感(如 pipeline、事务、Lua 脚本),错误调度会导致命令错乱:
面向 CRM 系统的 MySQL 8 数据库模式设计。当用户需要为客户关系管理(CRM)系统设计、评审、优化或生成数据库模式时,应使用此项技能。
禁用连接合并与复用
Nginx 不应做连接池式复用,必须确保每个客户端 TCP 连接只绑定一个后端 Redis 实例
→ 不配proxy_buffering on,不启用 PROXY 协议(除非后端明确支持)-
推荐用
ip_hash或least_connupstream redis_ro { ip_hash; # 同一客户端 IP 总打到同一 replica,保障 pipeline 语义 server 192.168.1.10:6379; server 192.168.1.11:6379; }若用
least_conn,适合连接数波动大的场景;若用hash $remote_addr consistent,更适合扩缩容频繁的只读集群 -
健康检查要务实
开源版 Nginx stream 不支持 RESP 层探活(如PING/OK),只能做 TCP 端口连通性检测:health_check interval=3s timeout=1s fails=3 passes=2;
注意:这只能发现进程挂了或端口关了,无法感知 Redis OOM、主从断裂、
LOADING状态等——需配合外部脚本或监控告警兜底
高可用落地的实用技巧
对外暴露独立端口,隔离读写流量
比如 MySQL 主库走3306,只读集群走3307;Redis 写走6379,读走6380,应用按角色连接,Nginx 不做路由判断-
后端节点标记角色与权重
upstream mysql_backend { server 192.168.1.10:3306 weight=10; # 主库,可读可写 server 192.168.1.11:3306 backup; # 从库,仅故障时接管 server 192.168.1.12:3306 max_fails=3 fail_timeout=30s; # 常态只读节点 } 配合应用层做读写分离与降级
Nginx 不解析 SQL,所以SELECT和UPDATE都一样转发。真正的读写分离必须由客户端驱动(如 ShardingSphere、MyBatis 路由插件),Nginx 只负责把“已选好”的请求稳稳送到对应集群
不复杂但容易忽略










