了解最新公司动态及行业资讯
J2EE 平台提供了一种基于组件的方法来设计、开发、组装和部署企业应用程序。它还提供了多层分布式应用模型、组件重用、一致的安全模型和灵活的事务控制模型。近年来,它已在企业系统中大量使用。随着 J2EE 应用服务器的大规模部署和客户访问量的激增。企业对J2EE系统的可扩展性和高可用性的要求越来越高,尤其是在电子商务和金融领域,这个问题也越来越突出。如何设计和构建具有可扩展性和高可用性的J2EE集群应用服务器已经成为J2EE应用服务器设计中必须考虑的问题。但是J2EE应用服务器集群是基于EJB组件的集群,与常见的Web集群技术有很大不同。实现的方法也有本质的不同。
1 集群系统功能
集群系统是一组松散组合的服务器,它们组成一个虚拟服务器,为客户端用户提供统一的服务。对于这个客户端,它在访问集群系统时通常不会意识到它的服务是由哪个特定的服务器提供的。集群系统一般应具备高可用性、可扩展性、负载均衡、故障恢复和可维护性等特殊属性。
高可用是集群系统最基本的要求,是对整个系统稳定性的评价。可扩展性是指随着客户端用户数量的增加,整个系统继续保持有效响应时间的能力。在可扩展性系统中,随着用户数量的增加,有效响应时间变长,呈线性变化,这也反映了系统的峰值负载处理能力。有效预测访问的峰值负载已成为不可能。用户访问量的急剧增加使得系统的有效响应时间非线性变化,响应时间急剧增加,直至系统不堪重负而停机。一般的解决方案是升级系统硬件系统,或者增加服务器。但是,不合理地增加服务器,只能让整个集群系统变得越来越大。系统的复杂性意味着系统的故障率会增加服务器运维技术,整个系统的可靠性和可维护性会降低。
因此,一个系统的可用性和可扩展性是一个矛盾的关系,与整个集群系统的实现方式有很大关系。
2 EJB 技术
EJB 是J2EE 应用平台的核心。 Sun 在 EJB2.0 规范中对 EJB 的定义如下: EJB 是一种跨平台的组件架构,用于开发和部署多层、分布式、面向对象的 Java 应用系统。共有三种类型的 EJB 组件:会话 bean、实体 bean 和消息驱动 bean。会话 bean 有两种类型:有状态和无状态。
EJB 服务器的核心是提供一个或多个 EJB 容器 ( ) 供 EJB 使用。 EJB容器管理它所包含的EJB,为EJB组件的生存和执行提供运行环境,同时还负责EJB事务管理、安全管理、资源访问控制和一些异常处理。 EJB 容器不允许 J2EE 客户端程序直接访问容器中的 EJB 对象。当客户端用户想要访问 EJB 时,EJB 规范要求客户端使用 Java 名称和目录接口 JNDI(Java 和 )API 来定位 Bean 的主接口。访问一个 EJB 通常需要以下三个步骤(见图 1)(仅下面列出的调用):
1) 从 JNDI 中查找 bean 的主接口。首先,客户端需要获取一个JNDI初始化上下文,然后客户端可以使用上下文方法从一个名字映射到它的home接口;
2)在home接口中使用()方法获取Bean的接口引用;
3)通过接口中的方法使用Bean中定义的方法;
一个简单的访问示例如下:
// 获取JNDI初始化上下文
= 新 ( );
// 查找 MyEJB 并获取对 Home 对象的引用
= .("MyEJB");
// Home 对象被建模为 RMI-IIOP 对象
家=
()(, .Class);
//创建EJB对象,返回接口
myref = home.();
//通过接口调用EJB中实现的方法
.out.(myref.());
3 EJB 服务器集群
EJB服务器集群是一种基于组件的集群方式,与普通的Web集群技术有很大不同。实现的方法也不同。另外,由于EJB规范没有提供任何支持集群的标准,即使有些厂商在EJB服务器中提供集群特性,如何实现集群也是厂商自己决定的。实施的方法也各不相同。目前大部分J2EE应用服务器都提供集群功能,如Bea应用服务器、开源JBoss应用服务器、公司提供的J2EE应用服务器等。在EJB服务器集群的设计中,负载均衡(Load)、EJB集群和集群技术是设计中涉及的主要技术。 EJB集群的实现是整个系统实现的核心。
3.1 负载均衡(Load)
Load的主要目的是将访问系统的负载分散到不同的机器上,从而提高整个系统的吞吐量和并发性。它允许多台服务器共享一些繁重的计算或I/O任务,从而消除网络瓶颈,提高网络的灵活性和可靠性。常用方法如下:
l 轮询 DNS
DNS负载均衡是一种简单有效的方法,使用简单的域名查询IP地址来实现简单的负载均衡。给定任何地址,DNS 服务器都有一个与之对应的 IP 地址池。每次请求将域名转换为 IP 地址时,都会循环回到 IP 地址池中的下一个地址。因此,它被称为 DNS 循环。当进行访问时,请求 JNDI 的客户端会被传递一个 DNS 名称作为命名服务器的 URL。每个 DNS 名称都被转换为不同的地址。使用这种技术,每个客户端请求都被直接发送到不同的地址。在服务器上。负载均衡的一个主要缺点是一旦服务器出现故障,即使及时修改了DNS设置,仍然需要等待足够长的时间(因为DNS需要一定的刷新时间)才能生效。在此期间,部分客户端用户访问仍会在故障服务器上发送。
l 软件代理
软件代理维护与一系列服务器的开放连接。访问服务器时,首先要经过软件代理,软件代理可以通过一些负载均衡算法(如DNS Round-robin、随机方法、访问均衡算法)重定向用户对服务器的访问。这种软件代理方式可以及时发现服务器崩溃或无响应,有效避免DNS轮询方式中的错误访问。
l 硬件均衡器
这种硬件均衡器一般采用地址转换技术,将一个外部IP地址映射为多个内部IP地址,并为每个TCP连接请求动态使用其中一个内部地址,以达到负载均衡的目的。一般可以用第四层(或以上)的开关来实现。该交换机是根据IP地址和TCP端口交换虚拟连接,直接将数据包发送到目的计算机的相应端口。通过交换机,可以将来自外部的初始连接请求关联到多个内部地址,从而建立虚拟连接,实现负载均衡。这种第四层交换是基于硬件芯片的,所以网络传输速度和交换速度都远超普通的软件代理方式。比如使用Cisco CSS 11150(一个L4)可以实现硬件均衡。
3.2 EJB 集群技术
要访问 EJB 容器中的 EJB,客户端必须首先访问 JNDI 命名服务器 [参见第 2 节 EJB 技术]。因此,J2EE的EJB服务器实现集群()的核心也是围绕着JNDI展开的。根据系统中JNDI命名树的管理和组织方式不同,一般的EJB集群可以分为以下三种:
1)JNDI 树代理(代理)
每个 J2EE 中
维护自己的本地私有JNDI树,里面的每台服务器都不知道其他服务器的状态和存在,只有Proxy服务知道里面每台服务器的状态,可以访问里面的任意一台JNDI树上的服务器,这就要求每台服务器在启动和启动后都与Proxy服务保持联系,以便Proxy知道自己的工作和所有的EJB对象。要访问 EJB 对象,您必须首先访问 JNDI 代理。通过 Proxy,您可以重定向对所有 EJB 对象的访问(参见图 2))。这种方法的优点是实现简单,只需要设计一个JNDI Proxy代理即可。对于每个应用服务器没有复杂的要求;系统具有良好的可扩展性。要升级系统,您可以简单地添加服务器。但是这种方式有一个致命的缺点,就是如果Proxy服务出现故障,整个系统将无法正常工作。可靠性差。
2) 集中式 JNDI 树
当使用集中式集群时,整个集群系统中只有一个主命名服务器,负责管理和维护集群中全局的集中式JNDI树。集群中的所有 EJB 服务器启动后,都必须将对象绑定到这个名称服务器,每个 EJB 服务器不需要维护自己的私有 JNDI 树,由这个主名称服务器维护。如果要将 EJB 部署在集群中的多个服务器上,那么每个服务器都可以将同一个主对象绑定到名称服务器。当客户端向名称服务器请求访问该 EJB 的 home 对象时,所有 home 对象都可以将对象引用返回给客户端,也可以根据平衡算法返回一个服务器的 home 对象引用(见图 3))。为了提高整个系统的可靠性,这种集中式的方式必须考虑名称服务器的备份问题服务器运维技术,通常在同时使用多个名称服务器的大型系统中,可以在名称服务器之间使用JNDI树复制的方式,或者EJB 服务器可用于绑定多个服务器。比如公司的EJB应用服务器就是采用这种方式。 CORBA Cos 集中管理所有应用服务器的 JNDI 树。使用这种集中式设计模式,系统设计简单,但同时也带来了集中式系统的固有缺陷。首先,在系统设计时,要考虑命名服务器的备份问题,而随着集群系统越来越大,整个系统中命名服务器的瓶颈问题也越来越突出。
3) 分布式 JNDI 树
在这个模型中,每一个应用服务器都有自己的名字服务器,名字服务器不仅维护一个私有的本地JNDI树,还维护一个全局共享的JNDI树。本地 JNDI 树仅绑定部署在本地应用程序服务器中的对象,而全局 JNDI 树保存其他应用程序服务器上本地 JNDI 树的副本。这样,任何名称服务器都可以通过其本地私有和全局共享的 JNDI 树来访问,从而在整个系统中定位和部署 EJB 对象。一般采用多播的形式。其中一台应用服务器启动后,加入这个组播组,然后利用IP组播技术,将自己本地的JNDI树复制到全局共享JNDI树中的其他服务器上,这样其他服务器就可以拥有该JNDI树的副本它。同时,应用服务器必须在其他服务器之间保持(心跳)检测,以便随时检测其他服务器的活动状态。如果一个服务器异常崩溃,这个应用服务器会从它的全局共享JNDI树中删除这个异常服务器的JNDI副本,其他活动服务器也必须做类似的操作。这种分布式模型系统最大的优点是具有很强的可扩展性。如果再向系统添加一台服务器,则其他服务器无法进行任何更改。而且整个系统采用分布式系统,增强了可用性,系统中任何一个服务器的故障都不会影响整个系统的正常工作。这种方法也是目前使用最多的设计方法。 BEA的应用服务器和JBoss应用服务器采用这种设计方式。