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

四层负载均衡和七层负载均衡的区别,第1张

关于负载均衡,经常听到四层负载均衡和七层负载均衡的说法,他们之间有什么关系和区别呢,今天就简单总结概括下。

也就是说,四层负载均衡是 基于IP+端口 的负载均衡,七层负载均衡是 基于URL 等应用层信息的负载均衡。

同理,还有基于MAC地址的二层负载均衡和基于IP地址的三层负载均衡。

在实际应用中,比较常见的就是四层负载及七层负载。这里也重点说下这两种负载。

  所谓的四到七层负载均衡,就是在对后台的服务器进行负载均衡时, 依据四层的信息或七层的信息来决定怎么样转发流量 。 比如四层的负载均衡,就是通过发布三层的IP地址(VIP),然后加四层的端口号,来决定哪些流量需要做负载均衡,对需要处理的流量进行NAT处理,转发至后台服务器,并记录下这个TCP或者UDP的流量是由哪台服务器处理的,后续这个连接的所有流量都同样转发到同一台服务器处理。七层的负载均衡,就是在四层的基础上(没有四层是绝对不可能有七层的),再考虑应用层的特征,比如同一个Web服务器的负载均衡,除了根据VIP加80端口辨别是否需要处理的流量,还可根据七层的URL、浏览器类别、语言来决定是否要进行负载均衡。举个例子,如果你的Web服务器分成两组,一组是中文语言的,一组是英文语言的,那么七层负载均衡就可以当用户来访问你的域名时,自动辨别用户语言,然后选择对应的语言服务器组进行负载均衡处理。

负载均衡器通常称为 四层交换机 七层交换机 。那么四层和七层两者到底区别在哪里?

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

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

  七层因为可以代理任意修改和处理用户的请求,所以可以使整个应用更加智能化和安全,代价就是设计和配置会更复杂。所以是否有必要使用七层负载均衡是一个需要权衡的问题。

  现在的7层负载均衡,主要还是着重于应用HTTP协议,所以其应用范围主要是众多的网站或者内部信息平台等基于B/S开发的系统。 4层负载均衡则对应其他TCP应用,例如基于C/S开发的ERP等系统。

理解负载均衡,必须先搞清楚正向代理和反向代理。

注:

正向代理,代理的是用户。

反向代理,代理的是服务器

什么是负载均衡

当一台服务器的单位时间内的访问量越大时,服务器压力就越大,大到超过自身承受能力时,服务器就会崩溃。为了避免服务器崩溃,让用户有更好的体验,我们通过负载均衡的方式来分担服务器压力。

我们可以建立很多很多服务器,组成一个服务器集群,当用户访问网站时,先访问一个中间服务器,在让这个中间服务器在服务器集群中选择一个压力较小的服务器,然后将该访问请求引入该服务器。如此以来,用户的每次访问,都会保证服务器集群中的每个服务器压力趋于平衡,分担了服务器压力,避免了服务器崩溃的情况。

负载均衡是用反向代理的原理实现的。

1、轮询(默认)

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

upstreambackserver {server192168014;server192168015;}

2、weight

指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的

情况。

upstreambackserver {server192168014weight=3;server192168015weight=7;}

权重越高,在被访问的概率越大,如上例,分别是30%,70%。

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

我们可以采用ip_hash指令解决这个问题,如果客户已经访问了某个服务器,当用户再次访问时,会将该请求通过哈希算法,自动定位到该服务器。

每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。

upstreambackserver{ip_hash;server192168014:88;server192168015:80;}

4、fair(第三方)

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

upstreambackserver {serverserver1;serverserver2;fair;}

5、url_hash(第三方)

按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。

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

每个设备的状态设置为:

down 表示单前的server暂时不参与负载

weight 默认为1weight越大,负载的权重就越大。

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

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

backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。

配置实例:

#user  nobody;worker_processes4;events {# 最大并发数worker_connections1024;}http{# 待选服务器列表upstream myproject{# ip_hash指令,将同一用户引入同一服务器。ip_hash;        server125219424fail_timeout=60s;        server172312183;        }    server{# 监听端口listen80;# 根目录下location / {# 选择哪个服务器列表proxy_pass http://myproject;                }            }

摘自https://wwwcnblogscom/lcword/p/12513155html

一般用的就用简单的轮询就好了

调度算法

静态方法:仅根据算法本身实现调度;实现起点公平,不管服务器当前处理多少请求,分配的数量一致

动态方法:根据算法及后端RS当前的负载状况实现调度;不管以前分了多少,只看分配的结果是不是公平

静态调度算法(static Schedu)(4种):

(1)rr (Round Robin) :轮叫,轮询

说明:轮询调度算法的原理是每一次把来自用户的请求轮流分配给内部中的服务器,从1开始,直到N(内部服务器个数),然后重新开始循环。算法的优点是其简洁性,它无需记录当前所有连接的状态,所以它是一种无状态调度。缺点:是不考虑每台服务器的处理能力。

(2)wrr (Weight Round Robin) :加权轮询(以权重之间的比例实现在各主机之间进行调度)

