一、关于负载均衡
在服务器集群中,Nginx起到一个代理服务器的角色(即反向代理),为了避免单独一个服务器压力过大,将来自用户的请求转发给不同的服务器。
Nginx不仅是一个出色的web软件,其七层代理和负载均衡也是相当出色。Nginx做前端代理,当用户请求服务时,可以根据url进行判断,然后分配到不同的后台webserver上。
实现原理:
首先在http模块中配置使用upstream模块定义后台的real server池,名为proxy-web,在池子中我们可以添加多台real server,其中状态检查、调度算法都是在池子中配置;然后在serverr模块中定义虚拟主机,但是这个虚拟主机不指定自己的web目录站点,它将使用location匹配url然后转发到上面定义好的web池子中,最后根据调度策略再转发到后台real server上
二、Nginx负载均衡策略
负载均衡用于从“upstream”模块定义的后端服务器列表中选取一台服务器接受用户的请求。一个最基本的upstream模块是这样的,模块内的server是服务器列表:
http { upstream static { server 192.168.1.1:80 weight=1 max_conns=1000 max_fails=3 fail_timeout=3; server 127.0.0.1:80 backup; } }
192.168.1.1:80:指定后端真实服务器可以是域名或ip,默认是80端口
weight:指定每个后端主机的调度的权重,默认为1
扫描二维码关注公众号,回复: 6272496 查看本文章max_conns:指定后端主机最大并发连接数
max_fails:指定后端主机健康检查多少次失败后才将主机标记为不可用(默认1次,0为不做健康检测)
fail_timeout:指定后端主机健康检测超时多少时间为一次失败(默认10秒)
backup:指定sorry_server,当所有后端主机健康检测失败时,会显示此服务器的页面
down:将当前主机标记为不可用(维护时使用)
在upstream模块配置完成后,要让指定的访问反向代理到服务器列表:
server { listen 80; server_name www.aa1.com www.test.com; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; location ~* \.(png|jpg|jpeg|html|htm|js|css|xml|gif)$ { proxy_pass http://static; } }
这就是最基本的负载均衡实例,但这不足以满足实际需求;目前Nginx服务器的upstream模块支持6种调度算法:
轮循 |
默认方式 |
Weight |
按权重比例调度 |
Ip_hash |
根据源ip调度 |
Lease_conn |
最少连接方式 |
Fair(第三方) |
响应时间方式 |
Url_hash(第三方) |
根据url分配方式 |
(1)rr轮询(默认)
按照请求顺序分配到每个RS,和lvs中的rr算法一样,如果RS宕机,会自动剔除,默认情况下只检测80端口,如果RS报402、403、503、504错误,会直接返回给客户端。
(2)weight(权重)
在rr的基础上再加上权重(默认是rr+weight),权重轮询和访问成正比,值越大分配的越多,可以根据服务器的配置设置权重,可以解决服务器性能不均进行请求分配的问题
(3)ip_hash
解决动态网页session共享问题
每个访问请求按照IP地址的hash值进行分配,ip的hash值只要相同就会被分配到同一台服务器上(lvs负载均衡的-p参数,keepalived配置里的persistence_timeout 50),该调度算法可以解决动态网页session共享问题,但有时会导致请求分配不均
提示:由于国内用的都是nat模式,所以hash不适合使用
ip_hash不能和其他的算法一块使用,即不能使weight或backup
hash的原理:将源地址进行hash计算,并和后端服务器的权重总数相除后转发到某服务器,使同一个客户端访问的请求始终派发到特定服务器,有一个缺点;当后端服务器发生宕机或新添加时权重总数发生变化,客户端下次可能被派发至新的服务器
consistent(一致性哈希):一致性hash的采用的是除数特别大,假设有一个hash环。是个闭环。把32位二进制的整数转换为十进制后均匀分布在整个环上。hash结果是除以2的32次方-1(hash是除以). 那么结果一定是落在环上的。那么,这个点靠近谁,就缓存在谁那里。假设a节点坏了。那么下一次的计算结果就是旁边的邻居。但是邻居的缓存不会受到影响。只是坏掉的A节点会从新去缓存。
(4)fair(第三方)
按照后端服务器的响应时间来配置,响应时间短的优先分配,比上面的都更智能,此种算法可以按照页面大小和加载时间长短智能的进行负载均衡,nginx本身不支持fair,需要下载nginx的upstrea_fair模块
(5)url_hash(第三方)
主要应用于缓存服务器上
按照访问的url来分配请求,让相同的url定向到同一个服务器,后端服务器为缓存服务器的时候效果更显著,在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法。
缺点:如果有一台机器宕机了,那就苦了,consistent_hash可以解决这个问题
可以提高后端缓存服务器的效率,nginx本身不支持url_hash的,需要下载hash软件
(6)least_conn
最少连接数,哪个连接少就分配到哪台设备