Nginx负载均衡

nginx负载均衡策略

1. round robin轮询(默认)

每个请求按时间顺序逐一分配到不同的厚度那服务器,如果后端服务器down掉,能自动剔除。

upstream backserver {
    server 192.168.254.100;
    server 192.168.254.101;
}

2. weight 加权轮询 

指定轮询记录,weight和访问比率成正比,用于后端服务器性能不均的情况下。

upstream backserver{
    server 192.168.254.100 weight=3;
    server 192.168.254.101 weight=7;
}

权重越高,在被访问的概率越大

3. ip_hash ip的hash值

ip_hash 依据发出请求的客户端IP的hash值来分配服务器,该算法可以保证同IP发出的请求映射到同一服务器,或者具有相同的hash值的不同IP映射到同一服务器。

问题: 在负载均衡系统中,加入用户在某台服务器上登录了,那么该用户第二次请求的时候,因为我们是负载均衡系统,每次请求都会重新定位到服务器集群中的某一个,那么已经登陆某一个服务器的用户再重新定位到另一个服务器,其登录信息将会丢失,这样显然是不妥的。

解决方法:我们可以采用ip_hash指令解决这个问题,如果客户已经访问了某个服务器,当用户再次访问时,会将请求通过哈希算法,自动定位到该服务器。每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。

upstream backserver {
    ip hash;
    server 192.168.254.100;
    server 192.168.254.101;
}

4. fair(第三方)

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

upstream backserver {
   server 192.168.254.100;
   server 192.168.254.101;
  fair; }

5. url_hash(第三方)

url_hash 是根据请求的URL 的hash值来分配服务器。该算法的特点是,相同URL的请求会分配给固定的服务器,当存在缓存的时候,效率一般较高。然后Nginx默认不支持这种负载均衡算法,需要依赖第三方库。

upstream backserver {
    server squid1:3128;
    server squild2:3128;
    hash $request_uri;
    hash_method crc32;
}

在需要使用负载均衡的server中增加

