`
2277259257
  • 浏览: 515439 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

六大Web负载均衡原理与实现

 
阅读更多

 

 

六大Web负载均衡原理与实现

 开头先理解一下所谓的“均衡”

不能狭义地理解为分配给所有实际服务器一样多的工作量,因为多台服务器的承载能力各不相同,这可能体现在硬件配置、网络带宽的差异,也可能因为某台服务器身兼多职,我们所说的“均衡”,也就是希望所有服务器都不要过载,并且能够最大程序地发挥作用。

 

一、http重定向

当http代理(比如浏览器)向web服务器请求某个URL后,web服务器可以通过http响应头信息中的Location标记来返回一个新的URL。这意味着HTTP代理需要继续请求这个新的URL,完成自动跳转。

 

性能缺陷:

1、吞吐率限制

主站点服务器的吞吐率平均分配到了被转移的服务器。现假设使用RR(Round Robin)调度策略,子服务器的最大吞吐率为1000reqs/s,那么主服务器的吞吐率要达到3000reqs/s才能完全发挥三台子服务器的作用,那么如果有100台子服务器,那么主服务器的吞吐率可想而知得有大?相反,如果主服务的最大吞吐率为6000reqs/s,那么平均分配到子服务器的吞吐率为2000reqs/s,而现子服务器的最大吞吐率为1000reqs/s,因此就得增加子服务器的数量,增加到6个才能满足。

 

2、重定向访问深度不同

有的重定向一个静态页面,有的重定向相比复杂的动态页面,那么实际服务器的负载差异是不可预料的,而主站服务器却一无所知。因此整站使用重定向方法做负载均衡不太好。

 

我们需要权衡转移请求的开销和处理实际请求的开销,前者相对于后者越小,那么重定向的意义就越大,例如下载。你可以去很多镜像下载网站试下,会发现基本下载都使用了Location做了重定向

 

二、DNS负载均衡

DNS 负责提供域名解析服务,当访问某个站点时,实际上首先需要通过该站点域名的DNS服务器来获取域名指向的IP地址,在这一过程中,DNS服务器完成了域名到IP地址的映射,同样,这样映射也可以是一对多的,这时候,DNS服务器便充当了负载均衡调度器,它就像http重定向转换策略一样,将用户的请求分散到多台服务器上,但是它的实现机制完全不同。

 

使用dig命令来看下"baidu"的DNS设置

20141120181216406.png

可见baidu拥有三个A记录

 

相比http重定向,基于DNS的负载均衡完全节省了所谓的主站点,或者说DNS服务器已经充当了主站点的职能。但不同的是,作为调度器,DNS服务器本身的性能几乎不用担心。因为DNS记录可以被用户浏览器或者互联网接入服务商的各级DNS服务器缓存,只有当缓存过期后才会重新向域名的DNS服务器请求解析。也说是DNS不存在http的吞吐率限制,理论上可以无限增加实际服务器的数量。

 

特性:

1、可以根据用户IP来进行智能解析。DNS服务器可以在所有可用的A记录中寻找离用记最近的一台服务器。

2、动态DNS:在每次IP地址变更时,及时更新DNS服务器。当然,因为缓存,一定的延迟不可避免。

 

不足:

1、没有用户能直接看到DNS解析到了哪一台实际服务器,加服务器运维人员的调试带来了不便。

2、策略的局限性。例如你无法将HTTP请求的上下文引入到调度策略中,而在前面介绍的基于HTTP重定向的负载均衡系统中,调度器工作在HTTP层面,它可以充分理解HTTP请求后根据站点的应用逻辑来设计调度策略,比如根据请求不同的URL来进行合理的过滤和转移。

3、如果要根据实际服务器的实时负载差异来调整调度策略,这需要DNS服务器在每次解析操作时分析各服务器的健康状态,对于DNS服务器来说,这种自定义开发存在较高的门槛,更何况大多数站点只是使用第三方DNS服务。

4、DNS记录缓存,各级节点的DNS服务器不同程序的缓存会让你晕头转向。

5、基于以上几点,DNS服务器并不能很好地完成工作量均衡分配,最后,是否选择基于DNS的负载均衡方式完全取决于你的需要。

 

三、反向代理负载均衡

这个肯定大家都有所接触,因为几乎所有主流的Web服务器都热衷于支持基于反向代理的负载均衡。它的核心工作就是转发HTTP请求。

相比前面的HTTP重定向和DNS解析,反向代理的调度器扮演的是用户和实际服务器中间人的角色:

1、任何对于实际服务器的HTTP请求都必须经过调度器

2、调度器必须等待实际服务器的HTTP响应,并将它反馈给用户(前两种方式不需要经过调度反馈,是实际服务器直接发送给用户)

 

特性:

1、调度策略丰富。例如可以为不同的实际服务器设置不同的权重,以达到能者多劳的效果。

2、对反向代理服务器的并发处理能力要求高,因为它工作在HTTP层面。

3、反向代理服务器进行转发操作本身是需要一定开销的,比如创建线程、与后端服务器建立TCP连接、接收后端服务器返回的处理结果、分析HTTP头部信息、用户空间和内核空间的频繁切换等,虽然这部分时间并不长,但是当后端服务器处理请求的时间非常短时,转发的开销就显得尤为突出。例如请求静态文件,更适合使用前面介绍的基于DNS的负载均衡方式。

4、反向代理服务器可以监控后端服务器,比如系统负载、响应时间、是否可用、TCP连接数、流量等,从而根据这些数据调整负载均衡的策略。

5、反射代理服务器可以让用户在一次会话周期内的所有请求始终转发到一台特定的后端服务器上(粘滞会话),这样的好处一是保持session的本地访问,二是防止后端服务器的动态内存缓存的资源浪费。

 

 

四、IP负载均衡(LVS-NAT)

因为反向代理服务器工作在HTTP层,其本身的开销就已经严重制约了可扩展性,从而也限制了它的性能极限。那能否在HTTP层面以下实现负载均衡呢?

 

NAT服务器:它工作在传输层,它可以修改发送来的IP数据包,将数据包的目标地址修改为实际服务器地址。

从 Linux2.4内核开始,其内置的Neftilter模块在内核中维护着一些数据包过滤表,这些表包含了用于控制数据包过滤的规则。可喜的是,Linux提供了iptables来对过滤表进行插入、修改和删除等操作。更加令人振奋的是,Linux2.6.x内核中内置了IPVS模块,它的工作性质类型于Netfilter模块,不过它更专注于实现IP负载均衡

想知道你的服务器内核是否已经安装了IPVS模块,可以

20141121164600671.png

有输出意味着IPVS已经安装了。IPVS的管理工具是ipvsadm,它为提供了基于命令行的配置界面,可以通过它快速实现负载均衡系统。这就是大名鼎鼎的LVS(Linux Virtual Server,Linux虚拟服务器)。

 

1、打开调度器的数据包转发选项

echo 1 > /proc/sys/net/ipv4/ip_forward

2、检查实际服务器是否已经将NAT服务器作为自己的默认网关,如果不是,如添加

route add default gw xx.xx.xx.xx

3、使用ipvsadm配置

ipvsadm -A -t 111.11.11.11:80 -s rr  

添加一台虚拟服务器,-t 后面是服务器的外网ip和端口,-s rr是指采用简单轮询的RR调度策略(这属于静态调度策略,除此之外,LVS还提供了系列的动态调度策略,比如最小连接(LC)、带权重的最小连接(WLC),最短期望时间延迟(SED)等)

ipvsadm -a -t 111.11.11.11:80 -r 10.10.120.210:8000 -m  

ipvsadm -a -t 111.11.11.11:80 -r 10.10.120.211:8000 -m  

添加两台实际服务器(不需要有外网ip),-r后面是实际服务器的内网ip和端口,-m表示采用NAT方式来转发数据包

运行ipvsadm -L -n可以查看实际服务器的状态。这样就大功告成了。

 

实验证明使用基于NAT的负载均衡系统。作为调度器的NAT服务器可以将吞吐率提升到一个新的高度,几乎是反向代理服务器的两倍以上,这大多归功于在内核中进行请求转发的较低开销。但是一旦请求的内容过大时,不论是基于反向代理还是NAT,负载均衡的整体吞吐量都差距不大,这说明对于一睦开销较大的内容,使用简单的反向代理来搭建负载均衡系统是值考虑的。

 

这么强大的系统还是有它的瓶颈,那就是NAT服务器的网络带宽,包括内部网络和外部网络。当然如果你不差钱,可以去花钱去购买千兆交换机或万兆交换机,甚至负载均衡硬件设备,但如果你是个屌丝,咋办?

一个简单有效的办法就是将基于NAT的集群和前面的DNS混合使用,比如5个100Mbps出口宽带的集群,然后通过DNS来将用户请求均衡地指向这些集群,同时,你还可以利用DNS智能解析实现地域就近访问。这样的配置对于大多数业务是足够了,但是对于提供下载或视频等服务的大规模站点,NAT服务器还是不够出色。

 

五、直接路由(LVS-DR)

NAT是工作在网络分层模型的传输层(第四层),而直接路由是工作在数据链路层(第二层),貌似更屌些。它通过修改数据包的目标MAC地址(没有修改目标IP),将数据包转发到实际服务器上,不同的是,实际服务器的响应数据包将直接发送给客户羰,而不经过调度器。

1、网络设置

这里假设一台负载均衡调度器,两台实际服务器,购买三个外网ip,一台机一个,三台机的默认网关需要相同,最后再设置同样的ip别名,这里假设别名为 10.10.120.193。这样一来,将通过10.10.120.193这个IP别名来访问调度器,你可以将站点的域名指向这个IP别名。

2、将ip别名添加到回环接口lo上

这是为了让实际服务器不要去寻找其他拥有这个IP别名的服务器,在实际服务器中运行:

20141121180709578.png

另外还要防止实际服务器响应来自网络中针对IP别名的ARP广播,为此还要执行:

echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore

echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce

echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore

echo "1" > /proc/sys/net/ipv4/conf/all/arp_announce

配置完了就可以使用ipvsadm配置LVS-DR集群了

 

ipvsadm -A -t 10.10.120.193:80 -s rr  

ipvsadm -a -t 10.10.120.193:80 -r 10.10.120.210:8000 -g  

ipvsadm -a -t 10.10.120.193:80 -r 10.10.120.211:8000 -g  

-g 就意味着使用直接路由的方式转发数据包

LVS-DR 相较于LVS-NAT的最大优势在于LVS-DR不受调度器宽带的限制,例如假设三台服务器在WAN交换机出口宽带都限制为10Mbps,只要对于连接调度器和两台实际服务器的LAN交换机没有限速,那么,使用LVS-DR理论上可以达到20Mbps的最大出口宽带,因为它的实际服务器的响应数据包可以不经过调度器而直接发往用户端啊,所以它与调度器的出口宽带没有关系,只能自身的有关系。而如果使用LVS-NAT,集群只能最大使用10Mbps的宽带。所以,越是响应数据包远远超过请求数据包的服务,就越应该降低调度器转移请求的开销,也就越能提高整体的扩展能力,最终也就越依赖于WAN出口宽带。

 

总的来说,LVS-DR适合搭建可扩展的负载均衡系统,不论是Web服务器还是文件服务器,以及视频服务器,它都拥有出色的性能。前提是你必须为实际器购买一系列的合法IP地址。

 

六、IP隧道(LVS-TUN)

基于IP隧道的请求转发机制:将调度器收到的IP数据包封装在一个新的IP数据包中,转交给实际服务器,然后实际服务器的响应数据包可以直接到达用户端。目前Linux大多支持,可以用LVS来实现,称为LVS-TUN,与LVS-DR不同的是,实际服务器可以和调度器不在同一个WANt网段,调度器通过 IP隧道技术来转发请求到实际服务器,所以实际服务器也必须拥有合法的IP地址。

 

总体来说,LVS-DR和LVS-TUN都适合响应和请求不对称的Web服务器,如何从它们中做出选择,取决于你的网络部署需要,因为LVS-TUN可以将实际服务器根据需要部署在不同的地域,并且根据就近访问的原则来转移请求,所以有类似这种需求的,就应该选择LVS-TUN。

来自:http://blog.csdn.net/asqi1/article/details/41478111

 

 如何解决负载平衡问题

一、问题的提出

随着Internet和Intranet的高速发展,基于IP的应用越来越成为网络最普遍,最有用和甚至是必不可少的部分。许多知名的站点和ISP常常要在短时间内接受大量的访问而力不从心。这给网络的升级维护带来了一些问题:

1. 如果采用单一的服务器提供服务,很明显,存在着单点脆弱性(Single Point of Failure)。这台服务器任何部件稍有闪失,都会给服务带来问题;同时这也是昂贵的、难以扩展的方案:服务器的能力需要不断的提高,扩充内存,升级 CPU,增加硬盘…在系统维护和升级的期间,服务被迫中断;而且这种升级也有极限,总有一天,无论如何调整服务器的性能都无法满足用户的要求。

2. 如果采用服务器群,主要的缺点在于访问地址的复杂化和负载不平衡。对于每台服务器都必须有相应的唯一的IP地址,给用户的访问和网络管理带来不便;这些服务器之间的流量分配是随机的,不会考虑服务器当前的负载情况,在某些情形之下反而造成连接失败。

二、目前典型的方法

1. 使用Round-Robin DNS,将服务请求分布到不同的服务器上。此种方法运行在应用层,由于简单地将域名请求分布,并不了解正在运行的服务负载及网络链路,因此,并不能提供真正的负载平衡。Internet上最著名的负载分配方法叫 Round-Robin DNS。 Round-Robin DNS运行在域名服务器上,是用来向每一台服务器乃至每一个进程分配用户申请的软件,它可以让你配置一份 IP地址名单,然后,就可以通过域名服务器 (DNS)把申请有序地分配到机器、或以不同数字代表的进程之上。然而, Round-RobinDNS被普遍公认为一种并非完美的解决方案。因为,它无法反映出不同的机器可能拥有不同的能力 (尽管在非常有限的程度上,可通过对能力更强的机器使用多个别名来进行粗略的能力估价);它不可能作为因数记入负载水平;而且它也无法检测并避开那些已经瘫痪了的服务器。

2 使用对应用或网络敏感的DNS服务,此种方案相对第一种方案提供了更好的特征,但由于DNS的Cache机制,客户仍然不能得到真正的负载平衡。

3 使用双机备份的大型服务器系统是当前许多ICP/ISP的升级选择。但是此种方案并不能避免网络上的单点故障,而且其中的一台服务器在一般情况下处于休眠状态,增加了系统成本和管理成本。

4 使用网络层(IP)的网络流量分配设备(Director)。此种方法支持真正的负载平衡,并且提供服务的系统可通过网络连接,分布在不同的地区。但是,不同的解决方案提供的特性区别较大,如是否支持分布的网络冗余、管理是否方便等。

三、IP负载平衡方案

通过IP负载平衡产品,分配网络访问流量,协同一组服务器共同工作,对用户提供完全透明的访问通道,使高性能、高承受力且只有一个简单的访问地址的站点成为可能。

IP负载平衡机制给多服务器环境带来了两个主要的好处:

1 系统可扩缩性(Scalable)

由于Web站点和服务器群拥有越来越多的用户,硬件的升级越来越频繁,这无疑是一件令人乏味和很不经济的事情。系统在安装了负载平衡产品之后,负载平衡器可以让一簇相同或不同的服务器共同来完成一台超级服务器的工作,给系统提供了无限的升级能力,减少了系统升级的开销。负载平衡器介于服务器和用户端之间,扮演了一个智能的指挥者角色。根据当前各个服务器的工作状态和能力来分配服务器负载,使整个系统能更高效的响应用户的请求。

2 系统的容错性(Fault Tolerance)

"不间断服务"、"24x7服务"(no down time)的概念越来越受业界人士重视。IP负载平衡器实时监视各个服务器的工作状态,不分配任务给那些力不从心的服务器,这种有弹性的负载分配方式充分利用了每台服务器,使用户能得到流畅、连续的透明的服务。这也正是在线服务的最终目标。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    Keepalived+Nginx实现Web负载均衡

    ### Keepalived+Nginx 实现 Web 负载均衡 #### 一、场景需求与背景 在现代互联网架构中,随着用户量级的增长及业务复杂度的提升,单一服务器往往难以满足高并发访问的需求,同时也面临着单点故障的风险。为了解决...

    深信服负载均衡AD5.3用户手册

    - **DNS负载均衡原理**: 通过DNS服务器返回多个IP地址的方式实现负载均衡。 - **DNS负载均衡策略**: 配置DNS负载均衡的具体策略。 **7.2 DNS解析策略** - **DNS解析策略配置**: 设置DNS解析的具体策略,如轮询、...

    IIS负载均衡配置

    与硬件负载均衡器(通常在OSI模型的网络层工作)相比,ARR的优势在于能够获取更多的应用层信息,从而实现更精细的控制。 ##### 1. 基于HTTP请求的路由决策 ARR能够在应用层分析HTTP请求的各个部分(如HTTP Headers...

    Tomcat集群与负载均衡

    本文将深入探讨Tomcat集群与负载均衡的概念、原理及其实现方式,旨在帮助读者理解如何构建高可用、高并发的Web应用环境。 #### 二、Tomcat集群与负载均衡的核心概念 **1. 集群(Cluster)** 集群是指一组通过网络...

    F5_服务器负载均衡方案

    - 实现Web服务器的负载均衡与安全防护。 - 实现Mail服务器和FTP服务器的负载均衡。 - 提供丰富的日志记录功能,便于维护和故障排查。 - **系统性能需求** - 在高访问压力下仍能保证稳定的服务质量。 - 具备快速...

    负载均衡NLB快速配置手册

    负载均衡NLB(Network Load Balancing,网络负载均衡)是一种技术,用于在多台服务器之间分配网络流量,以确保高可用性和性能。本快速配置手册将帮助你理解NLB的基本概念,并提供步骤来配置和管理NLB服务。 一、...

    虚拟机中Lvs的负载均衡实验

    实验的目的是在虚拟机中实现 LVS 负载均衡,以提高 web 服务的可用性和性能。 三、配置 LVS Director 服务器 1. 配置 ip_forward 功能:在 director 服务器上需要开启 ip_forward 功能,以便将网络请求转发到 real...

    Nginx+Apache负载均衡

    - **`upstream`**:定义了一组后端服务器及其权重,用于实现负载均衡。 - **`proxy_pass`**:指定将请求转发给哪个后端服务器组。 - **`proxy_redirect`**:设置是否允许客户端重定向。 #### 四、Nginx 的安装与...

    tomcat负载均衡

    在Java Web应用领域,Tomcat作为一款广泛使用的开源Java Servlet容器,经常需要与其他组件如Apache等结合使用来实现负载均衡。 #### 二、负载均衡的类型 负载均衡主要分为三种类型:计算集群、工作负载集群和容错...

    nginx负载均衡配置

    #### 一、负载均衡概念与原理 负载均衡(Load Balancing)是指将网络中的工作负载分散到多个计算资源上处理的技术,旨在提高响应速度和服务质量,同时确保系统的稳定性和可靠性。在Web服务器集群场景中,通过合理...

    Nginx反向代理与负载均衡

    #### 一、Nginx 反向代理与负载均衡原理 Nginx 是一款广泛使用的高性能 HTTP 和反向代理 Web 服务器,同时也提供了 IMAP/POP3/SMTP 服务。Nginx 的核心特性之一是其高效的反向代理能力以及强大的负载均衡功能。 ##...

    第二章 Web框架的实现原理(1).docx

    ### 第二章 Web框架的实现原理 #### 一、引言 随着互联网技术的飞速发展,...其中CDN、负载均衡器、Web服务器集群、在线存储层与离线数据层之间的协同工作,以及与第三方系统的无缝对接,都是实现这一目标的关键因素。

    分布式网络环境下的负载平衡原理及算法

    ### 分布式网络环境下的负载平衡原理及算法 #### 一、引言 在互联网/内联网(Internet/Intranet)环境下,Web服务器通常被用来集成和共享资源。然而,随着连接到Web服务器的用户数量不断增加,服务器面临着过载问题...

    中软Linux负载均衡集群系统解决方案

    综上所述,中软Linux负载均衡集群系统解决方案通过LVS实现了高效、可靠的负载均衡服务。该方案不仅提高了系统的吞吐量和可用性,还极大地提升了系统的灵活性和成本效益。对于需要处理大规模并发访问的企业而言,LVS...

    LVS负载均衡

    LVS通过虚拟IP地址,将来自互联网的请求分发到后端的真实服务器上,实现服务器集群的负载均衡,提高了服务的并发处理能力和系统的可扩展性。 **二、LVS工作模式** LVS支持多种工作模式,包括: 1. **NAT(网络...

    基于Web搜索引擎的设计与实现本科毕业论文.doc

    【基于Web搜索引擎的设计与实现】 在当今信息化社会中,网络已成为获取信息的重要平台,而搜索引擎作为互联网的核心工具,它的设计与实现对于用户高效地检索所需信息至关重要。本论文旨在探讨和构建一个基于Web的...

    网络负载平衡讲解

    3. **健康检查与自动恢复**:设置定时任务对服务器进行健康检查,一旦发现某个服务器出现故障,则立即从负载均衡器中移除,等待故障排除后重新加入。 4. **DNS配置**:通过DNS配置,将域名解析到负载均衡器的IP地址...

Global site tag (gtag.js) - Google Analytics