Java EE
集群技术初探
越来越多的任务关键型与大规模应用运行在
Java EE
技术上。有的应用例如银行的或者是记费系统需要越来越高的高可用性
(HA)
,另外一些应用比如像
Google
或者是
Yahoo
则需要越来越好的可扩展性。
eBay
在
99
年的
22
小时宕机,造成
230
万笔交易的中断,影响其股价下跌
9.2%
。这个示例充分证明了高可用性和可扩展性在今天变得越来越重要。
Java EE
的集群技术是为了提供高可用和有容错能力的可扩展服务。但是由于
Java EE
缺少此方面的规范,所以
Java EE
的供应商都使用不同的技术来实现集群,为此对开发人员和架构师带来一定的问题,例如:
- 有集群功能选项的Java EE服务器为什么会那么贵?(可能比没有的要贵10倍)
- 我的程序按照标准Java EE规范编写,为何不能在集群环境下运行?
- 为何我的程序在集群环境下运行得更慢?
- 为何要移植在集群环境下的程序那么复杂?
所以,我们通过探讨
Java EE
集群环境的实现方式来理解并解决上述问题。
一些基本的概念
在真正开始探讨实现技术之前,我们先来了解一些基本的概念。了解这些概念不仅是理解
Java EE
集群技术的基础,而且勾勒出了构建集群的不同技术实现的关键点,更易于理解实现。
可扩展性
(scalability)
在一些大规模的系统中,不太好预估确切的在线用户数和他们的行为。可扩展性即指系统能够支撑用户数量激增的情况。立马能想到的提高可扩展性
(
在线并发会话
)
的办法是在服务器上增加资源
(
内存、
CPU……)
。集群技术是解决这个问题的另一途径。集群支持一组服务器从逻辑上作为单独的服务器运行,但共同分担系统负载。
高可用性
(high availability)
采用单一服务器解决方案
(
增加内存、
CPU
等
)
来解决可扩展性的问题并非完美,因为系统失败集中于一点
(
单一服务器
)
上。任务关键型的应用
(
银行的或者是计费系统
)
不能容忍哪怕只有一分钟的宕机。所以需要这些服务在任何时刻都必须可以访问。集群技术是达到这类高可用要求的解决方案,它通过在集群中提供附加的服务器来保证一旦其中的某个服务器宕机时服务的延续性。
负载均衡
(load balance)
负载均衡是集群技术中重要的一部分。通过将请求分发到不同的服务器,它提供了可同时获得高可用性和更高性能的服务的方法。简单的负载均衡器可以是一个
Servlet
或一些插件,复杂的负载均衡器可能是高级的嵌入了
SSL
加速器的硬件设备。除了分发请求之外,负载均衡器还负责执行一些重要的任务:
- “会话持久”用来确保用户会话生命周期在一台服务器上的完整性。
- “心跳”来检查失败的服务器。
- 在某些情况下,负载均衡器需要参与“失败转移”的过程,下文中会提及。
容错
(fault tolerance)
高可用环境下的数据不见得肯定是正确的数据。在
Java EE
集群中,当一个服务器实例宕机
(
以后统称
“
失败
”)
后,服务通过集群中别的服务器依然可用。但是在失败的那台服务器中正在处理的请求也许就不能获取正确的数据了。所以,容错技术可始终保证在特定的错误环境下也能执行正确的行为。
失败转移
(Failover)
失败转移是集群当中的另一项实现容错的重要技术。失败转移通过在集群中选择另一节点,将能延续失败节点上的服务。失败转移可通过代码指定或者自动通过底层平台的通信链路进行自动切换。
幂等方法
(Idempotent methods)
幂等函数,或幂等方法,是指可以使用相同参数重复执行,并能获得相同结果的函数。这些函数不会影响系统状态,也不用担心重复执行会对系统造成改变。例如,
“getUsername()”
函数就是一个幂等函数,
“deleteFile()”
函数就不是。
“
幂等
”
是
HTTP Session
和
EJB
失败转移中的一个重要概念。