什么是web负载均衡
做事器集群(Cluster)使得多个做事器节点能够协同事情,根据目的地不同,做事器集群可以分为:
一样平常提到的负载均衡(Load Balance),是指实现负载均衡集群。负载均衡实现了横向扩展,避免纵向的升级换代。本文中的web负载均衡,特指能够分担web要求(http,https等)的负载均衡技能。

基本事理
任何的负载均衡技能都要想办法建立某种一对多的映射机制: 一个要求的入口映射到多个处理要求的节点,从而实现分而治之(Divide and Conquer)。
这种映射机制使得多个物理存在对外表示为一个虚拟的整体,对做事的要求者屏蔽了内部的构造。
采取不同的机制建立映射关系,可以形身分歧的负载均衡技能,常见的包括:a)DNS轮询、b) CDN加速、c) IP负载均衡。
DNS轮询
DNS轮询是最大略的负载均衡办法。以域名作为访问入口,通过配置多条DNS A记录使得要求可以分配到不同的做事器。
DNS轮询没有快速的康健检讨机制,而且只支持WRR的调度策略导致负载很难“均衡”,常日用于哀求不高的场景。并且DNS轮询办法直接将做事器的真实地址暴露给用户,不利于做事器安全。
DNS负载均衡技能的实现事理是在DNS做事器中为同一个主机名配置多个IP地址,在应答DNS查询时,DNS做事器对每个查询将以DNS文件中主机记录的IP地址按顺序返回不同的解析结果,将客户真个访问勾引到不同的机器上去,使得不同的客户端访问不同的做事器,从而达到负载均衡的目的。
最早的负载均衡技能是通过DNS来实现的,在DNS中为多个地址配置同一个名字,因而查询这个名字的客户机将得到个中一个地址,从而使得不同的客户访问不同的做事器,达到负载均衡的目的。
DNS负载均衡是一种大略而有效的方法,但是它不能区分做事器的差异,也不能反响做事器确当前运行状态。
CDN
CDN(Content Delivery Network,内容分发网络)。通过发布机制将内容同步到大量的缓存节点,并在DNS做事器上进行扩展, 找到里用户最近的缓存节点作为做事供应节点。
由于很难自建大量的缓存节点,以是常日利用CDN运营商的做事。目前海内的做事商很少,而且按流量计费,价格也比较昂贵。
IP负载均衡
IP负载均衡是基于特定的TCP/IP技能实现的负载均衡,比如NAT、DR、Tunneling等是最常常利用的办法。
IP负载均衡可以利用硬件设备,也可以利用软件实现。硬件设备的紧张产品是F5-BIG-IP-GTM(简称F5), 软件产品紧张有LVS、HAProxy、NginX。个中LVS、HAProxy可以事情在4-7层,NginX事情在7层。
硬件负载均衡设备可以将核心部分做成芯片,性能和稳定性更好,而且商用产品的可管理性、文档和做事都比较好。唯一的问题便是价格。
软件负载均衡常日是开源软件。自由度较高,但学习本钱和管理本钱会比较大。
当一个Web系统从日访问量10万逐步增长到1000万,乃至超过1亿的过程中,Web系统承受的压力会越来越大,在这个过程中,我们会碰着很多的问题。为理解决这些性能压力带来问题,我们须要通过搭建不同的做事和架构来办理。
当单机容量达到极限时,我们须要考虑业务拆分和分布式支配,来办理大型网站访问量大,并发量高,海量数据的问题。从单机到分布式,很主要的差异是业务拆分和分布式支配,将运用拆分后,支配到不同的机器上,实现大规模分布式系统。
分布式和业务拆分解决了,从集中到分布的问题,但是每个支配的独立业务还存在单点的问题和访问统一入口问题,为办理单点故障,我们可以采纳冗余的办法。将相同的运用支配到多台机器上。办理访问统一入口问题,我们可以在集群前面增加负载均衡设备,实现流量分发。
Web负载均衡(Load Balancing)
大略地说便是将负载(事情任务,访问要求)进行平衡、分摊到多个操作单元(做事器,组件)上进行实行。对付保护处于后真个Web做事器来说,非常主要,是办理高性能,单点故障(高可用),扩展性(水平伸缩)的终极办理方案。
负载均衡的策略有很多,我们从大略的讲起哈。
1、HTTP负载均衡
当用户发来要求的时候,Web做事器通过修正HTTP相应头中的Location标记来返回一个新的url,然后浏览器再连续要求这个新url,实际上便是页面重定向。通过重定向,来达到“负载均衡”的目标。例如,我们不才载PHP源码包的时候,点击下载链接时,为理解决不同国家和地域下载速率的问题,它会返回一个离我们近的下载地址。重定向的HTTP返回码是302,如下图:
如果利用PHP代码来实现这个功能,办法如下:
这个重定向非常随意马虎实现,并且可以自定义各种策略。但是,在大规模访问量下,性能不佳。而且,给用户的体验也不好,实际要求发生重定向,增加了网络延时。
2、反向代理负载均衡
参考:反向代理-银行系统利用,在防火墙表面放代理做事器,在防火墙里面放上真正的内容做事器
反向代理做事的核心事情紧张是转发HTTP要求,扮演了浏览器端和后台Web做事器中转的角色。由于它事情在HTTP层(运用层),也便是网络七层构造中的第七层,因此也被称为“七层负载均衡”。可以做反向代理的软件很多,比较常见的一种是Nginx。
Nginx是一种非常灵巧的反向代理软件,可以自由定制化转发策略,分配做事器流量的权重等。反向代理中,常见的一个问题,便是Web做事器存储的session数据,由于一样平常负载均衡的策略都是随机分配要求的。
同一个登任命户的要求,无法担保一定分配到相同的Web机器上,会导致无法找到session的问题。办理方案紧张有两种:
a) 配置反向代理的转发规则,让同一个用户的要求一定落到同一台机器上(通过剖析cookie),繁芜的转发规则将会花费更多的CPU,也增加了代理做事器的包袱。b) 将session这类的信息,专门用某个独立做事来存储,例如redis/memchache,这个方案是比较推举的。反向代理做事,也是可以开启缓存的,如果开启了,会增加反向代理的包袱,须要谨慎利用。这种负载均衡策略实现和支配非常大略,而且性能表现也比较好。但是,它有“单点故障”的问题,如果挂了,会带来很多的麻烦。而且,到了后期Web做事器连续增加,它本身可能成为系统的瓶颈。
3、DNS负载均衡
DNS(Domain Name System)卖力域名解析的做事,域名url实际上是做事器的别名,实际映射是一个IP地址,解析过程,便是DNS完成域名到IP的映射。而一个域名是可以配置成对应多个IP的。因此,DNS也就可以作为负载均衡做事。
这种负载均衡策略,配置大略,性能极佳。但是,不能自由定义规则,而且,变更被映射的IP或者机器故障时很麻烦,还存在DNS生效延迟的问题。
4、CDN内容分发网络 (DNS /GSLB负载均衡)
参考:CDN加速-内容分发网络。我们常用的CDN(内容分发网络)实现办法,实在便是在同一个域名映射为多IP的根本上更进一步,通过GSLB(Global Server Load Balance,全局负载均衡)按照指定规则映射域名的IP。一样平常情形下都是按照地理位置,将离用户近的IP返回给用户,减少网络传输中的路由节点之间的跳跃花费。
图中的“向上探求”,实际过程是LDNS(Local DNS)先向根域名做事(Root Name Server)获取到顶级根的Name Server(例如.com的),然后得到指定域名的授权DNS,然后再得到实际做事器IP。
CDN在Web系统中,一样平常情形下是用来办理大小较大的静态资源(html/Js/Css/图片等)的加载问题,让这些比较依赖网络下载的内容,尽可能离用户更近,提升用户体验。
例如,我访问了一张imgcache.gtimg.cn上的图片(腾讯的自建CDN,不该用qq.com域名的缘故原由是防止http要求的时候,带上了多余的cookie信息),我得到的IP是183.60.217.90。
这种办法,和前面的DNS负载均衡一样,不仅性能极佳,而且支持配置多种策略。但是,搭建和掩护本钱非常高。互联网一线公司,会自建CDN做事,中小型公司一样平常利用第三方供应的CDN。
IP负载均衡IP负载均衡做事是事情在网络层(修正IP)和传输层(修正端口,第四层),比起事情在运用层(第七层)性能要赶过非常多。事理是,他是对IP层的数据包的IP地址和端口信息进行修正,达到负载均衡的目的。这种办法,也被称为“四层负载均衡”。常见的负载均衡办法,是LVS(Linux Virtual Server,Linux虚拟做事),通过IPVS(IP Virtual Server,IP虚拟做事)来实现。
在负载均衡做事器收到客户真个IP包的时候,会修正IP包的目标IP地址或端口,然后原封不动地投递到内部网络中,数据包会流入到实际Web做事器。实际做事器处理完成后,又会将数据包投递回给负载均衡做事器,它再修正目标IP地址为用户IP地址,终极回到客户端。
上述的办法叫LVS-NAT,除此之外,还有LVS-RD(直接路由),LVS-TUN(IP隧道),三者之间都属于LVS的办法,但是有一定的差异,篇幅问题,不赘叙。
IP负载均衡的性能要赶过Nginx的反向代理很多,它只处理到传输层为止的数据包,并不做进一步的组包,然后直接转发给实际做事器。不过,它的配置和搭建比较繁芜。