Nginx 对 MySQL 集群的负载均衡配置详解
一、MySQL 负载均衡架构概述
1. 常见 MySQL 集群架构
架构类型 | 特点 | 适用场景 |
---|---|---|
主从复制 | 读写分离,从库只读 | 读多写少 |
Galera Cluster | 多主同步,强一致性 | 高可用写入 |
MySQL Router | 官方中间件 | InnoDB Cluster |
ProxySQL | 专业数据库代理 | 复杂路由规则 |
2. Nginx 作为 MySQL 代理的适用场景
- 仅适用于 TCP 负载均衡(Nginx Plus 或开源版 Stream 模块)
- 简单读写分离(需应用层配合)
- 连接池管理(替代部分连接池功能)
二、Nginx 基础配置(TCP层)
1. 启用 Stream 模块
# 在nginx.conf主配置中添加
load_module modules/ngx_stream_module.so;
2. 基础 MySQL 负载均衡配置
stream {
upstream mysql_cluster {
server 10.0.0.1:3306 weight=5; # 主库
server 10.0.0.2:3306; # 从库1
server 10.0.0.3:3306; # 从库2
}
server {
listen 3306;
proxy_pass mysql_cluster;
proxy_connect_timeout 3s;
proxy_timeout 600s; # MySQL长连接超时
}
}
三、高级配置策略
1. 读写分离实现
# 写操作定向到主库
upstream mysql_master {
server 10.0.0.1:3306;
}
# 读操作负载均衡
upstream mysql_slaves {
server 10.0.0.2:3306;
server 10.0.0.3:3306;
}
server {
listen 3306;
# 通过端口区分读写
proxy_pass $upstream;
# 识别SQL语句(需Nginx Plus)
# 简单实现:不同端口对应不同集群
}
2. 健康检查(Nginx Plus 专属)
upstream mysql_cluster {
zone mysql_zone 64k;
server 10.0.0.1:3306 resolve;
server 10.0.0.2:3306 resolve;
# 主动健康检查
health_check interval=10s passes=2 fails=3;
}
3. 连接池优化
server {
proxy_buffer_size 16k;
proxy_buffers 4 32k;
# 保持连接
proxy_socket_keepalive on;
proxy_mysql_keepalive on; # 需第三方模块
}
四、替代方案对比
方案 | 优点 | 缺点 | 适用场景 |
---|---|---|---|
Nginx TCP代理 | 配置简单,高并发 | 无SQL解析能力 | 简单负载均衡 |
ProxySQL | 完整SQL路由,缓存 | 需要独立部署 | 生产级读写分离 |
MySQL Router | 官方组件,InnoDB集群集成 | 功能较基础 | MySQL Group Replication |
HAProxy | 高性能TCP代理 | 无MySQL协议支持 | 基础负载均衡 |
五、生产环境建议
1. 读写分离最佳实践
# 方案:不同端口对应不同集群
server {
listen 3306; # 默认路由到从库
proxy_pass mysql_slaves;
}
server {
listen 3307; # 写操作端口
proxy_pass mysql_master;
}
2. 故障转移配置
upstream mysql_master {
server 10.0.0.1:3306 max_fails=3 fail_timeout=30s;
server 10.0.0.4:3306 backup; # 备用主库
}
3. 安全加固
server {
listen 3306;
# IP白名单
allow 192.168.1.0/24;
deny all;
# SSL加密
proxy_ssl on;
proxy_ssl_certificate /path/to/client.pem;
}
六、性能优化参数
1. 内核参数调整
# 增加TCP连接数
echo "net.ipv4.tcp_max_syn_backlog = 4096" >> /etc/sysctl.conf
sysctl -p
2. Nginx 关键配置
events {
worker_connections 2048; # 每个worker的连接数
use epoll; # Linux高性能事件模型
}
stream {
proxy_responses 1; # 等待后端响应
proxy_connect_timeout 3s;
}
七、监控与维护
1. 监控指标
# 查看活跃连接
netstat -anp | grep nginx | grep :3306
# Nginx状态监控
curl http://127.0.0.1/nginx_status
2. 日志分析
log_format mysql_log '$remote_addr [$time_local] '
'$protocol $status $bytes_sent';
3. 自动故障恢复
#!/bin/bash
# 监控脚本示例
if ! nc -z 10.0.0.1 3306; then
nginx -s reload
fi
总结
- Nginx 适合基础TCP层负载均衡,复杂SQL路由需用ProxySQL
- 读写分离建议通过不同端口实现,应用层控制路由逻辑
- 生产环境必须配置健康检查(Nginx Plus或第三方模块)
- 高可用架构需要配合主从切换工具(如Orchestrator)
最终建议:对于专业MySQL集群管理,推荐结合使用:
- Nginx(TCP层负载均衡)
- ProxySQL(SQL路由)
- Orchestrator(主从故障转移)
作者:admin 创建时间:2025-06-06 11:11
最后编辑:admin 更新时间:2025-06-07 09:49
最后编辑:admin 更新时间:2025-06-07 09:49