使用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:

  1. 检查NGINX监听端口是否开放:sudo netstat -tuln | grep 3306
  2. 确保MySQL节点防火墙允许来自NGINX的流量。

**Q:负载不均如何解决?**A:

  • 尝试切换负载策略:least_conn比轮询更智能。
  • 检查节点性能差异,避免慢节点拖累集群。

**Q:如何监控MySQL节点状态?**A:

  • 使用NGINX Plus的实时监控面板
    curl http://lb_ip:8080/api/monitoring/stream/upstreams
    

标签:
  • NGINX
  • MySQL
© 蓝易云.