proxy_pass http://backserver/;
upstream backserver{
    ip_hash;
    server 127.0.0.1:9090 down; (down 表示当前的server暂时不参与负载)
    server 127.0.0.1:8080 weight=2; (weight 默认为weight越大,负载的权重就越大)
    server 127.0.0.1:6060;
    server 127.0.0.1:7070 backup; (其它所有的非backup机器down或者忙的时候,请求backup机器)

max_fails: 允许请求失败的次数默认为1,当超过最大次数是,返回proxy_next_upstream模块定义的错误。

fail_timeout: max_fails次失败后,暂停的时间。

6. least_conn

把请求转发给连接数较少的后端服务器。轮询算法是把请求平均的转发给各个后端,使他们的负载大致相同;但是,有些请求占用的时间较少,会导致其所在的后端负载较高。这种情况下,least_conn这种方式就可以达到更好的负载均衡效果。

upstream backserver{
    least_conn;  # 把请求转发给连接数较少的后端服务器
    server localhost:8080 weight=2;
}

注意: 此负载均衡策略适合请求处理时间长短不一造成服务器过载的情况。

第一类 最佳实现

  weight

  random

第二类 性能优先

  weight

  fair

  least_conn

第三类 保持稳定

  ip_hash

  url_hash

负载均衡分类

二层负载均衡(mac)

负载均衡服务器对外依然提供一个VIP(虚IP),集群中不同的机器采用相同IP地址,但是机器的MAC地址不一样。当负载均衡服务器接受到请求之后,通过改写报文的目标MAC地址的方式将请求转发到目标机器实现负载均衡。

三层负载均衡(ip)

和二层负载均衡类似,负载均衡服务器对依然提供一个VIP(虚IP),但是集群中不同的机器采用不同的IP地址。当负载均衡服务器接受到请求之后,根据不同的负载均衡算法,通过IP将请求转发至不同的真实服务器。

四层负载均衡(tcp)

四层负载均衡工作在OSI模型的传输层,由于在传输层,只有TCP/UDP协议,这两种协议中处理包含源IP,目标IP以外,还包含源端口号。四层负载均衡服务器在接受到客户端请求后,以后通过修改数据包的地址信息,将流量转发到应用服务器。

七层负载均衡(http)

七层负载均衡工作在OSI模型的应用层,应用层协议较多,常用http,radius,dns等。七层负载就可以基于这些协议来负载。这些应用层协议中会包含很多有意义的内容。比如同一个Web服务器的负载均衡,除了根据IP加端口进行负载外,还可根据七层的URL,浏览器类别,语言来决定是否要进行负载均衡。

负载均衡常用类型

现代负载均衡技术通常操作于网络的第四层或第七层。第四层负载均衡将一个Internet上合法注册的IP地址映射为过个内部服务器的IP地址,对每次TCP连接请求动态使用其中一个内部IP地址,达到负载均衡的目的。

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

在三层负载均衡的基础上,通过发布三层的IP地址(VIP),然后加四层的端口号,来决定那些流量需要做负载均衡,对需要处理的流量进行NAT处理,转发至后台服务器,并记录下这个TCP或者UDP的流量是由哪台服务器处理的,后续这个连接的所有流量都同样转发到同一台服务器处理。

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

七层的负载均衡就是基于虚拟的URL或主机IP的负载均衡:

在四层负载均衡的基础上(没有四层是绝对不可能有七层的),在考虑应用层的特征,比如同一个Web服务器的负载均衡,除了根据VIP加80端口辨别是否需要处理的流量,还可以根据七层的URL,浏览器类别,语言来决定是否要进行负载均衡。举个例子,如果你的Web服务器分成两组,一组是中文语言的,一组是英文语言的,那么七层负载均衡就可以当用户来访问你的域名时,自动辨别用户语言,然后选择对应的语言服务器组进行负载均衡处理。

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

四层和七层负载均衡之间的区别

从技术原理上分析

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

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

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

以常见的TCP为例,负载均衡设备如果要根据真正的应用层内容再选择服务器,只能先代理最终的服务器和客户端建立连接(三次握手)后,才可能接受到客户端发送的真正应用层内容的报文,然后再根据改报文中的特定字段,再加上负载均衡设备设置的服务器选择方式,决定最终选择的内部服务器。负载均衡设备在这种情况下,更类似于一个代理服务器。负载均衡和前端的客户端以及后盾的服务器会分别建立TCP连接。所以从这个技术原理上来看,七层负载均衡明显的对负载均衡设备的要求更高,处理七层的能力也必然会低于四层模式的部署方式。

四层负载均衡在中间传输层执行,它处理消息的传递,但不考虑消息的内容。例如TCP是网络上Hypertext Transfer Protocol (HTTP) 流量的第四层协议。在这一过程中,4层负载均衡会将网络数据包转发到上有服务器,但不会检查数据包的内容,只能通过检查TCP流中的前几个包做出有限的路由决策。

七层负载均衡不同于四层负载均衡,它在高级应用层上执行,会处理每个消息的实际内容。HTTP是网络撒花姑娘网站流量的主要7层协议。七层负载均衡以比四层负载均衡更复杂的方式路由网络流量,尤其适用于基于TCP的流量。七层负载均衡会终止网络流量并读取其中信息,他可以根据消息内容做出负载均衡决策。随后,七层负载均衡与选定上有服务器建立新的TCP连接并件请求写入服务器。

简单来说,二者之间的区别

七层负载均衡基本都是基于HTTP协议的,适用于web服务器的负载均衡。

四层负载均衡主要是基于tcp协议报文,可以做任何基于tcp/ip协议的软件的负载均衡。

两者主要区别在于利用的报文所在的层面是不同的,各有各的好处。

七层应用负载的好处,是使得整个网络更智能化。例如访问一个网站的用户流量,可以通过七层的方式,将对图片类的请求转发到特定的图片服务器并可以使用缓存技术;将对文字类的请求可以转发到特定的文字服务器并可以使用压缩技术。当然这只是七层应用的一个小案例,从技术原理上,这种方式可以对客户端的请求和服务器的相应进行任意意义上的修改,极大的提升了应用系统的网络层的灵活性。很多在后台,例如Nginx或者Apache上部署的功能可以前移到负载均衡设备上,例如客户请求中的Header重写,服务器响应中的关键字过滤或者内容插入等功能。

四层负载均衡主要是较为灵活,可以作为多种软件的负载均衡器。

举个例子形象的说明:四层负载均衡就像银行的自助排号机,每一个达到银行的客户根据排号机的顺序,选择对应的窗口接受服务;而七层负载均衡象银行大堂经理,先确认客户需要办理的业务,在安排排号。这样办理理财,存取款等业务的客户,会根据银行内部资源得到统一协调处理,加快客户业务办理流程。

七层负载均衡的好处

七层负载均衡比基于数据包的四层负载均衡更占CPU,但很少导致服务器性能下降。七层负载均衡可以让负载均衡器做出更明智的决策,并可以对内容进行优化和更改,如压缩,加密等等。七层负载均衡还可以利用buffering来卸载上游服务器的慢速连接,从而提高性能。

执行七层负载平衡的组件通常被称为反向代理服务器。

推荐一篇介绍很详细的文章 https://www.cnblogs.com/kevingrace/p/6137881.html

posted @ 2021-02-25 15:16  恰恰的故事  阅读(94)  评论(0编辑  收藏  举报