nginx的概念与几种负载均衡算法
Nginx的背景
Nginx和Apache一样都是一种WEB服务器。基于REST架构风格,以URI(Uniform Resources Identifier,统一资源描述符)或URL(Uniform Resources Locator,统一资源定位符)作为沟通依据,通过HTTP协议提供各种网络服务。WEB服务器的设计受网络规模、网络带宽、产品特点等因素局限,且各自的定位和发展不同,因此各种WEB服务器有着各自的鲜明特点。
Apache的发展时期很长,而且是毫无争议的世界第一大服务器。它有着很多特点:稳定、开源、跨平台等。它出现的时间太长了,它兴起的年代,互联网产业远远比不上现在,所以它被设计为一个重量级的WEB服务器,不支持高并发。在Apache上运行数以万计的并发访问,会导致服务器消耗大量内存。操作系统对其进行进程或线程间的切换也消耗了大量的CPU资源,导致HTTP请求的平均响应速度降低。这些因素都决定了Apache不可能称为高性能的WEB服务器,因此轻量级的高并发服务器Nginx就登上了舞台。
Nginx的反向代理与负载均衡
Nginx是一款自由的、开源的、高性能的HTTP服务器和反向代理服务器;同时也是一个IMAP、POP3、SMTP代理服务器;Nginx可以作为一个HTTP服务器进行网站的发布处理,另外Nginx可以作为反向代理服务器进行负载均衡的实现。
反向代理服务器指的是服务端做代理,客户端要访问服务端就要通过反向代理服务器,访问的时候客户端并不知道自己访问的是代理(无感知代理存在),因此实际访问的服务端对客户端来说是隐藏的。有反向代理自然就有正向代理,正向代理则是代理客户端去访问不能直接访问的服务端。
实际的项目场景通常会同时应用到正向代理和反向代理:正向代理服务器代理客户端的请求去访问目标服务器,目标服务器是一个反向代理服务器,方向代理了多个真正的业务处理服务器。
明白了反向代理服务器的概念,就知道反向代理服务器会将来自客户端的请求转发给实际的业务处理服务器进行业务处理和返回响应。那么,如果有多个处理相同业务的业务处理服务器的话,Nginx会按照一定的规则将请求分发到每一个业务处理服务器,保证每一个请求都能够及时被处理和响应,这就是负载均衡。
负载均衡分为其实硬件负载均衡和软件负载均衡两种。硬件负载均衡也称为硬负载,如F5负载均衡,相对造价昂贵成本较高,但是数据的稳定性安全性等等有非常好的保障,如中国移动、中国联通这样财大气粗的公司就会选择硬负载进行操作。然而,更多的公司因为成本因素,会选择软件负载均衡,软件负载均衡是使用软件来进行负载均衡,是一种利用现有的技术结合主机硬件实现的消息队列分发机制。Nginx就是一款实现软件负载均衡的应用。
Nginx支持的负载均衡调度算法
轮询(weight,默认):接收到的请求按照顺序逐一分配到不同的后端服务器,即使在使用过程中,某一台后端服务器宕机,Nginx会自动将该服务器剔除出队列,请求受理情况不会受到任何影响。这种方式下,可以给不同的后端服务器设置一个权重值(weight),用于调整不同的服务器上请求的分配率。权重的数值越大,被分配到请求的几率越大。权重值可以根据不同的后端服务器的硬件配置进行调整,在配置的server后面加上weight=number修改权重值,这种方式叫做加权轮询。
IP绑定(ip_hash):每个请求按照发起客户端的IP的hash结果进行匹配,同样IP地址的客户端总是会访问同一个后端服务器,在一定程度上解决了集群部署环境下Session共享的问题。
最快响应时间(fair):智能调度算法,动态地根据后端服务器的处理处理效率和响应时间对请求进行均衡分配,响应时间短、处理效率高的服务器分配到请求的概率高,响应时间长、处理效率低的服务器分配到请求的概率低。使用这种算法需要安装upstream_fair模块。
URL绑定(url_hash):按照访问的URL的hash结果分配请求,相同的URL会访问同一个后端服务器,在一定程度上可以提高缓存的效率。使用这种算法需要安装Nginx的hash软件包。
最小连接数(least_conn):优先将请求分配给压力较小的后端服务器,这样可以平衡每个后端服务器下等待队列的长度,并避免向压力大的服务器添加更多的请求。
"凡世的喧嚣与明亮,世俗的快乐和幸福,如同清亮的溪涧,在风里,在我眼前,汨(mi)汨而过,温暖如同泉水一样涌出来。我没有奢望,我只要你快乐,不要悲伤。"