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

总结

  1. Nginx 适合基础TCP层负载均衡,复杂SQL路由需用ProxySQL
  2. 读写分离建议通过不同端口实现,应用层控制路由逻辑
  3. 生产环境必须配置健康检查(Nginx Plus或第三方模块)
  4. 高可用架构需要配合主从切换工具(如Orchestrator)

最终建议:对于专业MySQL集群管理,推荐结合使用:

  • Nginx(TCP层负载均衡)
  • ProxySQL(SQL路由)
  • Orchestrator(主从故障转移)
作者:admin  创建时间:2025-06-06 11:11
最后编辑:admin  更新时间:2025-06-07 09:49