当前位置: 首页 > 科技观察

Nginx-LVS-HAProxy负载均衡软件优缺点详解_0

时间:2023-03-12 05:56:28 科技观察

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的优点是:1.工作在网络的第7层,可以对http应用做一些分流策略,比如域名,目录结构。它的正则规则比HAProxy更加强大和灵活,这也是它目前被广泛使用的原因。Nginx受欢迎的主要原因之一,仅凭这一点,Nginx的使用场合就远远多于LVS。2、Nginx对网络稳定性的依赖非常小。理论上,能ping通就可以执行负载功能,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社区很活跃,第三方模块也很多。Nginx的缺点是:1、Nginx只能支持http、https和Email协议,适用范围较小。这是它的缺点。2、后端服务器的健康检查只支持通过端口检测,不支持通过url检测。不支持直接保留Session,可以通过ip_hash解决。LVS:利用Linux内核集群实现高性能、高可用的负载均衡服务器,具有良好的可扩展性(Scalability)、可靠性(Reliability)和可管理性(Manageability)。LVS的优点是:1.抗负载能力强,工作在网络第4层,只做分发,不产生流量。这个特性也决定了它在负载均衡软件中的最佳性能。内存和CPU资源消耗比较低。2.可配置性比较低,既是缺点也是优点。因为可以配置的东西不多,不需要太多接触,大大减少了人为出错的几率。3、工作稳定,因为它有很强的抗负载能力,有完善的双机热备方案,比如LVS+Keepalived,但是我们在项目实现中用的最多的是LVS/DR+Keepalived。4.没有流量,LVS只分发请求,流量不会从自己出去,保证了balancerIO的性能不会因为大流量而受到影响。5、适用范围比较广,因为LVS工作在4层,所以几乎可以对所有的应用做负载均衡,包括http、数据库、在线聊天室等等。LVS的缺点是:1、软件本身不支持正则表达式处理,不能做动静分离;而且现在很多网站对这方面的要求都比较强,这就是Nginx/HAProxy+Keepalived的优势所在。2、如果网站应用比较大,LVS/DR+Keepalived的实现会比较复杂,尤其是后面有WindowsServer的机器,实现、配置和维护过程会比较复杂。相对来说Nginx/HAProxy+Keepalived就简单多了。HAProxy的特点是:1.HAProxy还支持虚拟主机。2.HAProxy的优点可以补充Nginx的一些缺点,比如支持sessionretention和cookieguidance;同时支持通过获取指定的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参数'balanceurl_param'需要一个URL参数名;⑦hdr(name),表示根据HTTP请求头对每个HTTP请求进行锁定;⑧rdp-cookie(name),表示根据cookie(name)对每个TCP请求进行加锁和hash。Nginx和LVS对比总结:1.Nginx工作在网络的第7层,所以它可以对http应用本身做流量分配策略,比如对域名、目录结构等。相比之下,LVS则没有这样的功能,所以仅凭这一点,Nginx的使用场合就远远超过LVS;但是Nginx的好用的功能使得它的可调整性比LVS更高,所以经常需要摸摸摸摸,摸多了,人为出问题的概率会更大。2.Nginx对网络稳定性的依赖较小。理论上只要ping通,网页访问正常,就可以连接上Nginx。这是Nginx的一大优势!Nginx还可以区分内部和外部网络。如果是同时拥有内外网的节点,相当于单机多了一条备用线路;LVS对网络环境的依赖性比较强。目前服务器在同一网段,LVS采用direct方式分流。效果是可以保证的。另外需要注意的是,LVS需要至少再向hostingprovider申请一个ip,才能成为VisualIP。好像不能用自己的IP做VIP。做一个好的LVS管理员,真的要跟进学习很多网络通信的知识,不再是一个HTTP那么简单了。3、Nginx的安装和配置都比较简单,测试起来也很方便,因为它基本上可以把错误打印在日志里。LVS的安装、配置、测试需要很长时间;LVS非常依赖网络,很多时候配置不成功是因为网络问题而不是配置问题,解决问题会麻烦很多。.4、Nginx也能承受高负载且稳定,但负载和稳定性较差。LVS有几个层级:Nginx处理所有流量,因此受机器IO和配置限制;它自己的错误仍然是不可避免的。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。原文链接:http://www.ha97.com/5646.html