使用NGINX Plus实现MySQL负载教程
IDC服务
使用NGINX Plus实现MySQL负载教程
2025-03-19 00:02
NGINX Plus实现MySQL Galera Cluster负载均衡的完整指南 一、为什么需要NGINX Plus代理MySQL Galera Cluster?
NGINX Plus实现MySQL Galera Cluster负载均衡的完整指南
一、为什么需要NGINX Plus代理MySQL Galera Cluster?
MySQL Galera Cluster是支持多主写入的分布式数据库集群,但客户端直接连接单节点可能导致:
- 负载不均:某些节点压力过高。
- 故障切换延迟:某节点宕机时需手动切换。
- 连接数限制:单节点最大连接数受限。
通过NGINX Plus的TCP负载均衡功能,可实现:✅ 流量分发:均匀分配读写请求。✅ 高可用性:自动检测节点健康状态。✅ 会话保持:确保事务连续性。
? 重要提示:需使用NGINX Plus的Stream模块处理TCP协议,而非HTTP代理!
二、环境准备与安装
1. 安装NGINX Plus
# 以Ubuntu为例(需订阅NGINX Plus)
wget http://cs.nginx.com/static/files/nginx-repo.deb
sudo dpkg -i nginx-repo.deb
sudo apt update && sudo apt install nginx-plus
解释:
- NGINX Plus需商业授权,社区版NGINX不支持TCP负载均衡的高级功能。
2. 配置MySQL Galera Cluster确保集群已正常运行:
- 所有节点状态为
Synced
。 - 每个节点监听
3306
端口且可跨节点访问(防火墙开放)。
三、NGINX Plus配置(TCP负载均衡)
关键配置文件:/etc/nginx/nginx.conf
stream { # 使用Stream模块处理TCP协议
upstream mysql_galera {
# 配置Galera节点列表
server galera_node1:3306; # 节点1地址
server galera_node2:3306; # 节点2地址
server galera_node3:3306; # 节点3地址
# 负载均衡策略:轮询(默认)或ip_hash(会话保持)
# least_conn; # 选择连接数最少的节点
# ip_hash; # 根据客户端IP分配节点
}
server {
listen 3306; # 监听MySQL默认端口
proxy_pass mysql_galera; # 代理到上游集群
# 健康检查(可选)
# health_check; # 启用内置健康检查
}
}
四、配置关键点解析
1. 协议匹配
- 必须使用
stream
块:因MySQL使用TCP协议,而非HTTP。 - 若误用
http
块,NGINX会返回400 Bad Request
。
2. 负载均衡策略
- 轮询(默认):请求按顺序分配。
- ip_hash:同一客户端IP始终访问同一节点,适合会话一致性。
- least_conn:优先分配连接数最少的节点,适合动态负载场景。
3. 健康检查
# 在upstream块中添加健康检查配置
health_check interval=5s rise=2 fall=3;
interval
:检测间隔(默认5秒)。rise/fall
:连续成功/失败次数判定节点状态。
五、验证与测试
1. 重启NGINX Plus
sudo systemctl restart nginx
2. 检查配置语法
sudo nginx -t
3. 测试连接
# 直接连接NGINX Plus的负载均衡端口
mysql -h lb_ip -P 3306 -u user -p
4. 监控负载均衡状态
# 查看实时连接分布
curl http://localhost:8080/nginx_status?format=json
? 注意:需启用NGINX Plus的
status
模块。
六、进阶配置与注意事项
1. 安全加固
- SSL加密:
server { listen 3307 ssl; # 使用SSL端口 ssl_certificate /path/to/cert.pem; ssl_certificate_key /path/to/key.pem; proxy_pass mysql_galera; }
- 限流与速率限制:
limit_conn_zone $binary_remote_addr zone=addr:10m; server { ... limit_conn addr 100; # 每IP最大100连接 }
2. 读写分离优化
- 结合ProxySQL:NGINX负责流量分发,ProxySQL实现读写分离。
- 主从分离策略:
upstream mysql_read { server node1:3306; server node2:3306; } upstream mysql_write { server node3:3306; # 主节点 }
3. 故障转移测试
- 手动停止某节点服务,观察NGINX是否自动剔除故障节点。
- 使用
health_check
的fails
参数调整故障检测灵敏度。
七、常见问题与解决方案
**Q:连接时提示 Can't connect to MySQL server on 'lb_ip' (111)
?**A:
- 检查NGINX监听端口是否开放:
sudo netstat -tuln | grep 3306
。 - 确保MySQL节点防火墙允许来自NGINX的流量。
**Q:负载不均如何解决?**A:
- 尝试切换负载策略:
least_conn
比轮询更智能。 - 检查节点性能差异,避免慢节点拖累集群。
**Q:如何监控MySQL节点状态?**A:
- 使用NGINX Plus的实时监控面板:
curl http://lb_ip:8080/api/monitoring/stream/upstreams
标签:
- NGINX
- MySQL