http://blog.163.com/haizai219@126/blog/static/44412555200932945350498/
1. 基本概念
※ 可扩展性(Scalability)
服务器必须具有一定的可扩展性,这是因为企业应用随着企业的发展壮大而发展,用户增多、业务扩展,服务器也应该具备一定的可扩展空间,以提供服务器处理能力。一般包括横向扩展和纵向扩展,纵向扩展通过扩展服务器硬件资源,例如CPU、内存、硬盘、网卡等来实现;横向扩展通过服务器集群技术来实现。
※ 高可用性(High Availability)
企业应用中为了保障业务的连续性,通常要求服务器得不间断地工作,持续为用户提供连续服务,可用性非常重要。对于关键应用需要任何时间都是可用的,并且要能够保证响应速度。因此这就要求服务器具有强大的处理能力,不能有单点故障,且具有一定的容错性。集群技术可以满足这一要求,通过冗余服务器或负载均衡服务器在一台服务出现故障时,其它服务器可以继续提供服务。
※ 易用性(Usability)
服务器的易用性主要体现在服务器是不是容易操作,用户导航系统是不是完善,有没有关键恢复功能等。
※ 易管理性(Manageability)
服务器的易管理性也是服务器的一个重要特性,能够做到及时发现问题,及时完成故障处理。服务器的易管理性还体现在服务器有没有智能管理系统,有没有自动报警功能,是不是有独立于系统的管理系统。
服务器标准:
SUMA:Scalability(可扩展性)、Usability(易使用性)、Manageability(易管理性)、Availability(可用性)。
RAS:Reliability(高可靠性)、Availability(高可用性)、Serviceability(高可服务性)。
※ 集群(Cluster)
是将一组独立的计算机系统通过某种机制(网络连接)有机的连接起来,组成一个松耦合的多处理器系统,部署在这些计算机系统中的应用程序可以通过网络共享内存,进行消息传送,实现进程间通信,从而实现分布式计算。 从外部来看,它们仅仅是一个系统,对外提供统一的服务。
※ 负载均衡(Load Balance)
即把负载压力根据某种算法合理分配到集群中的每一台计算机上,以减轻主服务器的压力,降低对主服务器的硬件和软件要求。
※ 失败转移(failover)
即当集群中的某个服务器出现了故障,该服务器的负载将转移到其它服务器,从而实现服务器不间断的提供高质量的服务。
集群的目的是通过负载均衡(load balance)和失败转移(failover)技术实现系统的可扩展性(scalability)和高可用性(high availability)。
2. 集群主要功能
在现有网络结构之上,负载均衡提供了一种廉价有效的方法扩展服务器带宽和增加吞吐量,加强网络数据处理能力,提高网络的灵活性和可用性。集群(Cluster)主要解决下面几个问题:
高可用性(HA):利用集群管理软件,当主服务器故障时,备份服务器能够自动接管主服务器的工作,并及时切换过去,以实现对用户的不间断服务。
高性能计算(HP):即充分利用集群中的每一台计算机的资源,实现复杂运算的并行处理,通常用于科学计算领域,比如基因分析,化学分析等。
可扩展性:即当集群服务器提供的服务不能满足客户的最大需求时,集群可以很方便的通过增加计算机来满足客户的需求。
除了以上3点,一个集群还应该对已有应用影响最小,对性能影响最小,配置与部署简单,以及运行时可监控。
3. 集群模式
服务器集群模式主要有冗余模式和负载均衡模式。冗余模式又称主/备模式,是一种不对称集群结构,有一些服务器专门用于当工作服务器出现故障时接替它们的工作。负载均衡模式是一种对称集群结构,每个服务器都承担有工作,每台服务器都相互平等,没有专门用于备用的服务器。如果一个服务器出现故障,其余服务器则会继续处理其自身所分配的应用负载,同时处理发生故障的服务器上的应用负载,具体由哪台或哪几台服务器接管,要看集群服务配置了。
4. 负载均衡
目前比较常用的负载均衡技术主要有:基于DNS的负载均衡、反向代理负载均衡、基于NAT的负载均衡。
※ 基于DNS的负载均衡
通过DNS服务中的随机名字解析来实现负载均衡,在DNS服务器中,可以为多个不同的地址配置同一个名字,而最终查询这个名字的客户机将在解析这个名字时得到其中一个地址。因此,对于同一个名字,不同的客户机会得到不同的地址,他们也就访问不同地址上的Web服务器,从而达到负载均衡的目的。
※ 反向代理负载均衡 (如Apache + JK + Tomcat组合)
使用代理服务器可以将请求转发给内部的Web服务器,让代理服务器按照某种算法将请求均匀地转发给多台内部Web服务器之一上,从而达到负载均衡的目的。这种代理方式与普通的代理方式有所不同,标准代理方式是客户使用代理访问多个外部Web服务器,而这种代理方式是多个客户使用代理访问多个内部Web服务器,因此也被称为反向代理模式。
※ 基于NAT(Network Address Translation)的负载均衡技术(如Linux Virtual
Server,简称LVS)
NAT(网络地址转换)指在内部地址和外部地址之间进行转换,以便具备内部地址的计算机能访问外部网络,而当外部网络中的计算机访问地址转换网关拥有的某一外部地址时,地址转换网关能将其转发到一个映射的内部地址上。因此如果地址转换网关能将每个连接均匀转换为不同的内部服务器地址,此后外部网络中的计算机就各自与自己转换得到的地址上服务器进行通信,从而达到负载分担的目的。
负载均衡算法主要有轮循、权重(根据服务器硬件配置的不同)和随机三种,但更好的做法是基于负载(直接查探或者服务器主动报告它们的负载)。
5. 失败转移
如果只要单纯的负载均衡,不要失败转移的话,使用纯硬件如F5已经足够,不需要软件做任何事情。但是往往系统为了高可用性,需要失败转移功能,因此还是需要负载均衡软件的协助。
负载均衡有Apache/IIS插件,Balance Servlet,硬件(四层交换机)三类,而失败转移的重点在于Session 信息的复制(Replication) 实现上,简单的分有多服务器全冗余备份,互为冗余备份,中央备份服务器三种模式。
※ 多服务器全冗余备份
Tomcat默认的集群Session复制就是多服务器全冗余备份模式,集群中的每台服务器都会备份其它服务器的Session,当一台服务器发生故障,可以失败转移到其它任意一台服务器上。由于Session的全冗余备份对性能的损害很大,对于小规模集群(推荐不超过3台)来说,这种方式很有效,大规模集群时推荐使用分组集群。
※ 互为冗余备份
Weblogic, Jboss 和 WebSphere 的主流做法。A会有B的数据,B会有C的数据,C会有A的数据,如果A出错,就会由C接替A的工作。这种做法的弊端是:要控制失败转移到备份服务器,Balancer的实现复杂度高。
如果A出错,C就要瞬时承载A、C的操作,很可能将它压垮,针对这点,Weblogic的做法是针对每个Session而不是每个Server选择备份服务器,把主备服务器A、B的名字写在用户Cookie里,如果A失效后,Balancer将用户转到服务器C,C会根据用户Cookie记录,从B那里获取会话信息。相对没有集群的方案,需要花额外的时间和内存。
※ 中央备份服务器
N+ 1模式,一个中央Server存放所有的Session,如果一台Server死了,接管的Server就从中央服务器恢复(restore)相关Session数据。可以用数据库(很多应用服务器都支持的最简单,但最慢的模式),也可以采用内存。这种方式好处是集群服务器上不需要冗余内存,可以失败转移到任意服务器,坏处就是中央服务器容易成为性能瓶颈且存在有单点故障,同时失败转移多了个恢复(restore)的步骤。
使用内存备份Session时,Tomcat/JBoss使用的JavaGroups 是一个很好的工具,它的“ Group membership protocols” and “message multicast”特性都非常有用。
另外,无论使用内存还是数据库,都需要串行化Java对象,性能损耗厉害,所以JRun 就采用了Jini架构 ,而Tangosol Coherenc ,Terracotta这些Data Grid方案都提出了自己的Session备份做法。Data Grid分布式缓存本身就是很Enterprise的功能。
6. 编写可集群的程序
1. Http Session只放能可序列化(serializable)的对象,对象不要太大,变更时要显式的设置属性。
2. 注意Cache的使用。如果每个JVM独立使用Cache,会否不一致,如果进行同步,注意开销。
3. 不能使用静态变量,如在线用户数,要搞成分布式的 Cache。
4. 外部资源如文件系统(一台机器上没有另外一台机器的文件),存成DB或者使用SAN。
5. 特别服务:如Timer服务,基于事件的服务。 |