PS:Nginx/LVS/HAProxy是目前使用最普遍的三种负载均衡软件,本人都在多个项目中实施过,参考了一些资料,结合本身的一些使用经验,总结一下。 前端
通常对负载均衡的使用是随着网站规模的提高根据不一样的阶段来使用不一样的技术。具体的 应用需求还得具体分析,若是是中小型的Web应用,好比日PV小于1000万,用Nginx就彻底能够了;若是机器很多,能够用DNS轮询,LVS所耗费 的机器仍是比较多的;大型网站或重要的服务,且服务器比较多时,能够考虑用LVS。 mysql
一种是经过硬件来进行进行,常见的硬件有比较昂贵的F5和Array等商用的负载均衡器,它的优势就是有专业的维护团队来对这些服务进行维护、缺点 就是花销太大,因此对于规模较小的网络服务来讲暂时尚未须要使用;另一种就是相似于Nginx/LVS/HAProxy的基于Linux的开源免费的负载均衡软件,这些都是经过软件级别来实现,因此费用很是低廉。 linux
目前关于网站架构通常比较合理流行的架构方案:Web前端采用Nginx/HAProxy+Keepalived做负载均衡器;后端采用MySQL数据库一主多从和读写分离,采用LVS+Keepalived的架构。固然要根据项目具体需求制定方案。
下面说说各自的特色和适用场合。 nginx
Nginx的优势是: web
一、工做在网络的7层之上,能够针对http应用作一些分流的策略,好比针对域名、目录结构,它的正则规则比HAProxy更为强大和灵活,这也是它目前普遍流行的主要缘由之一,Nginx单凭这点可利用的场合就远多于LVS了。
二、Nginx对网络稳定性的依赖很是小,理论上能ping通就就能进行负载功能,这个也是它的优点之一;相反LVS对网络稳定性依赖比较大,这点本人深有体会;
三、Nginx安装和配置比较简单,测试起来比较方便,它基本能把错误用日志打印出来。LVS的配置、测试就要花比较长的时间了,LVS对网络依赖比较大。
三、能够承担高负载压力且稳定,在硬件不差的状况下通常能支撑几万次的并发量,负载度比LVS相对小些。
四、Nginx能够经过端口检测到服务器内部的故障,好比根据服务器处理网页返回的状态码、超时等等,而且会把返回错误的请求从新提交到另外一个节点,不过 其中缺点就是不支持url来检测。好比用户正在上传一个文件,而处理该上传的节点恰好在上传过程当中出现故障,Nginx会把上传切到另外一台服务器从新处 理,而LVS就直接断掉了,若是是上传一个很大的文件或者很重要的文件的话,用户可能会所以而不满。
五、Nginx不只仅是一款优秀的负载均衡器/反向代理软件,它同时也是功能强大的Web应用服务器。LNMP也是近几年很是流行的web架构,在高流量的环境中稳定性也很好。
六、Nginx如今做为Web反向加速缓存愈来愈成熟了,速度比传统的Squid服务器更快,能够考虑用其做为反向代理加速器。
七、Nginx可做为中层反向代理使用,这一层面Nginx基本上无对手,惟一能够对比Nginx的就只有lighttpd了,不过lighttpd目前尚未作到Nginx彻底的功能,配置也不那么清晰易读,社区资料也远远没Nginx活跃。
八、Nginx也可做为静态网页和图片服务器,这方面的性能也无对手。还有Nginx社区很是活跃,第三方模块也不少。 正则表达式
Nginx的缺点是: 算法
一、Nginx仅能支持http、https和Email协议,这样就在适用范围上面小些,这个是它的缺点。
二、对后端服务器的健康检查,只支持经过端口来检测,不支持经过url来检测。不支持Session的直接保持,但能经过ip_hash来解决。 sql
LVS:使用Linux内核集群实现一个高性能、高可用的负载均衡服务器,它具备很好的可伸缩性(Scalability)、可靠性(Reliability)和可管理性(Manageability)。 数据库
LVS的优势是: apache
一、抗负载能力强、是工做在网络4层之上仅做分发之用,没有流量的产生,这个特色也决定了它在负载均衡软件里的性能最强的,对内存和cpu资源消耗比较低。
二、配置性比较低,这是一个缺点也是一个优势,由于没有可太多配置的东西,因此并不须要太多接触,大大减小了人为出错的概率。
三、工做稳定,由于其自己抗负载能力很强,自身有完整的双机热备方案,如LVS+Keepalived,不过咱们在项目实施中用得最多的仍是LVS/DR+Keepalived。
四、无流量,LVS只分发请求,而流量并不从它自己出去,这点保证了均衡器IO的性能不会收到大流量的影响。
五、应用范围比较广,由于LVS工做在4层,因此它几乎能够对全部应用作负载均衡,包括http、数据库、在线聊天室等等。
LVS的缺点是:
一、软件自己不支持正则表达式处理,不能作动静分离;而如今许多网站在这方面都有较强的需求,这个是Nginx/HAProxy+Keepalived的优点所在。
二、若是是网站应用比较庞大的话,LVS/DR+Keepalived实施起来就比较复杂了,特别后面有Windows Server的机器的话,若是实施及配置还有维护过程就比较复杂了,相对而言,Nginx/HAProxy+Keepalived就简单多了。
HAProxy的特色是:
一、HAProxy也是支持虚拟主机的。
二、HAProxy的优势可以补充Nginx的一些缺点,好比支持Session的保持,Cookie的引导;同时支持经过获取指定的url来检测后端服务器的状态。
三、HAProxy跟LVS相似,自己就只是一款负载均衡软件;单纯从效率上来说HAProxy会比Nginx有更出色的负载均衡速度,在并发处理上也是优于Nginx的。
四、HAProxy支持TCP协议的负载均衡转发,能够对MySQL读进行负载均衡,对后端的MySQL节点进行检测和负载均衡,你们能够用LVS+Keepalived对MySQL主从作负载均衡。
五、HAProxy负载均衡策略很是多,HAProxy的负载均衡算法如今具体有以下8种:
① roundrobin,表示简单的轮询,这个很少说,这个是负载均衡基本都具有的;
② static-rr,表示根据权重,建议关注;
③ leastconn,表示最少链接者先处理,建议关注;
④ source,表示根据请求源IP,这个跟Nginx的IP_hash机制相似,咱们用其做为解决session问题的一种方法,建议关注;
⑤ ri,表示根据请求的URI;
⑥ rl_param,表示根据请求的URl参数’balance url_param’ requires an URL parameter name;
⑦ hdr(name),表示根据HTTP请求头来锁定每一次HTTP请求;
⑧ rdp-cookie(name),表示根据据cookie(name)来锁定并哈希每一次TCP请求。
Nginx和LVS对比的总结:
一、Nginx工做在网络的7层,因此它能够针对http应用自己来作分流策略,好比针对域名、目录结构等,相比之下LVS并不具有这样的功能,因此 Nginx单凭这点可利用的场合就远多于LVS了;但Nginx有用的这些功能使其可调整度要高于LVS,因此常常要去触碰触碰,触碰多了,人为出问题的 概率也就会大。
二、Nginx对网络稳定性的依赖较小,理论上只要ping得通,网页访问正常,Nginx就能连得通,这是Nginx的一大优点!Nginx同时还能区 份内外网,若是是同时拥有内外网的节点,就至关于单机拥有了备份线路;LVS就比较依赖于网络环境,目前来看服务器在同一网段内而且LVS使用 direct方式分流,效果较能获得保证。另外注意,LVS须要向托管商至少申请多一个ip来作Virtual IP,貌似是不能用自己的IP来作VIP的。要作好LVS管理员,确实得跟进学习不少有关网络通讯方面的知识,就再也不是一个HTTP那么简单了。
三、Nginx安装和配置比较简单,测试起来也很方便,由于它基本能把错误用日志打印出来。LVS的安装和配置、测试就要花比较长的时间了;LVS对网络依赖比较大,不少时候不能配置成功都是由于网络问题而不是配置问题,出了问题要解决也相应的会麻烦得多。
四、Nginx也一样能承受很高负载且稳定,但负载度和稳定度差LVS还有几个等级:Nginx处理全部流量因此受限于机器IO和配置;自己的bug也仍是难以免的。
五、Nginx能够检测到服务器内部的故障,好比根据服务器处理网页返回的状态码、超时等等,而且会把返回错误的请求从新提交到另外一个节点。目前LVS中 ldirectd也能支持针对服务器内部的状况来监控,但LVS的原理使其不能重发请求。好比用户正在上传一个文件,而处理该上传的节点恰好在上传过程当中 出现故障,Nginx会把上传切到另外一台服务器从新处理,而LVS就直接断掉了,若是是上传一个很大的文件或者很重要的文件的话,用户可能会所以而恼火。
六、Nginx对请求的异步处理能够帮助节点服务器减轻负载,假如使用apache直 接对外服务,那么出现不少的窄带连接时apache服务器将会占用大 量内存而不能释放,使用多一个Nginx作apache代理的话,这些窄带连接会被Nginx挡住,apache上就不会堆积过多的请求,这样就减小了相 当多的资源占用。这点使用squid也有相同的做用,即便squid自己配置为不缓存,对apache仍是有很大帮助的。
七、Nginx能支持http、https和email(email的功能比较少用),LVS所支持的应用在这点上会比Nginx更多。在使用上,通常最 前端所采起的策略应是LVS,也就是DNS的指向应为LVS均衡器,LVS的优势令它很是适合作这个任务。重要的ip地址,最好交由LVS托管,好比数据 库的 ip、webservice服务器的ip等等,这些ip地址随着时间推移,使用面会愈来愈大,若是更换ip则故障会接踵而至。因此将这些重要ip交给 LVS托管是最为稳妥的,这样作的惟一缺点是须要的VIP数量会比较多。Nginx可做为LVS节点机器使用,一是能够利用Nginx的功能,二是能够利 用Nginx的性能。固然这一层面也能够直接使用squid,squid的功能方面就比Nginx弱很多了,性能上也有所逊色于Nginx。Nginx也 可做为中层代理使用,这一层面Nginx基本上无对手,惟一能够撼动Nginx的就只有lighttpd了,不过lighttpd目前尚未能作到 Nginx彻底的功能,配置也不那么清晰易读。另外,中层代理的IP也是重要的,因此中层代理也拥有一个VIP和LVS是最完美的方案了。具体的应用还得 具体分析,若是是比较小的网站(日PV小于1000万),用Nginx就彻底能够了,若是机器也很多,能够用DNS轮询,LVS所耗费的机器仍是比较多 的;大型网站或者重要的服务,机器不发愁的时候,要多多考虑利用LVS。
如今对网络负载均衡的使用是随着网站规模的提高根据不一样的阶段来使用不一样的技术:
第一阶段:利用Nginx或HAProxy进行单点的负载均衡,这一阶段服务器规模刚脱离开单服务器、单数据库的模式,须要必定的负载均衡,可是仍 然规模较小没有专业的维护团队来进行维护,也没有须要进行大规模的网站部署。这样利用Nginx或HAproxy就是第一选择,此时这些东西上手快, 配置容易,在七层之上利用HTTP协议就能够。这时是第一选择。
第二阶段:随着网络服务进一步扩大,这时单点的Nginx已经不能知足,这时使用LVS或者商用Array就是首要选择,Nginx此时就做为LVS或者Array的节点来使用,具体LVS或Array的是选择是根据公司规模和预算来选择,Array的应用交付功能很是强大,本人在某项目中使用过,性价比也远高于F5,商用首选!可是通常来讲这阶段相关人才跟不上业务的提高,因此购买商业负载均衡已经成为了必经之路。
第三阶段:这时网络服务已经成为主流产品,此时随着公司知名度也进一步扩展,相关人才的能力以及数量也随之提高,这时不管从开发适合自身产品的定制,以及下降成原本讲开源的LVS,已经成为首选,这时LVS会成为主流。
最终造成比较理想的基本架构为:Array/LVS — Nginx/Haproxy — Squid/Varnish — AppServer。