Nginx通常用作HTTP负载均衡器,但通过TCP/UDP负载均衡功能(ngx_stream_core_module),也可以实现对MySQL的负载均衡。以下是配置步骤:
确保你的Nginx版本支持stream模块(1.9.0及以上版本),并已编译包含--with-stream
参数。
nginx -V 2>&1 | grep -o with-stream
在nginx.conf或单独配置文件中添加stream块:
stream {
upstream mysql_backend {
# 默认使用轮询(round-robin)算法
server mysql1.example.com:3306;
server mysql2.example.com:3306;
server mysql3.example.com:3306;
# 可选:设置权重
# server mysql1.example.com:3306 weight=3;
}
server {
listen 3306; # 监听3306端口
proxy_pass mysql_backend;
# 可选:设置连接超时
proxy_connect_timeout 1s;
# 可选:启用TCP keepalive
proxy_socket_keepalive on;
}
}
upstream mysql_backend {
# least_conn - 最少连接数
least_conn;
server mysql1.example.com:3306;
server mysql2.example.com:3306;
}
Nginx社区版不直接支持TCP健康检查,但可以通过商业版或第三方模块实现:
upstream mysql_backend {
server mysql1.example.com:3306 max_fails=3 fail_timeout=30s;
server mysql2.example.com:3306 max_fails=3 fail_timeout=30s;
}
server {
listen 3306;
proxy_pass mysql_backend;
proxy_ssl on;
proxy_ssl_verify off; # 可选:关闭证书验证
}
连接保持:MySQL是有状态服务,简单的轮询可能导致问题。考虑:
IP哈希配置示例:
upstream mysql_backend {
hash $remote_addr consistent;
server mysql1.example.com:3306;
server mysql2.example.com:3306;
}
性能考虑:Nginx的TCP负载均衡不如专门的数据库中间件(如ProxySQL)功能丰富
监控:确保监控后端MySQL实例的健康状态
user nginx;
worker_processes auto;
events {
worker_connections 1024;
}
stream {
upstream mysql_cluster {
least_conn;
server 192.168.1.101:3306 max_fails=3 fail_timeout=30s;
server 192.168.1.102:3306 max_fails=3 fail_timeout=30s;
server 192.168.1.103:3306 max_fails=3 fail_timeout=30s backup;
}
server {
listen 3306 so_keepalive=on;
proxy_pass mysql_cluster;
proxy_connect_timeout 3s;
proxy_timeout 3600s;
}
}
对于生产环境,考虑更专业的MySQL负载均衡/路由解决方案: - ProxySQL - MySQL Router - HAProxy - MaxScale
这些工具提供更完善的MySQL特定功能,如: - 读写分离 - 查询缓存 - 更精细的健康检查 - 连接池管理