Nginx负载均衡算法

简单学习总结前端


1、负载均衡

一、负载均衡又分为四层负载均衡和七层负载均衡。

四层负载均衡工做在OSI模型的传输层,主要工做是转发,它在接收到客户端的流量之后经过修改数据包的地址信息将流量转发到应用服务器。java

七层负载均衡工做在OSI模型的应用层,由于它须要解析应用层流量,因此七层负载均衡在接到客户端的流量之后,还须要一个完整的TCP/IP协议栈。七层负载均衡会与客户端创建一条完整的链接并将应用层的请求流量解析出来,再按照调度算法选择一个应用服务器,并与应用服务器创建另一条链接将请求发送过去,所以七层负载均衡的主要工做就是代理。node


二、软硬件

1)四层的负载均衡就是基于IP+端口的负载均衡:linux

对应的负载均衡器称为四层交换机(L4 switch),主要分析IP层及TCP/UDP层,实现四层负载均衡。此种负载均衡器不理解应用协议(如HTTP/FTP/MySQL等等)。

实现四层负载均衡的软件有:nginx

  • F5:硬件负载均衡器,功能很好,可是成本很高。
  • lvs:重量级的四层负载软件
  • nginx:轻量级的四层负载软件,带缓存功能,正则表达式较灵活
  • haproxy:模拟四层转发,较灵活

2)七层的负载均衡就是基于虚拟的URL或主机IP的负载均衡正则表达式

对应的负载均衡器称为七层交换机(L7 switch),除了支持四层负载均衡之外,还有分析应用层的信息,如HTTP协议URI或Cookie信息,实现七层负载均衡。此种负载均衡器能理解应用协议。

实现七层负载均衡的软件有:算法

  • haproxy:天生负载均衡技能,全面支持七层代理,会话保持,标记,路径转移;
  • nginx:只在http协议和mail协议上功能比较好,性能与haproxy差很少;
  • apache:功能较差
  • Mysql proxy:功能尚可。

总的来讲,通常是lvs作4层负载;nginx作7层负载;haproxy比较灵活,4层和7层负载均衡都能作。sql

三、具体实现

(1)目前负载均衡系统有Nginx、LVS、F5,即:apache

  • Nginx是软件的7层负载均衡,
  • LVS是内核的4层负载均衡,
  • F5是硬件的4层负载均衡。

(2)软件和硬件的区别在于性能,硬件远远高于软件,即:后端

  • Nginx的性能是万级的,通常的Linux服务器上安装一个Nginx能达到每秒5万并发请求;
  • 而F5的性能能达到百万级,从200万每秒到800万每秒都有,不过价格很贵。

(3)4层和7层的区别在于协议和灵活性,即:

  • Nginx是7层的,它支持HTTP等协议,
  • 而LVS和F5是4层协议,它们和协议无关,几乎全部应用均可以作。


2、四层和七层负载均衡的区别?

技术原理上的区别。

所谓四层负载均衡,也就是主要经过报文中的目标地址和端口,再加上负载均衡设备设置的服务器选择方式,决定最终选择的内部服务器。

以常见的TCP为例,负载均衡设备在接收到第一个来自客户端的SYN 请求时,即经过上述方式选择一个最佳的服务器,并对报文中目标IP地址进行修改(改成后端服务器IP),直接转发给该服务器。TCP的链接创建,即三次握手是客户端和服务器直接创建的,负载均衡设备只是起到一个相似路由器的转发动做。在某些部署状况下,为保证服务器回包能够正确返回给负载均衡设备,在转发报文的同时可能还会对报文原来的源地址进行修改。


所谓七层负载均衡,也称为“内容交换”,也就是主要经过报文中的真正有意义的应用层内容,再加上负载均衡设备设置的服务器选择方式,决定最终选择的内部服务器。

以常见的TCP为例,负载均衡设备若是要根据真正的应用层内容再选择服务器,只能先代理最终的服务器和客户端创建链接(三次握手)后,才可能接受到客户端发送的真正应用层内容的报文,而后再根据该报文中的特定字段,再加上负载均衡设备设置的服务器选择方式,决定最终选择的内部服务器。

负载均衡设备在这种状况下,更相似于一个代理服务器。负载均衡和前端的客户端以及后端的服务器会分别创建TCP链接。因此从这个技术原理上来看,七层负载均衡明显的对负载均衡设备的要求更高,处理七层的能力也必然会低于四层模式的部署方式。

3、常见的几种负载均衡算法

一、轮询法

将请求按顺序轮流地分配到后端服务器上,它均衡地对待后端的每一台服务器,而不关心服务器实际的链接数和当前的系统负载。

二、加权轮询法

不一样的后端服务器可能机器的配置和当前系统的负载并不相同,所以它们的抗压能力也不相同。给配置高、负载低的机器配置更高的权重,让其处理更多的请;而配置低、负载高的机器,给其分配较低的权重,下降其系统负载,加权轮询能很好地处理这一问题,并将请求顺序且按照权重分配到后端。