说明:由于每台服务器的配置、安装的业务应用等不同,其处理能力会不一样。所以,我们根据服务器的不同处理能力,给每个服务器分配不同的权值,使其能够接受相应权值数的服务请求。

(3)sh (Source Hashing) : 源地址hash实现会话绑定sessionaffinity

说明:简单的说就是有将同一客户端的请求发给同一个real server,源地址散列调度算法正好与目标地址散列调度算法相反,它根据请求的源IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的并且没有超负荷,将请求发送到该服务器,否则返回空。它采用的散列函数与目标地址散列调度算法的相同。它的算法流程与目标地址散列调度算法的基本相似,除了将请求的目标IP地址换成请求的源IP地址。

(4)dh : (Destination Hashing) : 目标地址hash

说明:将同样的请求发送给同一个server,一般用于缓存服务器,简单的说,LB集群后面又加了一层,在LB与realserver之间加了一层缓存服务器,当一个客户端请求一个页面时,LB发给cache1,当第二个客户端请求同样的页面时,LB还是发给cache1,这就是我们所说的,将同样的请求发给同一个server,来提高缓存的命中率。目标地址散列调度算法也是针对目标IP地址的负载均衡,它是一种静态映射算法,通过一个散列(Hash)函数将一个目标IP地址映射到一台服务器。目标地址散列调度算法先根据请求的目标IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。

动态调度算法(dynamic Schedu)(6种):

(1)lc (Least-Connection Scheduling): 最少连接

说明:最少连接调度算法是把新的连接请求分配到当前连接数最小的服务器,最小连接调度是一种动态调度短算法,它通过服务器当前所活跃的连接数来估计服务器的负载均衡,调度器需要记录各个服务器已建立连接的数目,当一个请求被调度到某台服务器,其连接数加1,当连接中止或超时,其连接数减一,在系统实现时,我们也引入当服务器的权值为0时,表示该服务器不可用而不被调度。此算法忽略了服务器的性能问题,有的服务器性能好,有的服务器性能差,通过加权重来区分性能,所以有了下面算法wlc。

简单算法:active256+inactive (谁的小,挑谁)

(2)wlc (Weighted Least-Connection Scheduling):加权最少连接

加权最小连接调度算法是最小连接调度的超集,各个服务器用相应的权值表示其处理性能。服务器的缺省权值为1,系统管理员可以动态地设置服务器的权限,加权最小连接调度在调度新连接时尽可能使服务器的已建立连接数和其权值成比例。由于服务器的性能不同,我们给性能相对好的服务器,加大权重,即会接收到更多的请求。

简单算法:(active256+inactive)/weight(谁的小,挑谁)

(3)sed (shortest expected delay scheduling):最少期望延迟

说明:不考虑非活动连接,谁的权重大,我们优先选择权重大的服务器来接收请求,但会出现问题,就是权重比较大的服务器会很忙,但权重相对较小的服务器很闲,甚至会接收不到请求,所以便有了下面的算法nq。

基于wlc算法,简单算法:(active+1)256/weight (谁的小选谁)

(4)nq (Never Queue Scheduling): 永不排队

说明:在上面我们说明了,由于某台服务器的权重较小,比较空闲,甚至接收不到请求,而权重大的服务器会很忙,所此算法是sed改进,就是说不管你的权重多大都会被分配到请求。简单说,无需队列,如果有台real server的连接数为0就直接分配过去,不需要在进行sed运算。

(5)LBLC(Locality-Based Least Connections) :基于局部性的最少连接

说明:基于局部性的最少连接算法是针对请求报文的目标IP地址的负载均衡调度,主要用于Cache集群系统,因为Cache集群中客户请求报文的目标IP地址是变化的,这里假设任何后端服务器都可以处理任何请求,算法的设计目标在服务器的负载基本平衡的情况下,将相同的目标IP地址的请求调度到同一个台服务器,来提高服务器的访问局部性和主存Cache命中率,从而调整整个集群系统的处理能力。

(6)LBLCR(Locality-Based Least Connections with Replication) :基于局部性的带复制功能的最少连接

说明:基于局部性的带复制功能的最少连接调度算法也是针对目标IP地址的负载均衡,该算法根据请求的目标IP地址找出该目标IP地 址对应的服务器组,按“最小连接”原则从服务器组中选出一台服务器,若服务器没有超载,将请求发送到该服务器;若服务器超载,则按“最小连接”原则从这个集群中选出一台服务器,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除, 以降低复制的程度。

什么是负载均衡?

负载均衡是由多台服务器以对称的方式组成一个服务器集合,每台服务器都

具有等价的地位,都可以单独对外提供服务而无须其他服务器的辅助。通过某

种负载分担技术,将外部发送来的请求均匀分配到对称结构中的某一台服务器

上,而接收到请求的服务器独立地回应客户的请求。

均衡负载能够平均分配客户请求到服务器列阵,籍此提供快速获取重要数据,

解决大量并发访问服务问题。这种群集技术可以用最少的投资获得接近于大型

主机的性能。

原理图

DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
网站模板库 » 四层负载均衡和七层负载均衡的区别

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情