负载均衡是高可用网络基础架构的关键组件,通常用于将工作负载分布到多个服务器来提高网站、应用、数据库或其他服务的性能和可靠性。
在本地使用虚拟机环境搭建集群做测试是最省钱的做法,如果手上没有多余的云服务器,建议使用虚拟机搭建集群。
一、准备工作
我使用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这个域名解析到网站上。
如下图示例
在负载均衡主服务器的网站配置文件中加入一条转发规则
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负载均衡算法
1、轮询(默认)
轮询即Round Robin,根据Nginx配置文件中的顺序,依次把客户端的Web请求分发到不同的后端服务器
http{ upstream sampleapp { server ...; server ...; } .... server{ listen 80; ... location / { proxy_pass http://sampleapp; } }
2、least_conn(最少连接)
Web请求会被转发到连接数最少的服务器上
http{ upstream sampleapp { least_conn; server ...; server ...; } .... server{ listen 80; ... location / { proxy_pass http://sampleapp; } }
3、ip_hash(IP地址哈希)
前述的两种负载均衡方案中,同一客户端连续的Web请求可能会被分发到不同的后端服务器进行处理,因此如果涉及到会话Session,那么会话会比较复杂。常见的是基于数据库的会话持久化。要克服上面的难题,可以使用基于IP地址哈希的负载均衡方案。这样的话,同一客户端连续的Web请求都会被分发到同一服务器进行处理。
http{ upstream sampleapp { ip_hash; server ...; server ...; } .... server{ listen 80; ... location / { proxy_pass http://sampleapp; } }
4、基于权重的负载均衡算法
基于权重的负载均衡即Weighted Load Balancing,这种方式下,我们可以配置Nginx把请求更多地分发到高配置的后端服务器上,把相对较少的请求分发到低配服务器。
http{ upstream sampleapp { server ... weight=1; server ... weight=1; } .... server{ listen 80; ... location / { proxy_pass http://sampleapp; } }
注意事项
- 权重和backup的写法是支持混合使用的,如
# 在http模块下,server模块平级处添加 upstream fzjh { least_conn; server 192.168.150.20:80 weight=1; server 192.168.150.30:80 weight=1; server 192.168.150.40:80 backup; }
- backup即为备机,当所有业务服务器都宕机时,请求会自动转发至备机。
- 多台业务服务器的代码同步可以使用rsync解决