三、随机法

经过系统的随机算法,根据后端服务器的列表大小值来随机选取其中的一台服务器进行访问。由几率统计理论能够得知,随着客户端调用服务端的次数增多,

其实际效果愈来愈接近于平均分配调用量到后端的每一台服务器,也就是轮询的结果。

四、加权随机法

与加权轮询法同样,加权随机法也根据后端机器的配置,系统的负载分配不一样的权重。不一样的是,它是按照权重随机请求后端服务器,而非顺序。

五、哈希算法

  • 普通哈希:源地址哈希的思想是根据获取客户端的IP地址,经过哈希函数计算获得的一个数值,用该数值对服务器列表的大小进行取模运算,获得的结果即是客服端要访问服务器的序号。采用源地址哈希法进行负载均衡,同一IP地址的客户端,当后端服务器列表不变时,它每次都会映射到同一台后端服务器进行访问。
  • 一致性Hash,相同参数的请求老是发到同一提供者。当某一台提供者挂时,本来发往该提供者的请求,基于虚拟节点,平摊到其它提供者,不会引发剧烈变更。一致性hash算法就是把每台server分红v个虚拟节点,再把全部虚拟节点(n*v)随机分配到一致性哈希的圆环上,这样全部的用户从本身圆环上的位置顺时针往下取到第一个vnode就是本身所属的节点。当此节点存在故障时,再顺时针取下一个做为替代节点

六、最小链接数法

最小链接数算法比较灵活和智能,因为后端服务器的配置不尽相同,对于请求的处理有快有慢,它是根据后端服务器当前的链接状况,动态地选取其中当前

积压链接数最少的一台服务器来处理当前的请求,尽量地提升后端服务的利用效率,将负责合理地分流到每一台服务器。

七、IP地址散列

经过管理发送方IP和目的地IP地址的散列,未来自同一发送方的分组(或发送至同一目的地的分组)统一转发到相同服务器的算法。当客户端有一系列业务须要处理而必须和一个服务器反复通讯时,该算法可以以流(会话)为单位,保证来自相同客户端的通讯可以一直在同一服务器中进行处理。

八、URL散列

经过管理客户端请求URL信息的散列,将发送至相同URL的请求转发至同一服务器的算法。

4、Nginx的5种负载均衡算法

1. 轮询

轮询是默认的方式,每一个请求按时间顺序逐一分配到不一样的后端服务器上。若是后台服务器上某一台宕机了,它能够自动剔除。

缺点:可靠性低和负载分配不均衡。适用于图片服务器和静态页面服务器集群。

2. 加权轮询(wight)

指定轮询的概率,wight和访问比率成正比,用于后台服务器性能不均匀的状况。

upstream linuxidc{       
   server 10.0.0.77 weight=5;       
   server 10.0.0.88 weight=10; 
}复制代码

3. ip_hash

根据每一个请求的ip的hash结果分配,所以每一个固定ip能访问到同一个后端服务器,能够解决session问题。

upstream favresin{      
    ip_hash;      
    server 10.0.0.10:8080;       
    server 10.0.0.11:8080; 
}复制代码

4. fair(第三方)

按照后端服务器的响应时间来分配请求,响应时间短的优先分配。

upstream favresin{            
      server 10.0.0.10:8080;       
      server 10.0.0.11:8080;       
      fair; 
}复制代码

5. url_hash(第三方)

按照访问url的hash结果来分配请求,每一个固定的url访问同一个后端服务器。若是后端服务器是缓存时效率高。

upstream resinserver{       
      server 10.0.0.10:7777;       
      server 10.0.0.11:8888;       
      hash $request_uri;       
      hash_method crc32; 
}
例:在upstream中加入hash语句,hash_method是使用的hash算法。
复制代码

在upstream模块中,能够经过server命令指定后端服务器的IP地址和端口,同时还能够设置每台后端服务器在负载均衡调度中的状态,

upstream参数解析

  • upstream能够为每一个设备设置状态值
  • down:表示当前的server暂时不参与负载
  • weight:默认为1,wight越大,负载的权重越大。
  • max_fails:容许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream模块定义的错误。
  • fail_timeout:max_fails此失败后,暂停的时间。
  • backup:其余全部非backup机器宕或者忙的时候,请求backup的机器。


示例:

tips:
upstream bakend{ #定义负载均衡设备的Ip及设备状态 
  ip_hash;  
  server 192.0.0.1:8090 weight=5 max_fails=3 fail_timeout=20s;
  server 127.0.0.1:9090 down; 
  server 127.0.0.1:8080 weight=2;    
  server 127.0.0.1:6060;  
  server 127.0.0.1:7070 backup;  
}复制代码
相关文章
相关标签/搜索