负载均衡

为什么要使用负载均衡

TIP

负载均衡是高可用的网络基础架构的关键组件,通常用于将工作负载分布到多个服务器来提高网站、应用、数据库或其他服务的性能和可靠性。

一个不使用负载均衡的 Web 架构往往是类似下面这样:

单台web服务器

在这种架构下,用户往往是直接连到 Web 服务器,如果当前服务器宕机了,我们的网站/服务就挂了,用户自然便无法访问。

因为是单台服务器处理用户请求,如果访问用户量很大或者激增,超过了该机器的性能处理极限,也会出现加载速度慢或者连接失败。

使用负载均衡

在用户请求进入 Web 服务器之前,引入一个负载均衡器,在负载均衡器后面接入至少两台 Web 服务器便可以解决单台服务器故障时,用户访问不受影响。党产生高并发请求时,还可以给 Web 服务器集群扩容。达之架构图如下:

负载均衡

使用 Nginx 进行一个简单的负载均衡的配置

负载均衡的 Nginx 配置(http 版本)

upstream backend {
    server xxx.xxx.xxx.xxx; # 第一个应用服务器内网ip
    server xxx.xxx.xxx.xxx; # 第二个应用服务器内网ip
}

server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name linganmin.cn; # 替换自己的域名

    location / {
        add_header X-Content-Type-Options nosniff;
        proxy_set_header X-Scheme $scheme;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_set_header X-NginX-Proxy true;
        proxy_hide_header X-Powered-By;
        proxy_hide_header Vary;

        proxy_pass http://backend; # 上面定义的代理的地址
        proxy_redirect off;
    }

}

负载均衡的 Nginx 配置(https 版本)

upstream backend {
    server xxx.xxx.xxx.xxx; # 第一个应用服务器内网ip
    server xxx.xxx.xxx.xxx; # 第二个应用服务器内网ip
}

server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name linganmin.cn; # 替换为自己的域名
    return 301 https://linganmin.cn$request_uri; # 强制301到https
}

server {
    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/linganmin.cn/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/linganmin.cn/privkey.pem; # managed by Certbot
    server_name www.linganmin.cn; # 替换为自己的域名
    return 301 https://linganmin.cn$request_uri; # 301跳转到不带www的域名
}

server {
    listen [::]:443 ssl ipv6only=on; # managed by Certbot
    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/linganmin.cn/fullchain.pem; # 替换为自己用Certbot生成的秘钥
    ssl_certificate_key /etc/letsencrypt/live/linganmin.cn/privkey.pem; # 替换为自己用Certbot生成的秘钥
    include /etc/letsencrypt/options-ssl-nginx.conf; # 替换为自己用Certbot生成的秘钥
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # 替换为自己用Certbot生成的秘钥
    server_name linganmin.cn; # 替换为自己的域名

    location / {
        add_header X-Content-Type-Options nosniff;
        proxy_set_header X-Scheme $scheme;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Real-IP $remote_addr; # 用户真实IP
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_set_header X-NginX-Proxy true;
        proxy_hide_header X-Powered-By;
        proxy_hide_header Vary;

        proxy_pass http://backend;
        proxy_redirect off;
    }
}

思考

WARNING

当用户访问负载均衡器,再由负载均衡器将请求转发给后端服务器。在这种情况下,单点故障现在转移到负载均衡器上了。怎么解决呢,是不是可以通过引入第二个负载均衡器来缓解?

下面是一个浮动 IP 的负载均衡架构示意图