Skip to content

负载均衡实战案例

本节提供多个负载均衡的实际应用案例。

案例1:Web服务器负载均衡

架构说明

Nginx
├── 192.168.1.10:8080 (Web服务器1)
├── 192.168.1.11:8080 (Web服务器2)
└── 192.168.1.12:8080 (Web服务器3)

配置文件

nginx
upstream web_servers {
    least_conn;

    server 192.168.1.10:8080 weight=3 max_fails=3 fail_timeout=30s;
    server 192.168.1.11:8080 weight=2 max_fails=3 fail_timeout=30s;
    server 192.168.1.12:8080 weight=1 max_fails=3 fail_timeout=30s;

    keepalive 32;
}

server {
    listen 80;
    server_name www.example.com;

    access_log /var/log/nginx/web.access.log;
    error_log /var/log/nginx/web.error.log;

    location / {
        proxy_pass http://web_servers;

        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        proxy_connect_timeout 60s;
        proxy_send_timeout 60s;
        proxy_read_timeout 60s;

        proxy_http_version 1.1;
        proxy_set_header Connection "";
    }
}

案例2:API服务器负载均衡

架构说明

Nginx
├── 192.168.1.20:8080 (API服务器1)
├── 192.168.1.21:8080 (API服务器2)
└── 192.168.1.22:8080 (API服务器3)

配置文件

nginx
upstream api_servers {
    least_conn;

    server 192.168.1.20:8080 max_fails=3 fail_timeout=30s;
    server 192.168.1.21:8080 max_fails=3 fail_timeout=30s;
    server 192.168.1.22:8080 max_fails=3 fail_timeout=30s;

    keepalive 32;
}

server {
    listen 80;
    server_name api.example.com;

    access_log /var/log/nginx/api.access.log;
    error_log /var/log/nginx/api.error.log;

    # CORS配置
    add_header 'Access-Control-Allow-Origin' 'https://www.example.com' always;
    add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS' always;
    add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization' always;

    # OPTIONS请求
    if ($request_method = 'OPTIONS') {
        add_header 'Access-Control-Allow-Origin' 'https://www.example.com';
        add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS';
        add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization';
        add_header 'Access-Control-Max-Age' 1728000;
        add_header 'Content-Type' 'text/plain; charset=utf-8';
        add_header 'Content-Length' 0;
        return 204;
    }

    location / {
        proxy_pass http://api_servers;

        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        proxy_connect_timeout 30s;
        proxy_send_timeout 30s;
        proxy_read_timeout 30s;

        proxy_http_version 1.1;
        proxy_set_header Connection "";
    }
}

案例3:数据库负载均衡

架构说明

Nginx
├── 192.168.1.30:3306 (MySQL主库)
├── 192.168.1.31:3306 (MySQL从库1)
└── 192.168.1.32:3306 (MySQL从库2)

配置文件

nginx
stream {
    upstream mysql_read {
        least_conn;

        server 192.168.1.31:3306 weight=2;
        server 192.168.1.32:3306 weight=2;
    }

    upstream mysql_write {
        server 192.168.1.30:3306;
    }

    server {
        listen 3306;
        proxy_pass mysql_write;
        proxy_timeout 600s;
        proxy_connect_timeout 5s;
    }

    server {
        listen 3307;
        proxy_pass mysql_read;
        proxy_timeout 600s;
        proxy_connect_timeout 5s;
    }
}

案例4:微服务负载均衡

架构说明

Nginx
├── /auth → 认证服务集群
├── /users → 用户服务集群
├── /orders → 订单服务集群
└── /products → 产品服务集群

配置文件

nginx
upstream auth_service {
    least_conn;

    server 192.168.1.40:8080 max_fails=3 fail_timeout=30s;
    server 192.168.1.41:8080 max_fails=3 fail_timeout=30s;
    server 192.168.1.42:8080 max_fails=3 fail_timeout=30s;

    keepalive 32;
}

