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

如果手上没有足够数量的公网云服务器,本地使用虚拟机环境搭建集群做负载均衡测试是最省钱的做法,也方便做快照恢复。

一、准备工作

我使用 VMware 在本地部署了 3 台 CentOS 服务器作为测试环境,统一安装宝塔编译环境(LNMP)。虚拟机的网络配置不是本文的重点,就不再赘述了。

二、检查环境

这 3 台 CentOS 服务器编译好环境之后分别添加一个网站,检查 web 服务是否正常,并修改其中 2 台的默认模板文件,方便在测试负载均衡效果时区分是哪台服务器提供的 web 服务。

本次测试的三台服务器 IP 地址分别为

192.168.150.10(负载均衡 主服务器) 192.168.150.20(业务服务器) 192.168.150.30(业务服务器)

三、部署网站

测试域名为 t10.com,因此需要在宿主机上将此域名解析到负载均衡主服务器(192.168.150.10)。

修改宿主机的 hosts 文件(路径:C:\Windows\System32\drivers\etc\hosts),添加以下内容。

192.168.150.10 t10.com

分别在三台服务器上添加网站后,将 t10.com 这个域名解析到网站上。

如下图示例

/post_images/cf37a55ead5bc.png

在负载均衡主服务器的 server 语法块下,也就是网关的配置文件中加入一条转发规则

location / { 
    # 转发至负载均衡服务器
    proxy_pass http://fzjh;
    proxy_connect_timeout 2s;
    proxy_set_header Host $host; 
    proxy_set_header X-Real-IP $remote_addr; 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

在负载均衡主服务器的 nginx 配置文件的 http 语法块下(与 server 同级别)加入规则

upstream fzjh {
    # least_conn;
    # ip_hash;
    server 192.168.150.20:80 weight=1;
    server 192.168.150.30:80 weight=1;
    # server 192.168.150.30:80 backup;
}

保存配置文件后重启 nginx,此时访问 t10.com 时会自动分发至两台业务服务器(192.168.150.20、192.168.150.30)。

四、常用的 nginx 负载均衡算法

4.1、轮询(默认)

轮询即 Round Robin,根据 Nginx 配置文件中的顺序,依次把客户端的 Web 请求分发到不同的后端服务器。

http{ 
 upstream sampleapp {
   server ...; 
   server ...; 
 } 
 .... 
 server{ 
   listen 80; 
   ... 
   location / { 
    proxy_pass http://sampleapp; 
   }  
 } 

4.2、least_conn(最少连接)

Web 请求会被转发到连接数最少的服务器上。

http{ 
 upstream sampleapp { 
   least_conn;
   server ...; 
   server ...; 
 } 
 .... 
 server{ 
   listen 80; 
   ... 
   location / { 
    proxy_pass http://sampleapp; 
   }  
 } 

4.3、ip_hash(IP 地址哈希)

前述的两种负载均衡方案中,同一客户端连续的 Web 请求可能会被分发到不同的后端服务器进行处理,因此如果涉及到会话 Session,那么会话会比较复杂。常见的是基于数据库的会话持久化。要克服上面的难题,可以使用基于 IP 地址哈希的负载均衡方案。这样的话,同一客户端连续的 Web 请求都会被分发到同一服务器进行处理。

http{ 
 upstream sampleapp { 
   ip_hash;
   server ...; 
   server ...; 
 } 
 .... 
 server{ 
   listen 80; 
   ... 
   location / { 
    proxy_pass http://sampleapp; 
   }  
 } 

4.4、基于权重的负载均衡算法

基于权重的负载均衡即 Weighted Load Balancing,这种方式下,我们可以配置 Nginx 把请求更多地分发到高配置的后端服务器上,把相对较少的请求分发到低配服务器。

http{ 
 upstream sampleapp {
   server ... weight=1; 
   server ... weight=1; 
 } 
 .... 
 server{ 
   listen 80; 
   ... 
   location / { 
    proxy_pass http://sampleapp; 
   }  
 }
  • backup 即为备机,当所有业务服务器都宕机时,请求会自动转发至备机;

  • 多台业务服务器的代码同步可以使用 rsync 解决。