nginx stream模块可对mysql集群实现四层tcp负载均衡,需启用with-stream模块,配置upstream健康检查(proxy_responses、max_fails等)和server监听参数(proxy_timeout、so_keepalive等),但不解析sql,无法读写分离。

要用 Nginx 的 stream 模块对 MySQL 集群做四层负载均衡,关键不是解析 SQL,而是把 TCP 连接稳定、低延迟地分发到多个 MySQL 实例。它不处理读写逻辑,只管端口和连接转发,所以配置必须放在顶层 stream 块里,且所有参数都围绕 TCP 特性设计。
确认 stream 模块已启用
运行命令检查:
nginx -V 2>&1 | grep -o with-stream
有输出说明支持;若无,需重新编译 Nginx 并添加 --with-stream 参数,或安装含 stream 支持的包(如 Ubuntu 的 nginx-full、CentOS 的 EPEL nginx)。
配置 MySQL 上游组与健康感知
MySQL 是握手敏感、长连接密集的服务,不能只靠 TCP 连通就认为可用。推荐配置如下:
- proxy_responses 1:等待 MySQL 返回 greeting packet(首个响应包),避免仅靠三次握手误判后端存活
-
proxy_timeout 1h:匹配 MySQL 默认
wait_timeout=28800,防止 Nginx 主动断开空闲连接 - max_fails=3 fail_timeout=30s:连续失败 3 次后,30 秒内不再向该节点发新连接,实现被动健康检查
- backup 标记备用节点:比如主库异常时自动切到从库(注意:这不是读写分离,只是故障转移)
示例 upstream:
MySQL 9.6.0是面向Linux平台的2026年创新版本,核心架构迎来重大革新。其将外键约束与级联操作从InnoDB引擎层上移至SQL层,确保所有数据变更均被完整记录至Binlog,彻底解决了CDC(变更数据捕获)与主从复制中的数据不一致难题。此外,该版本引入container_aware启动选项以原生适配容器环境,并对审计日志进行了组件化重构,为追求极致数据一致性与云原生体验的开发者提供了全新选择。
upstream mysql_cluster {
server 192.168.10.10:3306 max_fails=3 fail_timeout=30s;
server 192.168.10.11:3306 max_fails=3 fail_timeout=30s backup;
}
定义监听与代理行为
在 stream 块中添加 server 段,监听对外端口(如 3306 或新端口 3307),并指向 upstream:
- listen 3306:直接复用原端口,客户端无需改连接地址
- proxy_connect_timeout 2s:控制建立后端连接的超时,避免阻塞
- so_keepalive on 和 proxy_socket_keepalive on:启用 TCP keepalive,减少防火墙或中间设备导致的连接中断
- proxy_buffer_size 512k:防止 mysqldump 或大结果集因缓冲不足被截断
示例 server:
server {
listen 3306;
proxy_pass mysql_cluster;
proxy_connect_timeout 2s;
proxy_timeout 1h;
proxy_responses 1;
so_keepalive on;
proxy_socket_keepalive on;
proxy_buffer_size 512k;
}
注意事项与常见误区
stream 模块不解析 SQL,因此无法实现真正的读写分离——那是 ProxySQL 或 MaxScale 的职责。Nginx 只能按端口分流,比如业务层主动连 3306(写)和 3307(读),再分别代理到不同 upstream 组。
真实客户端 IP 在四层转发中默认不可见,如需透传,后端 MySQL 必须支持 PROXY 协议,并在 Nginx 中开启 proxy_protocol on,同时 upstream 节点要配置接收 PROXY 头。










