服务器集负载均衡(F5、Array、Nginx、LVS、HAProxy)区别以及选型
PS:Nginx/LVS/HAProxy是⽬前使⽤最⼴泛的三种负载均衡软件,本⼈都在多个项⽬中实施过,参考了⼀些资料,结合⾃⼰的⼀些使⽤经验,总结⼀下。
⼀般对负载均衡的使⽤是随着⽹站规模的提升根据不同的阶段来使⽤不同的技术。具体的应⽤需求还得具体分析,如果是中⼩型的Web应⽤,⽐如⽇PV⼩于1000万,⽤Nginx就完全可以了;如果机器不少,可以⽤DNS轮询,LVS所耗费的机器还是⽐较多的;⼤型⽹站或重要的服务,且服务器⽐较多时,可以考虑⽤LVS。
⼀种是通过硬件来进⾏进⾏,常见的硬件有⽐较昂贵的F5和Array等商⽤的负载均衡器,它的优点就是有专业的维护团队来对这些服务进⾏维护、缺点就是花销太⼤,所以对于规模较⼩的⽹络服务来说暂时还没有需要使⽤;另外⼀种就是类似于Nginx/LVS/HAProxy的基于Linux的开源免费的负载均衡软件,这些都是通过软件级别来实现,所以费⽤⾮常低廉。
⽬前关于⽹站架构⼀般⽐较合理流⾏的架构⽅案:Web前端采⽤Nginx/HAProxy+Keepalived作负载均衡器;后端采⽤MySQL数据库⼀主多从和读写分离,采⽤LVS+Keepalived的架构。当然要根据项⽬具体需求制定⽅案。
下⾯说说各⾃的特点和适⽤场合。
⼀、Nginx
Nginx的优点是:
1、⼯作在⽹络的7层之上,可以针对http应⽤做⼀些分流的策略,⽐如针对域名、⽬录结构,它的正则规则⽐HAProxy更为强⼤和灵活,这也是它⽬前⼴泛流⾏的主要原因之⼀,Nginx单凭这点可利⽤的场合就远多于LVS了。
2、Nginx对⽹络稳定性的依赖⾮常⼩,理论上能ping通就就能进⾏负载功能,这个也是它的优势之⼀;相反LVS对⽹络稳定性依赖⽐较⼤,这点本⼈深有体会;
3、Nginx安装和配置⽐较简单,测试起来⽐较⽅便,它基本能把错误⽤⽇志打印出来。LVS的配置、测试就要花⽐较长的时间了,LVS对⽹络依赖⽐较⼤。
3、可以承担⾼负载压⼒且稳定,在硬件不差的情况下⼀般能⽀撑⼏万次的并发量,负载度⽐LVS相对⼩些。
4、Nginx可以通过端⼝检测到服务器内部的故障,⽐如根据服务器处理⽹页返回的状态码、超时等等,并且会把返回错误的请求重新提交到另⼀个节点,不过其中缺点就是不⽀持url来检测。⽐如⽤户正在上传⼀个⽂件,⽽处理该上传的节点刚好在上传过程中出现故障,Nginx 会把上传切到另⼀台服
务器重新处理,⽽LVS就直接断掉了,如果是上传⼀个很⼤的⽂件或者很重要的⽂件的话,⽤户可能会因此⽽不满。
5、Nginx不仅仅是⼀款优秀的负载均衡器/反向代理软件,它同时也是功能强⼤的Web应⽤服务器。LNMP也是近⼏年⾮常流⾏的web架构,在⾼流量的环境中稳定性也很好。
6、Nginx现在作为Web反向加速缓存越来越成熟了,速度⽐传统的Squid服务器更快,可以考虑⽤其作为反向代理加速器。
7、Nginx可作为中层反向代理使⽤,这⼀层⾯Nginx基本上⽆对⼿,唯⼀可以对⽐Nginx的就只有lighttpd了,不过lighttpd⽬前还没有做到Nginx完全的功能,配置也不那么清晰易读,社区资料也远远没Nginx活跃。
8、Nginx也可作为静态⽹页和图⽚服务器,这⽅⾯的性能也⽆对⼿。还有Nginx社区⾮常活跃,第三⽅模块也很多。
淘宝的前端使⽤的Tengine就是基于nginx做的⼆次开发定制版。
Nginx常规的HTTP请求和响应流程图:
Nginx的缺点是:
nginx部署前端项目1、Nginx仅能⽀持http、https和Email协议,这样就在适⽤范围上⾯⼩些,这个是它的缺点。
2、对后端服务器的健康检查,只⽀持通过端⼝来检测,不⽀持通过url来检测。不⽀持Session的直接保持,但能通过ip_hash来解决。
⼆、LVS
LVS:使⽤Linux内核集实现⼀个⾼性能、⾼可⽤的负载均衡服务器,它具有很好的可伸缩性(Scalability)、可靠性(Reliability)和可管理性(Manageability)。
LVS的优点是:
1、抗负载能⼒强、是⼯作在⽹络4层之上仅作分发之⽤,没有流量的产⽣,这个特点也决定了它在负载均衡软件⾥的性能最强的,对内存和cpu资源消耗⽐较低。
2、配置性⽐较低,这是⼀个缺点也是⼀个优点,因为没有可太多配置的东西,所以并不需要太多接触,⼤⼤减少了⼈为出错的⼏率。
3、⼯作稳定,因为其本⾝抗负载能⼒很强,⾃⾝有完整的双机热备⽅案,如LVS+Keepalived,不过我们在项⽬实施中⽤得最多的还是LVS/DR+Keepalived。
4、⽆流量,LVS只分发请求,⽽流量并不从它本⾝出去,这点保证了均衡器IO的性能不会收到⼤流量的影响。
5、应⽤范围⽐较⼴,因为LVS⼯作在4层,所以它⼏乎可以对所有应⽤做负载均衡,包括http、数据库、室等等。
LVS DR(Direct Routing)模式的⽹络流程图:
LVS的缺点是:
1、软件本⾝不⽀持正则表达式处理,不能做动静分离;⽽现在许多⽹站在这⽅⾯都有较强的需求,这个是Nginx/HAProxy+Keepalived 的优势所在。
2、如果是⽹站应⽤⽐较庞⼤的话,LVS/DR+Keepalived实施起来就⽐较复杂了,特别后⾯有Windows Server的机器的话,如果实施及配置还有维护过程就⽐较复杂了,相对⽽⾔,Nginx/HAProxy+Keepalived就简单多了。
三、HAProxy
HAProxy的特点是:
1、HAProxy也是⽀持虚拟主机的。
2、HAProxy的优点能够补充Nginx的⼀些缺点,⽐如⽀持Session的保持,Cookie的引导;同时⽀持通过获取指定的url来检测后端服务器的状态。
3、HAProxy跟LVS类似,本⾝就只是⼀款负载均衡软件;单纯从效率上来讲HAProxy会⽐Nginx有更出⾊的负载均衡速度,在并发处理上也是优于Nginx的。
4、HAProxy⽀持TCP协议的负载均衡转发,可以对MySQL读进⾏负载均衡,对后端的MySQL节点进⾏检测和负载均衡,⼤家可以⽤LVS+Keepalived对MySQL主从做负载均衡。
5、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对⽐的总结:
1、Nginx⼯作在⽹络的7层,所以它可以针对http应⽤本⾝来做分流策略,⽐如针对域名、⽬录结构等,相⽐之下LVS并不具备这样的功能,所以Nginx单凭这点可利⽤的场合就远多于LVS了;但Nginx有⽤的这些功能使其可调整度要⾼于LVS,所以经常要去触碰触碰,触碰多了,⼈为出问题的⼏率也就会⼤。
2、Nginx对⽹络稳定性的依赖较⼩,理论上只要ping得通,⽹页访问正常,Nginx就能连得通,这是Nginx的⼀⼤优势!Nginx同时还能区分内外⽹,如果是同时拥有内外⽹的节点,就相当于单机拥有了备份线路;LVS就⽐较依赖于⽹络环境,⽬前来看服务器在同⼀⽹段内并且LVS使⽤direct⽅式分流,效果较能得到保证。另外注意,LVS需要向托管商⾄少申请多⼀个ip来做Visual IP,貌似是不能⽤本⾝的IP来做VIP的。要做好LVS管理员,确实得跟进学习很多有关⽹络通信⽅⾯的知识,就不再是⼀个HTTP那么简单了。
3、Nginx安装和配置⽐较简单,测试起来也很⽅便,因为它基本能把错误⽤⽇志打印出来。LVS的安装和配置、测试就要花⽐较长的时间了;LVS对⽹络依赖⽐较⼤,很多时候不能配置成功都是因为⽹络问题⽽不是配置问题,出了问题要解决也相应的会⿇烦得多。
4、Nginx也同样能承受很⾼负载且稳定,但负载度和稳定度差LVS还有⼏个等级:Nginx处理所有流量所以受限于机器IO和配置;本⾝的bug也还是难以避免的。
5、Nginx可以检测到服务器内部的故障,⽐如根据服务器处理⽹页返回的状态码、超时等等,并且会把返回错误的请求重新提交到另⼀个节点。⽬前LVS中 ldirectd也能⽀持针对服务器内部的情况来监控,但LVS的原理使其不能重发请求。⽐如⽤户正在上传⼀个⽂件,⽽处理该上传的节点刚好在上传过程中出现故障,Nginx会把上传切到另⼀台服务器重新处理,⽽LVS就直接断掉了,如果是上传⼀个很⼤的⽂件或者很重要的⽂件的话,⽤户可能会因此⽽恼⽕。
6、Nginx对请求的异步处理可以帮助节点服务器减轻负载,假如使⽤apache直接对外服务,那么出现很多的窄带链接时apache服务器将会占⽤⼤ 量内存⽽不能释放,使⽤多⼀个Nginx做apache代理的话,这些窄带链接会被Nginx挡住,apache上就不会堆积过多的请求,这样就减少了相当多的资源占⽤。这点使⽤squid也有相同的作⽤,即使squid本⾝配置为不缓存,对apache还是有很⼤帮助的。
7、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。
原⽂地址:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。