前言:nginx负载均衡往往配合高可用一起使用,解决代理服务器故障导致整个负载均衡全挂掉!
一:为什么要使用负载均衡?
随着业务的不断发展壮大,网站访问量和数据量也随之急剧增长,单机负载达到性能瓶颈,网站访问速度下降,为了提升网站访问速度,就需要对服务器进行水平扩充,负载均衡策略的出现和发展成为缓解上述问题的有效途径。
负载均衡的核心是将之前一台设备处理不完的请求,分摊到多台设备从而增加吞吐量、加强网络数据处理能力、提高网络的灵活性!
负载均衡结构如下:
二:负载均衡的几种算法策略
1:轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
upstream backserver {
server 192.168.8.201;
server 192.168.8.202;
}
特点:由于该算法中每个请求按时间顺序逐一分配到不同的服务器处理,因此适用于服务器性能相近的集群情况,其中每个服务器承载相同的负载。
但对于服务器性能不同的集群而言,该算法容易引发资源分配不合理等问题。
2:weight 加权轮询
在默认轮询的基础上为每台服务器设置权重,解决服务器性能不同引发资源分配不合理的问题!
weight值越大分配到的任务也就越多
upstream backserver {
server 192.168.8.201 weight=3;
server 192.168.8.202 weight=7;
}
3:IP 哈希(IP hash)
默认轮询和加权轮询虽然可以解决任务分发的问题,但是如果网站需要用户登录才能访问,而http又是无状态的,为了解决用户cookie的问题可以使用ip哈希的方式。
依据发出请求的客户端 IP 的 hash 值来分配服务器,该算法可以保证同 IP 发出的请求映射到同一服务器,解决cookie问题。
upstream backserver {
ip_hash;
server 192.168.8.201;
server 192.168.8.202;
}
4:fair
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream backserver {
server 192.168.8.201;
server 192.168.8.202;
fair;
}
总结:在实际开发中这几种方式往往是结合在一起使用的
三:负载均衡的具体配置
1:在nginx.conf里添加负载服务器
http {
....
upstream myServer {
ip_hash;
server 192.168.8.200:8080 weight=1 max_fails=1 fail_timeout=10;
server 192.168.8.201:8080 weight=1 max_fails=1 fail_timeout=10;
server 192.168.8.202:8080 weight=1 max_fails=1 fail_timeout=10;
}
log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"' '$connection $upstream_addr ' 'upstream_response_time $upstream_response_time request_time $request_time ';
access_log /var/log/nginx/access.log main;
....
}
2:在单个server块添加反向代理
server {
#access_log /var/log/nginx/test/access.log;
....
location / { # 请求全部跳转
proxy_pass http://myServer;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
....
}
3:重启nginx
负载均衡常遇到的问题:
如果其中一台server挂了会不会影响系统请求?
解释:nginx默认配置max_fails和fail_timeout参数,当某台upstream server挂了,表示在10s(fail_timeout)之内,有1(max_fails)个请求打到这台挂了的服务器,nginx就会把这台upstream server设为down机的状态,时长是10s,在这10s内如果又有请求进来,就不会被转到这台server上,过了10s重新认为这台server又恢复了