`

J2EE集群原理(一)【转载】

阅读更多
J2EE集群原理
什么是集群呢?总的来说,集群包括两个概念:“负载均衡”(load balancing)和“失效备援”(failover
图一:负载均衡
多个客户端同时发出请求,位于前端的负载均衡器根据特定算法,将请求分担给比较空闲的机器,从而实现较高性能和较好的扩展性
 
图二:失效备援
当客户端连续向某个服务器发出请求时,该服务器可能处理到一半就宕机了,失效备援系统能够检测出有问题的服务器,将后续的请求转发至其他可用的机器,从而实现容错功能
 
那么,哪些对象可以被集群呢,答案是:“可以被部署在分布式拓扑的组件
因此,负载均衡和失效备援会发生在哪些J2EE代码中呢?“仅当你调用分布式对象的方法时

图四:分布式对象
客户端和目标服务器不在一个JVM上,他们之间通过标准的网络协议进行通讯,这也就给集群提供了用武之地,实现集群效果的设备可以放在边界上对通讯做一些处理
J2EE的分布式技术包括:JSP,JDBC,EJB,JNDI,WEB SERVICE等等
 
网络层的集群实现
这是最常见最基本的J2EE集群功能,网络层集群技术包括:网络负载均衡和HTTP SESSION的失效备援
 
图五:网络负载均衡
 
负载均衡器可以是一个硬件设备,比如F5 Load Balancer,也可以是另外一台服务器加一个负载均衡的插件,甚至一个Linux的嵌入式设备都能胜任。通常,负载均衡包括以下几个特点:
l 实现负载均衡算法
常用的算法有:Round-Robin, Random Weight Based,算法的最终目标是尽量使每台服务器的负载达到平衡,但以上算法只是根据每台服务器接收的请求来进行均衡,因此都不能完全达到理想化的目标。有些复杂的算法可以在分发请求之前检测机器的性能,从而决定要由哪台机器来处理请求。
l 健康监测
一旦某台机器宕机了,负载均衡器要能够及时发现情况,并且将请求转交给其他可用的服务器,保证做到“failover
l Session stickiness
即是让一次session会话的请求都尽量交给一台机器处理,这样省去了服务器之间交换session数据的开销
 
HTTPSession Failover
session进行到一半时,如果服务器挂了,我们就要想办法让session在另外一台机器上继续进行,而不是让用户重新来过。下面图六解释了实现HTTPSession Failover的原理:每次的session都会分配一个唯一的id,这个idcookies的形式存放在客户端中,负载均衡器通过id分辨请求是属于哪个session的。在第四步中,服务器A以某种定义好的方式,定期将session数据保存起来,一旦出问题,负载均衡器会自动通知另一台服务器B,让它取出保存的数据,接A的班
 
图六
 
要实现以上基本功能,首先要支持以下特性:
l 全局session id
每个jvm内部都会为每次session维护一个唯一的id,但多个jvm之间的session id会不会重复就很难说了,所以负载均衡器要能够协调各个jvm,使每个session id都能全局唯一。
l 如何备份session
这个跟具体厂商有关,后面会讲到
l 备份的频度和粒度
这个事关负载均衡的性能,因为备份数据的过程直接占用cpu、网络和IO性能
 
 
数据库方式备份

这是最简单的实现方式,数据库还能在整个系统都当掉时依旧保存好session数据,可靠性高,几乎所有J2EE实现都提供了这种方式,当然,你的session数据必须是可序列化的。但是,这种方式一般推荐不要在session中存放过大过多的数据,因为数据库的事务过程相当费资源,但这样也大大限制了它的使用范围,毕竟我们有时必须要在session中存放一些大对象

 

内存拷贝方式

这种方式好处很多,首先它省去了数据库连接和事务的开销,其次由于备份的数据已经放在内存中了,也就省去了从数据库恢复的过程
 
“JavaGroup”是当前tomcat和jboss集群方案的通讯层协议,本质上是一个可靠的组间通讯和管理的toolkit,它的核心功能在于“ Group membership protocols” 和“message multicast”,用在集群上非常适合,关于JavaGroup的更多内容,请参考 http://www.jgroups.org/javagroupsnew/docs/index.html
 
Tomcat的实现:多服务器之间互相拷贝内存
 
 

虽然实现起来容易,但这种方法的弊端也显而易见,当节点增加时,拷贝量就要成倍增长,性能有时还不如不集群

 

Weblogic, Jboss WebSphere的实现:双服务器拷贝

 

 

 

虽然这种方法的性能和扩展性都很好,但也有不少弊端

l负载均衡器的复杂度加大,因为要记住每个服务器的备份者是谁

l除了处理请求外,每个服务器还得自己维护备份开销

l平时大量的内存都被用于备份数据,会增加jvm的垃圾收集频率,间接影响性能

l一旦某个服务器长时间挂掉,那么另一台服务器的负荷就会翻倍,可能也被一起拖垮

 

为了克服以上缺点,各个厂商都有自己的不同解决方案

 

 

IBM的方案:中央服务器

 

 

很像是之前的数据库方式吧,只是把数据库换成了一台专门备份的服务器,综合了数据库和内存方式的优点。

l将备份和请求处理分开,增强了系统的鲁棒性

l所有的备份数据都在专门的服务器上,节省了其他服务器的内存

l所有服务器都能存取备份机器上的数据,任何服务器宕机了,负载都能平滑的分配到剩余所有服务器上,而不至于加重某台机器的负担

l比起数据库连接,备份服务器使用的socket连接更加轻量级

 

比起直接的双服务器互拷内存,这种方式效率还是比较低的,因为还要有个恢复的过程,而且在管理上也增加了系统的复杂度。此外,备份服务器本身也很有可能成为瓶颈。

 

Sun的实现:专用数据库

 

 

表面上就是数据库的方式,但实际上,Sun JES应用服务器使用的称为“HADB”的数据库是专门为session的备份做了优化的,其大部分数据都是直接存放在内存中


Session备份的性能考虑

集群中每台服务器都有多个web应用,每个应用又同时有数以千记的用户session,这些session的备份和恢复都会耗费大量资源。更恐怖的是,session一直在变,比如失效了,比如增加或修改某个属性了,等等。所以如何备份session是考验系统架构水平的

 

何时备份?

不管是用数据库还是内存方式,下面两点都是比较常见的考虑

lweb 请求,即每次请求都进行备份更新,这样可以保证备份的数据是最新的

l固定时间备份,虽然不能保证备份的session是最新的,但却可以提高性能

 

备份粒度

l全部备份,最保险也是最慢的方法

l备份修改过的session。通常的做法是检测”HTTPSession.setAttribute()” “HTTPSession.removeAttribute()” 的调用,当然你要保证session的状态只能由这两个方法更改,尽管这不是J2EE规范的要求。

l备份修改过的session的属性,最节省性能的做法。但是有一点很重要:防止交叉引用。如下图,session中包含school对象,指向一个student对象。当school对象某个属性改变后,被备份到AS2中,它此时引用的是旧的student对象。接着student对象被单独改变了,也进行了备份,但是school中仍然引用旧的student。因此这种方法对web容器的设计要求很高,尽管它的性能是最好的。

 

 

图十三:session复制中的交叉引用

 

其他失效备援的实现

以上不论是数据库还是内存复制,归根结底都要使用Java的序列化机制,这给web容器的性能造成了不小的影响,因此有些应用服务器使用别的方式进行session备份

 

JRun with Jini

JRun 4使用jini实现集群,jini的详细介绍请参考 http://java.sun.com/products/jini/2_0index.html

 

Tangosol with Distributed Cache

Tangosol Coherence™提供了一个分布式数据管理平台,可以嵌入到大部分J2EE系统中,此外还提供一个分布式缓存系统,能够在多台jvm上有效的共享缓存,详情请参考 http://www.tangosol.com/

分享到:
评论

相关推荐

    J2EE集群原理,负载均衡

    集群是J2EE平台中的一个重要概念,用于提高系统的可靠性和性能,通过将多台服务器组织成一个群体,共同处理来自客户端的请求。 **J2EE集群原理** J2EE集群的基本思想是将单个服务器实例扩展到多个服务器实例,这些...

    主要讲J2EE集群原理 ,很不错。

    J2EE集群原理详解 J2EE集群是一种技术,旨在提高应用程序的可用性和可伸缩性,通过将工作负载分散到多个服务器上实现负载均衡,并确保在单个服务器出现故障时,服务仍能正常运行,这称为失败接管。集群的核心概念...

    揭开J2EE集群的面纱 pdf

    3.什么是J2EE集群? 4.WEB层集群实现8 4.1.WEB层负载均衡 4.2.HTTP会话的失败转移 4.2.1.数据库持久方案 4.2.2.内存复制方案 4.2.3.Tomcat的方案:多服务器复制 4.2.4.WebLogic, WebSphere, JBoss的方案:结对...

    J2EE集群设计开发部署(基于IBM+WAS)

    J2EE集群设计开发部署(基于IBM+WAS) J2EE集群设计开发部署(基于IBM+WAS)

    J2EE集群的学习

    - J2EE集群的基础概念和工作原理 - 集群配置和管理,包括网络设置、服务器同步和通信机制 - 负载均衡策略和工具的介绍 - 会话复制和粘滞会话的概念 - 容错机制和故障转移 - 性能优化和监控技巧 - 实战案例分析,展示...

    揭开J2EE集群的面纱

    总之,《揭开J2EE集群的面纱》是一本深入了解J2EE集群原理和技术细节的宝贵资源,无论是对于初学者还是经验丰富的开发者和架构师,都能从中获得深刻的启示和实用的指导。通过本书的学习,读者将能够更好地设计和优化...

    J2EE集群技术揭秘

    在IT行业中,J2EE(Java 2 ...然而,实现和维护一个高效的J2EE集群也需要对J2EE规范、网络协议、分布式系统原理有深入理解,以及对各种中间件产品的熟练掌握。因此,不断学习和实践是成为J2EE集群技术专家的关键。

    揭开J2EE集群的神秘面纱

    理解并掌握J2EE集群的原理和实践,对于开发和运维人员来说,是提升业务系统稳定性的必备技能。《揭开J2EE集群的神秘面纱》这本书将深入讲解这些概念,并提供实践经验,对学习和研究J2EE集群有着极大的帮助。

    揭开j2ee集群的神秘面纱

    总的来说,《揭开J2EE集群的神秘面纱》这篇文档将带领读者深入探讨J2EE集群的核心原理,帮助开发者和系统管理员更好地理解和运用这项技术,以构建稳定、高效的企业级应用环境。无论是初学者还是经验丰富的专业人士,...

    揭开J2EE集群的面纱 by 王昱.中英文双语

    首先,我们要理解J2EE集群的基本原理。在J2EE集群中,多个服务器实例(节点)协同工作,共享应用程序和用户会话数据。这样,当一个服务器出现故障时,其他服务器可以接管其工作,确保服务的连续性。此外,负载均衡...

    j2ee集群J2EEClustering.pdf

    然而,实现一个成功的J2EE集群并不是一件容易的事情,它需要系统架构师和开发人员对相关技术和原理有深入的理解,并在此基础上进行精心的设计和实施。此外,还需要充分考虑到集群环境的特性和限制,以及如何避免一些...

    j2ee集群揭密讲座(带录音).rar

    《J2EE集群揭秘》讲座,是一份深入探讨企业级Java应用系统中集群技术的珍贵资源,它结合了录音讲解,使学习者能够更直观、更生动地理解J2EE集群的核心概念和技术。J2EE,全称为Java 2 Platform, Enterprise Edition...

    揭开J2EE集群的神秘面纱.pdf

    为了克服这些挑战,开发者和架构师需要深入理解J2EE集群的工作原理及其背后的机制。具体来说: - **会话管理**:对于Web应用而言,保持用户会话状态的一致性是至关重要的。这通常涉及到会话数据的复制或集中存储。 ...

    J2EE扫盲之-揭开J2EE集群的神秘面纱

    本文旨在深入探讨J2EE集群这一重要概念及其背后的技术原理,帮助读者更好地理解如何利用集群技术来提升系统的可用性和扩展性。 #### 2. 基本术语 在正式讨论J2EE集群之前,有必要先了解一些与集群相关的基础概念:...

    揭开J2EE集群的面纱 中文版PDF

    本文旨在深入探讨J2EE集群的核心概念和技术实现,帮助读者更好地理解和应用这一关键技术。首先,我们将介绍集群的基本术语及其重要性;随后,具体分析J2EE集群的实现机制,包括WEB层、JNDI层、EJB层的集群化策略;...

    J2EE集群.pdf

    J2EE(Java 2 Platform, Enterprise Edition)作为企业级应用开发的标准平台之一,其集群技术为实现高可用性和可扩展性提供了有效手段。 **关键事件回顾**:1999年6月,eBay曾发生服务中断长达22小时,导致约230万...

Global site tag (gtag.js) - Google Analytics