1 负载均衡简介
负载均衡提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。
负载均衡有两方面的含义:
首先,大量的并发访问或数据流量分担到多台节点设备上分别处理,减少用户等待响应的时间;
其次,单个重负载的运算分担到多台节点设备上做并行处理,每个节点设备处理结束后,将结果汇总,返回给用户,系统处理能力得到大幅度提高。
2 负载均衡分类
(1) 二层负载均衡(mac):根据OSI模型分的二层负载,一般是用虚拟mac地址方式,外部对虚拟MAC地址请求,负载均衡接收后分配后端实际的MAC地址响应);
(2) 三层负载均衡(ip):一般采用虚拟IP地址方式,外部对虚拟的ip地址请求,负载均衡接收后分配后端实际的IP地址响应);
(3) 四层负载均衡(tcp):在三次负载均衡的基础上,用ip+port接收请求,再转发到对应的机器;
(4) 七层负载均衡(http):根据虚拟的url或IP,主机名接收请求,再转向相应的处理服务器。
常见的负载均衡是四层负载均衡和七层负载均衡。
3 Nginx负载均衡
(1) 轮询(默认):每个请求按时间顺序逐一分配到不同的后端服务,如果后端某台服务器死机,自动剔除故障系统,使用户访问不受影响。
(2) weight(轮询权值):weight的值越大分配到的访问概率越高,主要用于后端每台服务器性能不均衡的情况下。或者仅仅为在主从的情况下设置不同的权值,达到合理有效的地利用主机资源。
# 如下,如果有三个请求,2个落在8081上,1个落在8082上
upstream bakend {
server 127.0.0.1:8081 weight=2 max_fails=2 fail_timeout=2;
server 127.0.0.1:8082 weight=1 max_fails=2 fail_timeout=2;
server 127.0.0.1:8083 backup; #调用backup服务器,可以是本机或其他服务器。
}
(3) ip_hash:每个请求按访问IP的哈希结果分配,使来自同一个IP的访客固定访问一台后端服务器,并且可以有效解决动态网页存在的session共享问题。
upstream slbserver {
#根据Ip来分配,有存储cookie登录等场景适用
ip_hash;
server 127.0.0.1:8081 weight=2 max_fails=2 fail_timeout=2;
server 127.0.0.1:8082 weight=1 max_fails=2 fail_timeout=2;
server 127.0.0.1:8083 backup; #调用backup服务器,可以是本机或其他服务器。
}
(4) fair:比 weight、ip_hash更加智能的负载均衡算法,fair算法可以根据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间 来分配请求,响应时间短的优先分配。Nginx本身不支持fair,如果需要这种调度算法,则必须安装upstream_fair模块。
upstream backend {
server 127.0.0.1:8081;
server 127.0.0.1:8082;
fair;
}
(5) url_hash:按访问的URL的哈希结果来分配请求,使每个URL定向到一台后端服务器,可以进一步提高后端缓存服务器的效率。Nginx本身不支持url_hash,如果需要这种调度算法,则必须安装Nginx的hash软件包。
upstream backend {
server 127.0.0.1:8081;
server 127.0.0.1:8082;
hash $request_uri;
hash_method crc32;
}
4 负载均衡调度状态
在Nginx upstream模块中,可以设定每台后端服务器在负载均衡调度中的状态,常用的状态有:
(1) down:表示当前的server暂时不参与负载均衡;
(2) backup:预留的备份机器。当其他所有的非backup机器出现故障或者忙的时候,才会请求backup机器,因此这台机器的访问压力最低;
(3) max_fails:允许请求失败的次数,默认为1,当超过最大次数时,返回proxy_next_upstream模块定义的错误;
(4) fail_timeout:请求失败超时时间,在经历了max_fails次失败后,暂停服务的时间。max_fails和fail_timeout可以一起使用。