基本结构
负载均衡服务器由多台机器组成,以一台为例,其他机器使用相同部署信息。
主要作用
- 根据负载均衡策略和算法,将客户端请求转发到不同应用服务器上,减轻单个服务器压力,提高系统并发量。
- 通过心跳检测的方式,判断应用服务器是否可用,自动将请求转发到可用的应用服务器上。
- 故障应用服务器恢复工作后,自动添加到可用应用服务器中。
搭建两台web服务器
192.168.192.10:8080
192.168.192.11:8080
为验证负载均衡的效果,可以把web服务器的主页写入不同内容,也可以通过查看日志验证。
配置负载均衡服务器
upstream balance { # balance是自定义名称,与proxy_pass 保持一致
server 192.168.192.10:8080; # 转发请求的目的主机,分发策略也在此处配置
server 192.168.192.11:8080;
}
server {
listen 80; # 访问负载均衡服务器的配置信息
server_name bl.com; # 用户访问的域名
location / { # 根据proxy_pass读取转发信息
proxy_pass http://balance;
#root html;
#index index.html index.htm;
}
}
浏览器访问
http://bl.com
# 两台机器的内容会交换显示,查看日志分别有来自于负载均衡服务器的请求信息
负载均衡分发策略
轮询 (默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉,能自动剔除。
upstream myserver {
server 192.168.17.129:8080 fail_timeout=20s max_fails=3;
server 192.168.17.129:8081 backup; # backup标记该服务器为备用服务器
server 192.168.17.129:8082 down; # 永久停机
}
参数说明:
fail_timeout和max_fails结合使用,在20s内在该服务器请求失败了3次,认为该机器停机。
fail_timeout 默认10s。
backup:备用机,当主服务器停止时,请求会被发送到该服务器。
down:服务器永久停机。
适用场景
此策略适合服务器配置相当,无状态且短平快的服务使用。
权重
weight 代表权重默认为 1,权重越高被分配的客户端越多
upstream myserver {
server 192.168.17.129:8080 weight 3; # 8080与8081按照3:1的比例分配访问频次
server 192.168.17.129:8081;
}
可以与轮询、least_conn和ip_hash结合使用。
适用场景
此策略比较适合服务器的硬件配置差别比较大的情况。
ip哈希
每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访问一个后端服务器
upstream myserver {
ip_hash; #保证每个访客固定访问一个后端服务器
server 192.168.17.129:8080 weight 3;
server 192.168.17.129:8081;
}
在nginx版本1.3.1之前,不能在ip_hash中使用权重(weight)。
ip_hash不能与backup同时使用。
此策略适合有状态服务,比如session。
当有服务器需要剔除,必须手动down掉。
适用场景
相同的客户端的请求一直发送到相同的服务器,以保证session会话。
least_conn
把请求转发给连接数较少的后端服务器。轮询算法是把请求平均的转发给各个后端,使它们的负载大致相同;但是,有些请求占用的时间很长,会导致其所在的后端负载较高。这种情况下,least_conn这种方式就可以达到更好的负载均衡效果。
upstream myserver {
least_conn; #把请求转发给连接数较少的后端服务器
server 192.168.17.129:8080 weight 3;
server 192.168.17.129:8081;
}
适用场景
此负载均衡策略适合请求处理时间长短不一造成服务器过载的情况。
第三方策略
需要安装第三方插件
fair
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream myserver {
fair; #实现响应时间短的优先分配
server 192.168.17.129:8080 weight 3;
server 192.168.17.129:8081;
}
url_hash
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,要配合缓存命中来使用。同一个资源多次请求,可能会到达不同的服务器上,导致不必要的多次下载,缓存命中率不高,以及一些资源时间的浪费。而使用url_hash,可以使得同一个url(也就是同一个资源请求)会到达同一台服务器,一旦缓存住了资源,再此收到请求,就可以从缓存中读取。
upstream myserver {
hash $request_uri; #实现每个url定向到同一个后端服务器
server 192.168.17.129:8080 weight 3;
server 192.168.17.129:8081;
}