介绍
Nginx负载均衡策略主要有轮询、权重、ip_hash、least_conn、fair、url_hash等。不同负载策略有独特使用场景,在实际运用中,需要根据不同的场景选择性运用。
载均衡用于从“upstream”模块定义的后端服务器列表中选取一台服务器接受用户的请求。一个典型的负载均衡配置如下:
http {upstream myproject {server 127.0.0.1:8000;server 127.0.0.1:8001;server 127.0.0.1:8002 backup;server 127.0.0.1:8003 max_fails=3 fail_timeout=20s;}server {listen 80;server_name www.domain.com;location / {proxy_pass http://myproject;}}}
负载均衡策略
1. 轮询
轮询是默认的负载均衡策略,upstream模块中不指定策略则采用轮询方式。每个请求会按时间顺序逐一分配到不同的后端服务器。配置类似如下:
upstream myproject {server 127.0.0.1:8000;server 127.0.0.1:8001;server 127.0.0.1:8002;server 127.0.0.1:8003;}
其中可以添加如下参数:

注意:
在轮询中,如果服务器down掉了,会自动剔除该服务器。
缺省配置就是轮询策略。
此策略适合服务器配置相当,无状态且短平快的服务使用。
2. 权重
权重方式是在轮询策略的基础上指定轮询的权重,按照权重分发请求。例子如下:
upstream myproject {server 127.0.0.1:8000 weight=2;server 127.0.0.1:8001;server 127.0.0.1:8002;server 127.0.0.1:8003;}
weight参数用于指定轮询几率,weight的默认值为1,;weight的数值与访问比率成正比,比如8000端口对应的server被访问的几率为其他服务器的2倍。
注意:
权重越高分配到需要处理的请求越多。
此策略可以与least_conn和ip_hash结合使用。
此策略比较适合服务器的硬件配置差别比较大的情况。
3. ip_hash
ip_hash指定负载均衡器按照基于客户端IP的分配方式,这个方法确保了相同的客户端的请求一直发送到相同的服务器,以保证session会话。这样每个访客都固定访问一个后端服务器,可以解决session不能跨服务器的问题。
upstream myproject {ip_hash; #保证每个访客固定访问一个后端服务器server 127.0.0.1:8000 weight=2;server 127.0.0.1:8001;server 127.0.0.1:8002;server 127.0.0.1:8003;}
注意:
在nginx版本1.3.1之前,不能在ip_hash中使用权重(weight)。
ip_hash不能与backup同时使用。
此策略适合有状态服务,比如session。
当有服务器需要剔除,必须手动down掉。
如果不同ip请求流量差距很大,可能造成server服务不均衡现象。同一个 IP 地址可能表示来自同一个 NAT 的多个用户(比如公司办公室或学校)。
4. least_conn
把请求转发给连接数较少的后端服务器。轮询算法是把请求平均的转发给各个后端,使它们的负载大致相同;但是,有些请求占用的时间很长,会导致其所在的后端负载较高。这种情况下,least_conn这种方式就可以达到更好的负载均衡效果。
upstream myproject {least_conn; #把请求转发给连接数较少的后端服务器server 127.0.0.1:8000 weight=2;server 127.0.0.1:8001;server 127.0.0.1:8002;server 127.0.0.1:8003;}
注意:
此负载均衡策略适合请求处理时间长短不一造成服务器过载的情况。
5. fair
fair是第三方策略,需要安装第三方插件。fair策略是按照服务器端的响应时间来分配请求,响应时间短的优先分配。
upstream myproject {server 127.0.0.1:8000;server 127.0.0.1:8001;server 127.0.0.1:8002;server 127.0.0.1:8003;fair; #实现响应时间短的优先分配}
这种策略具有很强的自适应性,但是实际的网络环境往往不是那么简单,因此须慎用。
6. url_hash
url_hash也是第三方策略。按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,要配合缓存命中来使用。同一个资源多次请求,可能会到达不同的服务器上,导致不必要的多次下载,缓存命中率不高,以及一些资源时间的浪费。而使用url_hash,可以使得同一个url(也就是同一个资源请求)会到达同一台服务器,一旦缓存住了资源,再次收到请求,就可以从缓存中读取。
upstream myproject {hash $request_uri; #实现每个url定向到同一个后端服务器server 127.0.0.1:8000;server 127.0.0.1:8001;server 127.0.0.1:8002;server 127.0.0.1:8003;}
常用负载均衡技术
根据OSI模型网络分为七层,从下往上分别是:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。常见负载均衡有数据链路层负载、网络层负载、传输层负载、应用层负载。
根据负载技术负载均衡主要有硬件负载和软件负载。主机和主机的通信是通过IP和端口进行的,所以软件所能实现的负载均衡只能是传输层、会话层、表示层、应用层,而硬件可以应用于数据链路层、网络层的负载均衡。相同功能的情况下,硬件的负载均衡是一台独立的机器,性能更加强大,但价格高贵。软件负载均衡性能差一些,但胜在扩展性强,价格低廉。
硬件负载产品有F5,思科等。
软件负载有LVS,NGINX,HAPROXY等。
数据链路层负载
虚拟MAC地址方式:提供虚拟MAC地址接收数据,再转发到真正的MAC主机上。方法主要有链路聚合方法和PPP捆绑。
以太网链路聚合简称链路聚合,它通过将多条以太网物理链路捆绑在一起成为一条逻辑链路,从而实现增加链路带宽的目的。同时,这些捆绑在一起的链路通过相互间的动态备份,可以有效地提高链路的可靠性。
PPP捆绑是将多个物理链路合并或者捆绑成一个大逻辑链路的机制。主要起到增加带宽,减少延时,线路备份的作用,另外一个作用是可以将不同类型的接口捆绑为一个逻辑接口。
网络层负载
虚拟IP地址方式:虚拟IP接收数据,然后转发到真正的IP主机上。一般是通过F5硬件来提供这种负载。
传输层负载
IP+PORT负载,提供虚拟的IP和端口接收数据后转发到真正服务器上。主要通过报文中的目标地址和端口,再加上负载均衡设备设置的服务器选择方式,决定最终选择的内部服务器。主要用于基于C/S开发的ERP等系统。
以常见的TCP为例,负载均衡设备在接收到第一个来自客户端的SYN 请求时,然后选择一个最佳的服务器,并对报文中目标IP地址进行修改(改为后端服务器IP),直接转发给该服务器。TCP的连接建立,即三次握手是客户端和服务器直接建立的,负载均衡设备只是起到一个类似路由器的转发动作。在某些部署情况下,为保证服务器回包可以正确返回给负载均衡设备,在转发报文的同时可能还会对报文原来的源地址进行修改。
传输层负载常用技术:
F5/Netscaler:硬件负载均衡器,功能很好,但是成本很高;
lvs:重量级的四层负载软;
nginx:轻量级的四层负载软件,带缓存功能,正则表达式较灵活;
haproxy:模拟四层转发,较灵活。
应用层负载
根据虚拟URL或主机名接收数据后转发到真正的地址。主要通过报文中的真正有意义的应用层内容,再加上负载均衡设备设置的服务器选择方式,决定最终选择的内部服务器。应用范围主要是众多的网站或者内部信息平台等基于B/S开发的系统。
以常见的TCP为例,负载均衡设备如果要根据真正的应用层内容再选择服务器,只能先代理最终的服务器和客户端建立连接(三次握手)后,才可能接受到客户端发送的真正应用层内容的报文,然后再根据该报文中的特定字段,再加上负载均衡设备设置的服务器选择方式,决定最终选择的内部服务器。负载均衡设备在这种情况下,更类似于一个代理服务器。负载均衡和前端的客户端以及后端的服务器会分别建立TCP连接。所以从这个技术原理上来看,七层负载均衡明显的对负载均衡设备的要求更高,处理七层的能力也必然会低于四层模式的部署方式。
实现七层负载均衡的软件有:
haproxy:天生负载均衡技能,全面支持七层代理,会话保持,标记,路径转移;
nginx:只在http协议和mail协议上功能比较好,性能与haproxy差不多;
apache:使用相对复杂;
Mysql proxy:功能尚可。
应用层负载可以提供比较全面的功能,如均衡服务器压力,分摊宕机风险,检查访问错误,检测报文内容,过滤攻击等等。但是也会以下影响:
原本 客户端-服务端 连接变成了 客户端-负载均衡 + 负载均衡-服务端的两段连接模式,添加了网络压力。
应用层负载均衡对报文的拦截也降低了性能,如果访问量大,将会对节点产生压力。如果产生网络攻击,负载均衡节点将代替服务器接收外部攻击,同样有可能导致宕机而使得服务不能用。
传输层和应用层负载对比:
1.智能性
七层负载均衡由于具备OIS七层的所有功能,所以在处理用户需求上能更加灵活,从理论上讲,七层模型能对用户的所有跟服务端的请求进行修改。例如对文件header添加信息,根据不同的文件类型进行分类转发。四层模型仅支持基于网络层的需求转发,不能修改用户请求的内容。
2.安全性
七层负载均衡由于具有OSI模型的全部功能,能更容易抵御来自网络的攻击;四层模型从原理上讲,会直接将用户的请求转发给后端节点,无法直接抵御网络攻击。
3.复杂度
四层模型一般比较简单的架构,容易管理,容易定位问题;七层模型架构比较复杂,通常也需要考虑结合四层模型的混用情况,出现问题定位比较复杂。
4.效率比
四层模型基于更底层的设置,通常效率更高,但应用范围有限;七层模型需要更多的资源损耗,在理论上讲比四层模型有更强的功能,现在的实现更多是基于http应用。
DNS负载均衡
DNS地域是基于地理的负载均衡,DNS负载均衡的本质是DNS解析同一个域名可以访问不同的IP地址。
优点:
1. 简单、成本低:负载均衡工作交给DNS服务器处理,无须自己开发或者维护负载均衡设备;
2. 就近访问,提升访问速度:DNS解析时可以根据请求来源IP解析成距离用户最近的服务器地址,可以加快访问速度,改善性能。
缺点:
1. 更新不及时:DNS缓存带时间比较长,修改DNS配置后,由于缓存的原因,还有有很多用户会继续访问修改前的IP,这样带访问会失败, 达不到负载均衡带目的,并且也会影响用户正常的使用。
2. 扩展性差:DNS负载均衡的控制权在域名商那里,无法根据业务特点针对其做更多的定制化功能和扩展特性。
3. 分配策略比较简单:DNS负载均衡支持带算法少, 不能区分服务器的差异(无法根据系统与服务状态来判断负载),也无法感知后端服务器带状态。
参考:
https://www.cnblogs.com/1214804270hacker/p/9325150.html
https://www.cnblogs.com/zyd112/p/8805332.html