upstream user_service {
    least_conn;

    server 192.168.1.50:8080 max_fails=3 fail_timeout=30s;
    server 192.168.1.51:8080 max_fails=3 fail_timeout=30s;
    server 192.168.1.52:8080 max_fails=3 fail_timeout=30s;

    keepalive 32;
}

upstream order_service {
    least_conn;

    server 192.168.1.60:8080 max_fails=3 fail_timeout=30s;
    server 192.168.1.61:8080 max_fails=3 fail_timeout=30s;
    server 192.168.1.62:8080 max_fails=3 fail_timeout=30s;

    keepalive 32;
}

upstream product_service {
    least_conn;

    server 192.168.1.70:8080 max_fails=3 fail_timeout=30s;
    server 192.168.1.71:8080 max_fails=3 fail_timeout=30s;
    server 192.168.1.72:8080 max_fails=3 fail_timeout=30s;

    keepalive 32;
}

server {
    listen 80;
    server_name gateway.example.com;

    access_log /var/log/nginx/gateway.access.log;
    error_log /var/log/nginx/gateway.error.log;

    location /auth/ {
        proxy_pass http://auth_service/;

        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        proxy_http_version 1.1;
        proxy_set_header Connection "";
    }

    location /users/ {
        proxy_pass http://user_service/;

        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        proxy_http_version 1.1;
        proxy_set_header Connection "";
    }

    location /orders/ {
        proxy_pass http://order_service/;

        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        proxy_http_version 1.1;
        proxy_set_header Connection "";
    }

    location /products/ {
        proxy_pass http://product_service/;

        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        proxy_http_version 1.1;
        proxy_set_header Connection "";
    }
}

案例5:跨地域负载均衡

架构说明

Nginx
├── 北京集群
│   ├── 192.168.1.100:8080
│   └── 192.168.1.101:8080
├── 上海集群
│   ├── 192.168.1.200:8080
│   └── 192.168.1.201:8080
└── 广州集群
    ├── 192.168.1.300:8080
    └── 192.168.1.301:8080

配置文件

nginx
upstream beijing_cluster {
    least_conn;

    server 192.168.1.100:8080 max_fails=3 fail_timeout=30s;
    server 192.168.1.101:8080 max_fails=3 fail_timeout=30s;

    keepalive 32;
}

upstream shanghai_cluster {
    least_conn;

    server 192.168.1.200:8080 max_fails=3 fail_timeout=30s;
    server 192.168.1.201:8080 max_fails=3 fail_timeout=30s;

    keepalive 32;
}

upstream guangzhou_cluster {
    least_conn;

    server 192.168.1.300:8080 max_fails=3 fail_timeout=30s;
    server 192.168.1.301:8080 max_fails=3 fail_timeout=30s;

    keepalive 32;
}

geo $region {
    default beijing;
    1.0.0.0/8 beijing;
    2.0.0.0/8 shanghai;
    3.0.0.0/8 guangzhou;
}

map $region $backend {
    beijing beijing_cluster;
    shanghai shanghai_cluster;
    guangzhou guangzhou_cluster;
}

server {
    listen 80;
    server_name www.example.com;

    access_log /var/log/nginx/cross_region.access.log;
    error_log /var/log/nginx/cross_region.error.log;

    location / {
        proxy_pass http://$backend;

        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        proxy_connect_timeout 60s;
        proxy_send_timeout 60s;
        proxy_read_timeout 60s;

        proxy_http_version 1.1;
        proxy_set_header Connection "";
    }
}

总结

负载均衡实战案例的关键点:

  • Web服务器:最少连接,加权分配
  • API服务器:CORS支持,连接复用
  • 数据库:读写分离,Stream模块
  • 微服务:多服务网关,独立upstream
  • 跨地域:Geo路由,就近访问

根据实际业务需求,选择合适的负载均衡架构和配置。