暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Nginx负载均衡策略

架构师成长 2020-05-26
658

介绍

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


文章转载自架构师成长,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论