浅谈web应用的负载均衡、集群、高可用(HA)解决方案

一、熟悉几个组件

1.一、apache
     —— 它是Apache软件基金会的一个开放源代码的跨平台的网页服务器,属于老牌的web服务器了,支持基于Ip或者域名的虚拟主机,支持代理服务器,支持安全Socket层(SSL)等等,目前互联网主要使用它作静态资源服务器,也能够作代理服务器转发请求(如:图片链等),结合tomcat等servlet容器处理jsp。
1.二、ngnix
     —— 俄罗斯人开发的一个高性能的 HTTP和反向代理服务器。因为Nginx 超越 Apache 的高性能和稳定性,使得国内使用 Nginx 做为 Web 服务器的网站也愈来愈多,其中包括新浪博客、新浪播客、网易新闻、腾讯网、搜狐博客等门户网站频道等,在3w以上的高并发环境下,ngnix处理能力至关于apache的10倍。
     参kao:apache和tomcat的性能分析和对比(http://blog.s135.com/nginx_php_v6/)
1.三、lvs
     —— Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。由毕业于国防科技大学的章文嵩博士于1998nian5月创立,能够实现LINUX平台下的简单负载均衡。了解更多,访问官网:http://zh.linuxvirtualserver.org/。php

1.四、HAProxycss

     —— HAProxy提供高可用性负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速而且可靠的一种解决方案。HAProxy特别适用于那些负载特大的web站点, 这些站点一般又须要会话保持或七层处理。HAProxy运行在当前的硬件上,彻底能够支持数以万计的并发链接。而且它的运行模式使得它能够很简单安全的整合进您当前的架构中, 同时能够保护你的web服务器不被暴露到网络上.
1.五、keepalived
     —— 这里说的keepalived不是apache或者tomcat等某个组件上的属性字段,它也是一个组件,能够实现web服务器的高可用(HA high availably)。它能够检测web服务器的工做状态,若是该服务器出现故障被检测到,将其剔除服务器群中,直至正常工做后,keepalive会自动检测到并加入到服务器群里面。实现主备服务器发生故障时ip瞬时无缝交接。它是LVS集群节点健康检测的一个用户空间守护进程,也是LVS的引导故障转移模块(director failover)。Keepalived守护进程能够检查LVS池的状态。若是LVS服务器池当中的某一个服务器宕机了。keepalived会经过一 个setsockopt呼叫通知内核将这个节点从LVS拓扑图中移除。
1.六、memcached
     —— 它是一个高性能分布式内存对象缓存系统。当初是Danga Interactive为了LiveJournal快速发展开发的系统,用于对业务查询数据缓存,减轻数据库的负载。其守护进程(daemon)是用C写的,可是客户端支持几乎全部语言(客户端基本上有3种版本[memcache client for java;spymemcached;xMecache]),服务端和客户端经过简单的协议通讯;在memcached里面缓存的数据必须序列化。
1.七、terracotta
     —— 是一款由美国Terracotta公司开发的著名开源Java集群平台。它在JVM与Java应用之间实现了一个专门处理集群功能的抽象层,容许用户在不改变系统代码的状况下实现java应用的集群。支持数据的持久化、session的复制以及高可用(HA)。详细参kao:http://topmanopensource.iteye.com/blog/1911679

二、关键术语
2.一、负载均衡(load balance)
 
在互联网高速发展的时代,大数据量、高并发等是互联网网站说起最多的。如何处理高并发带来的系统性能问题,最终你们都会使用负载均衡机制。它是根据某种负载策略把请求分发到集群中的每一台服务器上,让整个服务器群来处理网站的请求。
公司比较有钱的,能够购买专门负责负载均衡的硬件(如:F5),效果确定会很好。对于大部分公司,会选择廉价有效的方法扩展整个系统的架构,来增长服务器的吞吐量和处理能力,以及承载能力。

2.二、集群(Cluster)

 用N台服务器构成一个松耦合的多处理器系统(对外来讲,他们就是一个服务器),它们之间经过网络实现通讯。让N台服务器之间相互协做,共同承载一个网站的请求压力。

2.三、高可用(HA)

 在集群服务器架构中,当主服务器故障时,备份服务器可以自动接管主服务器的工做,并及时切换过去,以实现对用户的不间断服务。ps:这里我感受它跟故障转移(failover)是一个意思,看到的网友给个解释,谢谢?

2.四、session复制/共享

 在访问系统的会话过程当中,用户登陆系统后,无论访问系统的任何资源地址都不须要重复登陆,这里面servlet容易保存了该用户的会话(session)。若是两个tomcat(A、B)提供集群服务时候,用户在A-tomcat上登陆,接下来的请求web服务器根据策略分发到B-tomcat,由于B-tomcat没有保存用户的会话(session)信息,不知道其登陆,会跳转到登陆界面。
这时候咱们须要让B-tomcat也保存有A-tomcat的会话,咱们可使用tomcat的session复制实现或者经过其余手段让session共享。html

三、经常使用web集群

3.一、tomcat集群方案
 apache+tomcat;ngnix+tomcat;lvs+ngnix+tomcat;你们比较熟悉的是前两种。(lvs负责集群调度,nginx负责静态文件处理,tomcat负责动态文件处理[最优选择])。 以apache+tomcat集群为例,简单说一下:
  一、他们之间的通讯有三种方式:ajp_proxy、mod_jk连接器、http_proxy。具体参kao:http://www.ibm.com/developerworks/cn/opensource/os-lo-apache-tomcat/
  二、apache的分发策略有4种。权重(默认)、流量(bytraffic)、请求次数(byRequests)、繁忙程度(byBusyness根据活跃请求数的多少)
  三、apache支持stickysession(粘性session),即为:访问用户访问了A-tomcat,那么他的全部请求都会转发到A-tomcat,而不会到B-tomcat。[这样的负载均衡效果很差,适用于小型网站,下面说非粘性session]
  四、它们之间的架构如图1:前端


问题1:只有一个web服务器,明显的单点故障。若是该apache出现问题,整个网站就会瘫痪。java

 

3.二、session复制mysql


  若是不采用stickysession(粘性session),那么咱们能够采用tomcat的session复制使全部节点tomcat的会话相同,tomcat使用组播技术,只要集群中一个tomcat节点的session发生改变,会广播通知全部tomcat节点发生改变。

问题2:据网友测试,当tomcat节点数达到4个以上时候,集群性能呈线性下滑;另外当用户访问量大到必定程度,会话内容随之增多,tomcat节点相互之间通讯产生大量的网络消耗,产生网络阻塞,整个集群的吞吐量不能再上升。
linux


四、高可用(HA)和session共享(解决上面提到的两个问题)nginx


4.一、使用lvs+keepalive实现集群高可用,达到更健壮的LB
 咱们能够作前端使用lvs来作负载均衡,根据lvs的8种调度算法(可设置),分发请求到对应的web服务器集群上。lvs作双机热备,经过keepalived模块可以达到故障自动转移到备份服务器,不间断提供服务,结构如图2:web

 
 说明:据查询了解,通常在WEB端使用的负载均衡比较多的是HAProxy+keepalived+nginx;数据库mysql集群使用Lvs+keepalived+mysql实现。由于HAProxy和nginx同样是工做在网络7层之上,而且前者弥补了nginx的一些缺点如session的保持,cookie的引导等,且它自己是个负责均衡软件,处理负载均衡上面必然优于nginx;lvs比较笨重,对于比较庞大的网络应用实施比较复杂,虽然它运行在网络4层之上,仅作分发没有流量产生,可是它不能作正则处理也不能也不能作动静分离,因此通常用lvs+keepalived或heatbeat作数据库层的负载均衡。算法

LVS、HAProxy、Nginx作负载均衡的比较
4.二、使用terracotta或者memcached使session共享
 

 4.2.一、terracotta是jvm级别的session共享

 它基本原理是对于集群间共享的数据,当在一个节点发生变化的时候,Terracotta只把变化的部分发送给Terracotta服务器,而后由服务器把它转发给真正须要这个数据的节点,而且共享的数据对象不须要序列化。

 

4.2.二、经过memcached实现内存级session共享

经过memcached-session-manager(msm)插件,经过tomcat上必定的配置,便可实现把session存储到memcached服务器上。注意:tomcat支持tomcat6+,而且memcached能够支持分布式内存,msm同时支持黏性session(sticky sessions)或者非黏性session(non-sticky sessions)两种模式,在memcached内存中共享的对象须要序列化。结构如图3:



 

  经过必定的配置,能够实现故障转移(只支持对非粘性session)。如:

Xml代码  收藏代码

  1. <Context>    

  2.       ...    

  3.       <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"    

  4.         memcachedNodes="n1:host1.yourdomain.com:11211,n2:host2.yourdomain.com:11211"    

  5.         failoverNodes="n1"    

  6.         requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"    

  7.         transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"    

  8.         />    

  9. </Context>  

 说明:failoverNodes:故障转移节点,对非粘性session不可用。属性failoverNodes="n1"的做用是告诉msm最好是把session保存在memcached "n2"节点上,只有在n2节点不可用的状况下才把session保存在n1节点。这样即便host2上的tomcat宕机,仍然能够经过host1上的tomcat访问存放在memcached "n1" 节点中的session。
 
4.2.三、其余方案
经过cookie保存用户信息(通常是登陆信息),每个请求到达web应用的时候,web应用从cookie中取出数据进行处理(这里尽可能对cookie作加密处理);
另一种是把用户信息的关键属性保存到数据库,这样就不须要session了。请求过来从数据库查询关键属性数据,作相应处理。缺点:加大了数据库的负载,使数据库成为集群的瓶颈。

相关文章
相关标签/搜索