目前还没有做lvs的配置,仅是因为见过很多框架设计中使用到了,顺带做一些记录

 

 

负载均衡对比:

        LVS 4层(tcp)负载均衡,转发,DR模式为主要场景

        优点:数据包返回可以不经过LB,因此高效,几十万并发

        缺点:需要配置RS,所以部署复杂,功能单一。

 

        Nginx 7层,负载均衡(反向代理),1.9以后支持4层

        缺点:效率不太高,1-5万并发,数据包来去都要经过负载均衡器

        优点:简单,方便,不需要配置RS,支持基于URL,扩展名等的调度功能,可以做web和cache

 

 

功能对比

  1. nginx工作在网络的7层,所以它可以针对http应用本身来做分流策略,比如针对域名、目录结构等,相比之下lvs并不具备这样的功能
  2. nginx对网络的依赖较小,理论上只要ping得通,网页访问正常,nginx就能连得通,nginx同时还能区分内外网,如果是同时拥有内外网的 节点,就相当于单机拥有了备份线路;lvs就比较依赖于网络环境,目前来看服务器在同一网段内并且lvs使用direct方式分流,效果较能得到保证。另 外注意,lvs需要向托管商至少申请多一个ip来做Visual IP,貌似是不能用本身的IP来做VIP的。
  3. nginx安装和配置比较简单,测试起来也很方便,因为它基本能把错误用日志打印出来。lvs的安装和配置、测试就要花比较长的时间了,因为同上所述,lvs对网络依赖比较大,很多时候不能配置成功都是因为网络问题而不是配置问题,出了问题要解决也相应的会麻烦得多。
  4. nginx也同样能承受很高负载且稳定,但负载度和稳定度差lvs还有几个等级:nginx处理所有流量所以受限于机器IO和配置;本身的bug也还是难以避免的;nginx没有现成的双机热备方案,所以跑在单机上还是风险较大,单机上的事情全都很难说。
  5. nginx可以检测到服务器内部的故障,比如根据服务器处理网页返回的状态码、超时等等,并且会把返回错误的请求重新提交到另一个节点。目前lvs中 ldirectd也能支持针对服务器内部的情况来监控,但lvs的原理使其不能重发请求。重发请求这点,譬如用户正在上传一个文件,而处理该上传的节点刚 好在上传过程中出现故障,nginx会把上传切到另一台服务器重新处理,而lvs就直接断掉了,如果是上传一个很大的文件或者很重要的文件的话,用户可能 会因此而恼火。
  6. nginx对请求的异步处理可以帮助节点服务器减轻负载,假如使用apache直接对外服务,那么出现很多的窄带链接时apache服务器将会占用大 量内存而不能释放,使用多一个nginx做apache代理的话,这些窄带链接会被nginx挡住,apache上就不会堆积过多的请求,这样就减少了相 当多的内存占用。这点使用squid也有相同的作用,即使squid本身配置为不缓存,对apache还是有很大帮助的。lvs没有这些功能,也就无法能 比较。

 

功能分析

        工作在四层的lvs只能通过修改tcp的目标,源地址和目标,源端头实现分流策略。在lvs上是无法实现tcp握手,也就不存在http请求和回复的概念。

 

        进一步分析,客户端的tcp流量经lvs,经过lvs内核修改,tcp完成了目标地址和端口的修改,并流过lvs服务器(此时lvs服务器就像路由器一样,将tcp转发了,两者不存在关系了),直到达到后端的目标服务器,完成一次通讯并返回,因为在这个流程后tcp的源地址没有变,因此lvs服务器不需要做太多的改动,直接将tcp包还给了客户端。

        同样分析nginx,当客户端的请求到达nginx后,nginx会维持一个tcp连接A不断开,同时另开一个tcp请求B,将客户端的请求转发给后端服务器。nginx能够处理大量的服务请求是因为,nginx做反向代理时,采用的是异步请求,nginx与客户端之间tcp连接A一直等待,nginx继续与其他客户端建立新的连接,同时当nginx与后端服务器完成通讯后(反向代理),会将这个请求结果返回给客户端。

        对比分析,我们可以知道,lvs是同步的,nginx是异步的。lvs上的tcp连接流过即结束,而nginx上的连接需要同时维护与客户端与服务器的tcp连接,另外lvs在将消息返回给客户端时,可以认为是直接将消息返回给客户端。所以在大量并打请求的条件下,需要采用lvs+nginx的结构