没有合适的资源?快使用搜索试试~ 我知道了~
这本书介绍了J2EE项目中集群的原理及运用,由浅入深,把复杂的问题介绍的通俗易懂,集群少不了。
资源详情
资源评论
资源推荐
揭开 J2EE 集群的神秘面纱 http://www.fyyk.com
揭开 J2EE 集群的神秘面纱
2005 年八月
转载自
http://blog.csdn.net/esoftwind
翻译自 TSS 的文章。-- Uncover the hood of J2EE Clustering
原文:
http://www.theserverside.com/tt/articles/article.tss?l=J2EEClustering
整理:枫远雅客http://www.fyyk.com
1. 序言
越来越多的关键应用运行在 J2EE(Java 2, Enterprise Edition)中,这些诸如银行系统和账
单处理系统需要高的可用性(High Availability, HA),同 时 像 Google 和 Yahoo 这种大系统需要
大的伸缩性。高可用性和伸缩性在今天高速增长的互连接的世界的重要性已经证实了。eBay 于
1999 年 6 月停机 22 小时的事故,中断了约 230 万的拍卖,使 eBay 的股票下降了 9.2 个百分点。
J2EE 集群是用来提供高可用性和伸缩性服务,同时支持容错处理的一种流行的技术。但
是,由于 J2EE 规范缺乏对集群的支持,J2EE 供应商实现集群的方法也各异。这给 J2EE 架构师
和开发人员带来了很多困难。以下是几个常见的问题:
z 为什么带集群功能的商业 J2EE 服务器产品如此昂贵?(10 倍于不带集群功能的产品)
z 为什么基于单服务器环境构建的应用不能在集群中运行?
z 为什么应用在集群环境中运行得很慢,但在非集群环境中却快得多?
z 为什么集群的应用移植到其他服务器中失败?
理解这些限制和要素的最佳方法是学习他们的实现方式。
2. 基本术语
在我们讨论不同的集群实现之前,先谈谈几个概念。这有助于理解不同的 J2EE 集群产品
不同的设计结果和概念:
伸缩性(Scalability):
在一些大的系统中,预测最终用户的数量和行为是非常困难的,伸缩性是指系统适应不断
增长的用户数的能力。提高这种并发会话能力的一种最直观的方式就增加资源(CPU,内存,
硬盘等),集群是解决这个问题的另一种方式,它允许一组服务器组在一起,像单个服务器一
样分担处理一个繁重的任务。
高可用性(High availability):
单一服务器的解决方案并不是一个健壮方式,因为容易出现单点失效。像银行、账单处理
这样一些关键的应用程序是不能容忍哪怕是几分钟的死机。它们需要这样一些服务在任何时间
都可以访问并在可预期的合理的时间周期内有响应。集群方案通过在集群中增加的冗余的服务
器,使得在其中一台服务器失效后仍能提供服务,从而获得高的可用性。
负载均衡(Load balancing):
负载均衡是集群的一项关键技术,通过把请求分发给不同的服务器,从而获得高可用性和
较好的性能。一个负载均衡器可以是从一个简单的 Servlet 或 Plug-Ins(例如一个 Linux box 利
第 1 页 共 23 页
揭开 J2EE 集群的神秘面纱 http://www.fyyk.com
用 ipchains 来实现),到昂贵的内置 SSL 加速器的硬件。除此之外,负载均衡器还需执行一些
其他的重要任务,如“会话胶粘”让一个用户会话始终存在一个服务器上,“健康检查”用于
防止将请求分发到已失效的服务器上。有些负载均衡器也会参与我们下面将要谈到“失效转移”
过程。
容错(Fault tolerance):
高可用性意味着对数据正确性的要求不那么高。在 J2EE 集群中,当一个服务器实例失效
后,服务仍然是有效的,这是因为新的请求将被冗余服务器处理。但是,当一个请求在一个正
在失效的服务器中处理时,可能得到不正确的结果。不管有多少个错误,容错的服务应当能确
保有严格的正确的行为。
失效转移(Failover):
失效转移是集群中用来获取容错能力的另一项关键的技术。当一个结点失效后,通过选择
集群中的另一个结点,处理将会继续而不会终止。转移到另一个结点可以被显式的编码,或是
通过底层平台自动地透明地路由到另一个服务器。
等幂方法(Idempotent methods):
等幂方法是指这样一些方法:重复用相同的参数调用都能得到相同的结果。这些方法不会
影响系统状态,可以重复调用而不用担心改变系统。例如:getUsername()就是等幂的,而 deleteFile
就不是。当我们讨论 HTTP Session 失效转移和 EJB 失效转移时,它是一个重要的概念。
3. 什么是 J2EE 集群
一个天真的问题,不是吗?但我仍要用几句话和图来回答它。通常,J2EE 集群技术包括"
负载均衡"和"失效转移"。
图 1 负载均衡
如图 1 所示,负载均衡意味着有许多客户端向目标对象同时发出请求。负载均衡器在调用
者和被调用者之间,分发请求到与原始对象相同的冗余对象中。伸缩性和高可用性就是这样得
到的。
第 2 页 共 23 页
揭开 J2EE 集群的神秘面纱 http://www.fyyk.com
图 2 失效转移
如图 2 所示,失效转移与负载均衡不同。有时客户端会连续发请求到目标对象,如果请求
中间目标对象失效了,失效转移系统将检测到这次失败,并将请求重定向到另一个可用的对象。
通过这种方式可以获得容错能力。
如果你想知道更多的有关 J2EE 集群的知识,你就会问到一个基本的问题,“什么对象可
以集群?”和“在我的 J2EE 代码中哪里会发生负载均衡和失效转移呢?”。这些都是用来理
解 J2EE 集群的非常好的问题。实际上,并不是所有的对象都能被集群的,并且负载均衡和失
效转移并不是在 J2EE 代码所有地方都能发生。看看下面的例子代码:
图 3 例子代码
在 Class A 的 bussiness()方法中,instance1 可以负载均衡吗?或是当其失效,可以失效转
移到其他 B 的实例上吗?我想是不行的!对负载均衡和失效转移来说,必须要有个拦截器在调
用者和被调用者之间分发或重定向请求到不同的对象上。Class A 和 Class B 的实例是运行在一
个 JVM 中紧密耦合的,在方法调用间加入分发逻辑非常困难。
什么类型对象可以被集群?——只有那些可以被部署到分布式拓朴结构中的组件。
在我的 J2EE 代码中,什么地方会有负载均衡和失效转移?——只在你调用分布式组件的
方法时。
第 3 页 共 23 页
揭开 J2EE 集群的神秘面纱 http://www.fyyk.com
图 4 分布式对象
在如图 4 所示的分布式环境中,调用者和被调用者被分离在有明显边界的不同的运行容器
中,这个边界可以是 JVM,进程和机器。
当目标对象被客户端调用时,目标对象的功能是在容器中运行的(这就是为什么我们说它
是分布式的原因)。客户端和目标对象通过标准的网络协议通信。这些特性就为一些机制提供
了机会可以介入到方法调用之间实现负载均衡和失效转移。
如图 4,浏览器通过 HTTP 协议调用 JSP 对象,JSP 运行在 WEB 服务器中,浏览器只需要
返回结果而不关心它是怎么运行的。在上述场景中,一些东西就可以在浏览器与 WEB 服务器
之间实现负载均衡和失效转移的功能。在 J2EE 平台,分布式技术包括:JSP(Servlet),JDBC,
EJB,JNDI,JMS,WEB Service 等。负载均衡和失效转移就发生在这些分布式方法被调用时。
在后续部分我们将详细讨论这些技术。
4. WEB 层集群实现
WEB层集群是 J2EE集群的重要且基本的功能。WEB集群技术包括 WEB 负载均衡和 HTTP
Session 失效转移。
4.1. WEB 负载均衡
J2EE 提供商实现 WEB 负载均衡有许多方式。基本上,都一个负载均衡器被插入到浏览器
和 WEB 服务器之间,如下图所示。
第 4 页 共 23 页
揭开 J2EE 集群的神秘面纱 http://www.fyyk.com
图 5 WEB 负载均衡
负载均衡器可以是一台硬件,如 F5 负载均衡器,或仅仅是另一台有负载均衡 Plug-Ins 的
WEB 服务器,一个简单的带 ipchains 的 Linux box 可以很好的实现负载均衡。不管采用哪种技
术,负载均衡器都有以下特性:
z 实现负载均衡算法
当客户请求到来时,负载均衡器需要决定将如何分发到后台服务器。流行的算法是 Round-Robin、
Random 和 Weight Based。负载均衡器尽力使每台服务器实例都获得相同的负载,但是上述算法没
有一个可以获得理想的负载相同,因为它们仅仅是依据发送到特定服务器的请求的个数。一些精
密的负载均衡器实现了特殊的算法。它在分发请求之前将检测服务器的工作负载。
z 健康检测
当一台服务器失效了,负载均衡器应当检测出失效并不再将请求分发到这台服务器上。同样,它
也要检测服务器是否恢复正常,并恢复分发请求。
z 会话胶粘
几乎所有的 WEB 应用程序都有一些会话状态,可能是简单的记住用户是否登陆,或是包含你的购
物车信息。因为 HTTP 本身是无状态的,会话状态应当存在服务器的某个地方并与你当前浏览会
话相关联,这样当你下次再请求相同 WEB 应用程序的页面时可以很容易的重新获取。当负载均衡
时,最佳的选择就是将特定的浏览器会话分发到上次相同的服务器实例中,否则,应用程序可能
不能正确工作。
因为会话状态存储在特定 WEB 服务器的内存中,“会话胶粘”对于负荷均衡非常重要。
但是,如果其中某台服务器实例因为某种原因失效了(比如关机),那么这台服务器的会话状
态将要丢失。负载均衡器应当检测到这个失效并不再将请求分发给它,但这些请求的会话状态
都因为存放在失效的服务器中而丢失了所有信息,这就将导致错误。会话的失效转移因此而生。
4.2. HTTP Session 失效转移
几乎所有流行的 J2EE 供应商都在他们的集群产品中实现了 Http Session 失效转移,用来保
障当某台服务器失效后会话状态不会丢失,使客户端请求能被正确处理。如图 6 所示,当浏览
器访问有状态的 WEB 应用程序(第 1 ,2 步),这个应用程序可能在内存创建了会话对象用于
保存信息以供后面的请求使用,同时,发送给浏览器一个唯一的 HTTP Session ID 用于标识这
个会话对象(第 3 步),浏览器将这个 ID 保存 Cookie 中,并当它下次再请求同一 WEB 应用
第 5 页 共 23 页
剩余22页未读,继续阅读
daydayup121
- 粉丝: 3
- 资源: 9
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0