插件窝 干货文章 怎么使用nginx充当mysql的负载均衡器

怎么使用nginx充当mysql的负载均衡器

MySQL server Nginx 3306 200    来源:    2025-04-23

使用Nginx作为MySQL负载均衡器

Nginx通常用作HTTP负载均衡器,但通过TCP/UDP负载均衡功能(ngx_stream_core_module),也可以实现对MySQL的负载均衡。以下是配置步骤:

1. 确认Nginx版本和模块

确保你的Nginx版本支持stream模块(1.9.0及以上版本),并已编译包含--with-stream参数。

nginx -V 2>&1 | grep -o with-stream

2. 基础配置示例

在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;
    }
}

3. 高级配置选项

负载均衡算法选择

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;
}

SSL/TLS配置(如果MySQL使用SSL)

server {
    listen 3306;
    proxy_pass mysql_backend;
    proxy_ssl on;
    proxy_ssl_verify off;  # 可选:关闭证书验证
}

4. 注意事项

  1. 连接保持:MySQL是有状态服务,简单的轮询可能导致问题。考虑:

    • 使用IP哈希保持会话一致性
    • 确保应用能处理连接切换
  2. IP哈希配置示例

upstream mysql_backend {
    hash $remote_addr consistent;
    server mysql1.example.com:3306;
    server mysql2.example.com:3306;
}
  1. 性能考虑:Nginx的TCP负载均衡不如专门的数据库中间件(如ProxySQL)功能丰富

  2. 监控:确保监控后端MySQL实例的健康状态

5. 完整示例

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特定功能,如: - 读写分离 - 查询缓存 - 更精细的健康检查 - 连接池管理