⾼并发解决⽅案之⼀——负载均衡
⽬录
⼀、什么是负载均衡?
当⼀台服务器的性能达到极限时,我们可以使⽤服务器集来提⾼⽹站的整体性能。那么,在服务器集中,需要有⼀台服务器充当调度者的⾓⾊,⽤户的所有请求都会⾸先由它接收,调度者再根据每台服务器的负载情况将请求分配给某⼀台后端服务器去处理。
那么在这个过程中,调度者如何合理分配任务,保证所有后端服务器都将性能充分发挥,从⽽保持服务器集的整体性能最优,这就是负载均衡问题。
下⾯详细介绍负载均衡的四种实现⽅式:
1. HTTP重定向实现负载均衡
1.1 过程描述
当⽤户向服务器发起请求时,请求⾸先被集调度者截获;调度者根据某种分配策略,选择⼀台服务器,
并将选中的服务器的IP地址封装在HTTP响应消息头部的Location字段中,并将响应消息的状态码设为302,最后将这个响应消息返回给浏览器。
当浏览器收到响应消息后,解析Location字段,并向该URL发起请求,然后指定的服务器处理该⽤户的请求,最后将结果返回给⽤户。
在使⽤HTTP重定向来实现服务器集负载均衡的过程中,需要⼀台服务器作为请求调度者。⽤户的⼀项操作需要发起两次HTTP请求,⼀次向调度服务器发送请求,获取后端服务器的IP,第⼆次向后端服务器发送请求,获取处理结果。
1.2 调度策略国内源代码网站
调度服务器收到⽤户的请求后,究竟选择哪台后端服务器处理请求,这由调度服务器所使⽤的调度策略决定。
1. 随机分配策略
当调度服务器收到⽤户请求后,可以随机决定使⽤哪台后端服务器,然后将该服务器的IP封装在HTTP响应消息的Location属性中,返回给浏览器即可。
2. 轮询策略(RR)
调度服务器需要维护⼀个值,⽤于记录上次分配的后端服务器的IP。那么当新的请求到来时,调度者将请求依次分配给下⼀台服务器。
由于轮询策略需要调度者维护⼀个值⽤于记录上次分配的服务器IP,因此需要额外的开销;此外,由于这个值属于互斥资源,那么当多个请求同时到来时,为了避免线程的安全问题,因此需要锁定互斥资源,从⽽降低了性能。⽽随机分配策略不需要维护额外的值,也就不存在线程安全问题,因此性能⽐轮询要⾼。
1.3 优缺点分析
采⽤HTTP重定向来实现服务器集的负载均衡实现起来较为容易,逻辑⽐较简单,但缺点也较为明显。
在HTTP重定向⽅法中,调度服务器只在客户端第⼀次向⽹站发起请求的时候起作⽤。当调度服务器向浏览器返回响应信息后,客户端此后的操作都基于新的URL进⾏的(也就是后端服务器),此后浏览器就不会与调度服务器产⽣关系,进⽽会产⽣如下⼏个问题:
由于不同⽤户的访问时间、访问页⾯深度有所不同,从⽽每个⽤户对各⾃的后端服务器所造成的压⼒也不同。⽽调度服务器在调度时,⽆法知道当前⽤户将会对服务器造成多⼤的压⼒,因此这种⽅式⽆法实现真正意义上的负载均衡,只不过是把请求次数平均分配给每台服务器罢了。
若分配给该⽤户的后端服务器出现故障,并且如果页⾯被浏览器缓存,那么当⽤户再次访问⽹站时,请求都会发给出现故障的服务器,从⽽导致访问失败。
2. DNS负载均衡
2.1 DNS是什么?
在了解DNS负载均衡之前,我们⾸先需要了解DNS域名解析的过程。
我们知道,数据包采⽤IP地址在⽹络中传播,⽽为了⽅便⽤户记忆,我们使⽤域名来访问⽹站。那么,我们通过域名访问⽹站之前,⾸先需要将域名解析成IP地址,这个⼯作是由DNS完成的,也就是域名服务器。
我们提交的请求不会直接发送给想要访问的⽹站,⽽是⾸先发给域名服务器,它会帮我们把域名解析成IP地址并返回给我们。我们收到IP之后才会向该IP发起请求。
那么,DNS服务器有⼀个天然的优势,如果⼀个域名指向了多个IP地址,那么每次进⾏域名解析时,DNS只要选⼀个IP返回给⽤户,就能够实现服务器集的负载均衡。
2.2 具体做法
⾸先需要将我们的域名指向多个后端服务器(将⼀个域名解析到多个IP上),再设置⼀下调度策略,那么我们的准备⼯作就完成了,接下来的负载均衡就完全由DNS服务器来实现。
当⽤户向我们的域名发起请求时,DNS服务器会⾃动地根据我们事先设定好的调度策略选⼀个合适的IP返回给⽤户,⽤户再向该IP发起请求。
2.3 调度策略
⼀般DNS提供商会提供⼀些调度策略供我们选择,如随机分配、轮询、根据请求者的地域分配离他最近的服务器。
2.4 优缺点分析
DNS负载均衡最⼤的优点就是配置简单。服务器集的调度⼯作完全由DNS服务器承担,那么我们就可以把精⼒放在后端服务器上,保证他们的稳定性与吞吐量。⽽且完全不⽤担⼼DNS服务器的性能,即便是使⽤了轮询策略,它的吞吐率依然卓越。
此外,DNS负载均衡具有较强了扩展性,你完全可以为⼀个域名解析较多的IP,⽽且不⽤担⼼性能问题。
但是,由于把集调度权交给了DNS服务器,从⽽我们没办法随⼼所欲地控制调度者,没办法定制调度策略。
DNS服务器也没办法了解每台服务器的负载情况,因此没办法实现真正意义上的负载均衡。它和HTTP重定向⼀样,只不过把所有请求平均分配给后端服务器罢了。
此外,当我们发现某⼀台后端服务器发⽣故障时,即使我们⽴即将该服务器从域名解析中去除,但由于DNS服务器会有缓存,该IP仍然会在DNS中保留⼀段时间,那么就会导致⼀部分⽤户⽆法正常访问⽹站。这是⼀个致命的问题!好在这个问题可以⽤动态DNS来解决。
2.5 动态DNS
动态DNS能够让我们通过程序动态修改DNS服务器中的域名解析。从⽽当我们的监控程序发现某台服务器挂了之后,能⽴即通知DNS 将其删掉。
2.6 综上所述
DNS负载均衡是⼀种粗犷的负载均衡⽅法,这⾥只做介绍,不推荐使⽤。
3. 反向代理负载均衡
3.1 什么是反向代理负载均衡?
反向代理服务器是⼀个位于实际服务器之前的服务器,所有向我们⽹站发来的请求都⾸先要经过反向代理服务器,服务器根据⽤户的请求要么直接将结果返回给⽤户,要么将请求交给后端服务器处理,再返回给⽤户。
之前我们介绍了⽤反向代理服务器实现静态页⾯和常⽤的动态页⾯的缓存。接下来我们介绍反向代理服务器更常⽤的功能——实现负载均衡。
我们知道,所有发送给我们⽹站的请求都⾸先经过反向代理服务器。那么,反向代理服务器就可以充当服务器集的调度者,它可以根据当前后端服务器的负载情况,将请求转发给⼀台合适的服务器,并将处理结果返回给⽤户。
3.2 优点
1. 隐藏后端服务器。
与HTTP重定向相⽐,反向代理能够隐藏后端服务器,所有浏览器都不会与后端服务器直接交互,从⽽能够确保调度者的控制权,提升
集的整体性能。
2. 故障转移
与DNS负载均衡相⽐,反向代理能够更快速地移除故障结点。当监控程序发现某⼀后端服务器出现故障时,能够及时通知反向代理服务器,并⽴即将其删除。
3. 合理分配任务
HTTP重定向和DNS负载均衡都⽆法实现真正意义上的负载均衡,也就是调度服务器⽆法根据后端服务器的实际负载情况分配任务。
但反向代理服务器⽀持⼿动设定每台后端服务器的权重。我们可以根据服务器的配置设置不同的权重,权重的不同会导致被调度者选中的概率的不同。
3.3 缺点
1. 调度者压⼒过⼤
由于所有的请求都先由反向代理服务器处理,那么当请求量超过调度服务器的最⼤负载时,调度服务器的吞吐率降低会直接降低集的整体性能。
2. 制约扩展
当后端服务器也⽆法满⾜巨⼤的吞吐量时,就需要增加后端服务器的数量,可没办法⽆限量地增加,因为会受到调度服务器的最⼤吞吐量的制约。
3.4 粘滞会话
反向代理服务器会引起⼀个问题:若某台后端服务器处理了⽤户的请求,并保存了该⽤户的session或存储了缓存,那么当该⽤户再次发送请求时,⽆法保证该请求仍然由保存了其Session或缓存的服务器处理,若由其他服务器处理,先前的Session或缓存就不到了。
解决办法1:
可以修改反向代理服务器的任务分配策略,以⽤户IP作为标识较为合适。相同的⽤户IP会交由同⼀台后端服务器处理,从⽽就避免了粘滞会话的问题。
解决办法2:
可以在Cookie中标注请求的服务器ID,当再次提交请求时,调度者将该请求分配给Cookie中标注的服务器处理即可。
4. 2层or3层做负载均衡
4.1 2层负载均衡
也即在数据链路层做负载均衡。通过修改数据链路层的mac地址,ip使⽤的是虚拟IP,来实现负载均衡,解决响应数据体量过⼤效率低的问题。当客户端请求服务器时,负载均衡服务器替换mac地址为计算服务器,替换ip为负载均衡服务器ip,计算服务器直接响应数据到客户端。
这种负载均衡⽅式吞吐量最⾼,⼤型互联⽹公司都是采⽤这种负载均衡⽅式。LVS负载均衡是结合了IP层和数据链路层的负载均衡⽅式,linux通过配置可以实现这两种负载均衡⽅式。
4.2 3层负载均衡
⽹络层负载均衡。对⽹络层的IP地址进⾏替换,不需要在http层(应⽤层)⼯作,直接在操作系统内核的IP数据包中替换地址,效率⽐基于HTTP层的反向代理⾼。但是有个缺点是:请求和响应度需要经过负载均衡服务器进⾏ip层替换,响应数据会成为后期的瓶颈。
⼆、负载均衡组件
1. Apache
它是Apache软件基⾦会的⼀个开放源代码的跨平台的⽹页服务器,属于⽼牌的web服务器了,⽀持基
于Ip或者域名的虚拟主机,⽀持代理服务器,⽀持安全Socket层(SSL)等等,⽬前互联⽹主要使⽤它做静态资源服务器,也可以做代理服务器转发请求(如:图⽚链等),结合tomcat等servlet容器处理jsp。
2. Ngnix
俄罗斯⼈开发的⼀个⾼性能的 HTTP和反向代理服务器。由于Nginx 超越 Apache 的⾼性能和稳定性,使得国内使⽤ Nginx 作为Web 服务器的⽹站也越来越多,其中包括新浪博客、新浪播客、⽹易新闻、腾讯⽹、搜狐博客等门户⽹站频道等,在3w以上的⾼并发环境下,ngnix处理能⼒相当于apache的10倍。
参考:
4. HAProxy
HAProxy提供⾼可⽤性、负载均衡以及基于TCP和HTTP应⽤的代理,⽀持虚拟主机,它是免费、快速并且可靠的⼀种解决⽅案。HAProxy特别适⽤于那些负载特⼤的web站点, 这些站点通常⼜需要会话保持或七层处理。HAProxy运⾏在当前的硬件上,完全可以⽀持数以万计的并发连接。并且它的运⾏模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到⽹络上.
5. keepalived
这⾥说的keepalived不是apache或者tomcat等某个组件上的属性字段,它也是⼀个组件,可以实现web服务器的⾼可⽤(HA high availably)。它可以检测web服务器的⼯作状态,如果该服务器出现故障被检测到,将其剔除服务器中,直⾄正常⼯作后,keepalive会⾃动检测到并加⼊到服务器⾥⾯。实现主备服务器发⽣故障时ip瞬时⽆缝交接。它是LVS集节点健康检测的⼀个⽤户空间守护进程,也是LVS的引导故障转移模块(director failover)。Keepalived守护进程可以检查LVS池的状态。如果LVS服务器池当中的某⼀个服务器宕机了。keepalived会通过⼀ 个setsockopt呼叫通知内核将这个节点从LVS拓扑图中移除。
6. memcached
它是⼀个⾼性能分布式内存对象缓存系统。当初是Danga Interactive为了LiveJournal快速发展开发的系统,⽤于对业务查询数据缓存,减轻数据库的负载。其守护进程(daemon)是⽤C写的,但是客户端⽀持⼏乎所有语⾔(客户端基本上有3种版本[memcache client for java;spymemcached;xMecache]),服务端和客户端通过简单的协议通信;在memcached⾥⾯缓存的数据必须序列化。
7. terracotta
是⼀款由美国Terracotta公司开发的著名开源Java集平台。它在JVM与Java应⽤之间实现了⼀个专门处理集功能的抽象层,允许⽤户在不改变系统代码的情况下实现java应⽤的集。⽀持数据的持久化、session的复制以及⾼可⽤(HA)。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论