`
jameswxx
  • 浏览: 772298 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论
阅读更多

概述

集群允许一个应用同时运行在多个并发的服务器。负载分布在不同的服务器,即使有个别服务器崩溃,应用程序还可以通过别的服务器节点访问。集群是企业级应用的关键技术,可以通过简单地增加节点来提升性能。

JBoss支持集群,启动一个JBoss集群的最简单的方式是,使用run -c all命令在局域网内启动多个JBoss实例。这些服务器实例,都使用all配置集,自动地构建一个集群。

1.1 定义

一个集群是由一系列节点组成。在一个JBoss集群中,一个节点是一个JBoss服务器实例,要构建一个集群,必须将几个JBoss服务器实例组合在一起。在一个局域网可能有多个集群,为了区分他们,每个集群必须有唯一的名称。

下图构建一个网络,包含三个集群。节点可以在任何时候添加到集群或者从集群中

Clusters and server nodes

注意:

一个JBoss服务器实例可以同时在多个集群,但是不推荐这样做,因为会增加管理复杂性。

JBoss服务器实例通过deploy/cluster-service.xml 文件中的ClusterPartition MBean指定属于哪一个集群。所有有同样的ClusterPartition MBean配置的节点属性同一个集群。因此,如果想在同一个局域网构建两个集群,只需要创建两个不同的ClusterPartition配置即可。如果某一个节点启动时,集群还不存在,会创建这个集群,同时当属于一个集群的所有节点移除时,集群也会被移除。

下面的示例是JBoss发布包的缺省定义,通过使用此缺省集群设置启动服务器,将可以构建一个缺省集群名称为DefaultPartition的集群。

  1. <mbean code="org.jboss.ha.framework.server.ClusterPartition"  
  2.     name="jboss:service=DefaultPartition">  
  3.             
  4.     >  
  5.     <attribute name="PartitionName">  
  6.         ${jboss.partition.name:DefaultPartition}   
  7.     attribute>  
  8.   
  9.     >  
  10.     <attribute name="NodeAddress">${jboss.bind.address}attribute>  
  11.   
  12.     >  
  13.     <attribute name="DeadlockDetection">Falseattribute>  
  14.         
  15.     
  16.         Increase for large states -->  
  17.     <attribute name="StateTransferTimeout">30000attribute>  
  18.   
  19.     >  
  20.     <attribute name="PartitionConfig">  
  21.         ... ...   
  22.     attribute>  
  23. mbean>  
xml 代码

这里省略了详细的JGroups协议配置,JGoups处理底层的节点之间的点对点通信,稍后将讨论其具体配置。ClusterPartition MBean可配置的属性包括:

  • PartitionName 缺省值是DefaultPartition,可选属性,用来指定集群的名称。

  • NodeAddress 设置节点的IP地址。

  • DeadlockDetection 缺省值为false,设置JGroups是否基于每个请求都运行消息死锁检测算法。

  • StateTransferTimeout 缺省值是30000,设置集群之间的状态复制的超时值。

  • PartitionConfig 指定JGourp配置选项。

一个集群包含的所有节点,必须有同样的 PartitionName  ParitionConfig 元素。改变某些节点的这两个元素将导致集群分离,通过改变ParitionConfig 是更容易一些。

可以通过集群中的任何一个节点的JMX控制台查看当前集群信息(比如:http://hostname:8080/jmx-console),然后点击 jboss:service=DefaultPartition MBean,将可以看到当前集群的所有节点的IP地址列表。

注意

A cluster (partition) contains a set of nodes that work toward a same goal. Some clustering features require to sub-partition the cluster to achieve a better scalability. For example, let's imagine that we have a 10-node cluster and we want to replicate in memory the state of stateful session beans on all 10 different nodes to provide for fault-tolerant behaviour. It would mean that each node has to store a backup of the 9 other nodes. This would not scale at all (each node would need to carry the whole state cluster load). It is probably much better to have some kind of sub-partitions inside a cluster and have beans state exchanged only between nodes that are part of the same sub-partition. The future JBoss clustering implementation will support sub-partitions and it will allow the cluster administrator to determine the optimal size of a sub-partition. The sub-partition topology computation will be done dynamically by the cluster.

对于应用程序开发人员来讲,可能更关心集群的架构,JBoss支持两种类型的集群架构,一种是客户端的拦截器架构,比如代理和存根,还有一种是负载平衡器。

1.2.2 负载平衡器

别的JBoss服务,特别是HTTP WEB服务,不要求客户端下载任何东西。客户直接通过某个通信协议发送请求并接受响应,比如HTTP协议。这种情况下,一个负载平衡器用来处理所有的请求并将这些请求派发给集群中的节点。负载平衡器通常是集群的一部分,它知道集群配置和恢复策略,客户端只需要知道负载平衡器。负载平衡器架构如下图所示:The load balancer architecture for clustering

 

负载平衡器架构的一个潜在的问题是负载平衡器是所有请求的唯一入口,必须保证高的可用性。

1.2.3 负载平衡策略

客户拦截器架构和负载平衡器架构都使用负载平衡策略确定由哪一个服务器节点发送一个新的请求。下面描述JBoss AS的负载平衡策略。

1.2.3.1 JBoss AS 3.0.x

JBoss 3.0.x 中有如下两个负载平衡选项可用:

  • Round-Robin (org.jboss.ha.framework.interfaces.RoundRobin):每次调用被派发给一个新的节点,第一个节点是随机选择的。

  • First Available (org.jboss.ha.framework.interfaces.FirstAvailable)::第一个可用的节点选为主节点,服务于随后每一个调用,主节点的选择是随机的。当集群中的节点发生变化时(因为节点启动或者停止),除非当前主节点依然可用,将重新选择一个可用的节点作为主节点。每个客户端拦截器或负载平衡器独立选择自己的主节点。

1.2.4 布署

在一个集群中布署应用程序最容易的方式是使用farming服务,就是将一个应用程序压缩文件(EAR,WAR或SAR)热布署到任一个节点的 all/farm/ 目录,应用程序会自动地复制到集群中的其他节点。如果稍后有新的节点加入,新节点启动时也会自动从集群中复制应用程序并布署到本地。在集群运行的过程中,如果从任一节点的farm目录移除应用程序,这个应用程序将首先从本地卸载,然后再从集群的其他节点中卸载。应该手动从当前没有连接到集群的服务器节点中删除应用程序。

注意

当前存在一个Bug,Farm布署服务只能在热布署压缩文件的方式中才能生效。如果你首先放一个应用程序在farm目录,然后启动服务器,这个应用程序将不会被检测并布署到集群中。

注意

在farm目录中只能使用压缩文件,而不能使用展开的目录。

Farming 服务在JBoss AS发布版的all配置集中是缺省启用的,不需要手动设置。配置文件保存在deploy/deploy.last目录,如果需要在集群配置中启用farming服务,创建farm-service.xml文件如下,并拷贝到JBoss布署目录$JBOSS_HOME/server/your_own_config/deploy,确保在配置中已经启用集群服务。 

xml 代码
  1. xml version="1.0" encoding="UTF-8"?>       
  2. <server>           
  3.            
  4.     <mbean code="org.jboss.ha.framework.server.FarmMemberService"        
  5.             name="jboss:service=FarmMember,partition=DefaultPartition">        
  6.         ...         
  7.         <attribute name="PartitionName">DefaultPartitionattribute>         
  8.         <attribute name="ScanPeriod">5000attribute>         
  9.         <attribute name="URLs">farm/attribute>        
  10.     mbean>          
  11. server>  
 

  FarmMemberService MBean 可用的属性如下:

  • PartitionName 指定集群名字,缺省值为 DefaultPartition.

  • URLs 指定布署器监控布署文件的目录,如果不存在,MBean将创建。 "." 表示配置目录(比如 $JBOSS_HOME/server/all/)。

  • ScanPeriod 指定文件夹的扫描周期,缺省值为5000。

Farming 服务是URLDeploymentScanner的扩展,用来扫描deploy目录,因此在FarmMemberService MBean中可以使用URLDeploymentScanner MBean 中定义的所有属性。

1.2.4 分布式状态复制服务

集群环境中,分布式状态管理是集群必须提供的一个关键服务。比如一个有状态的会话Bean应用程序,会话状态必须在所有节点的Bean实例中保持同步,因此不管哪个节点服务请求,客户端应该得到同样的会话状态。实体Bean应用程序中,Bean实例必须在集群中进行缓存以减轻数据库负载。目前JBoss AS中的状态复制和分布式缓存由两种方式提供: HASessionState MBean 和 JBoss Cache 框架。

  • HASessionState MBean 基于EJB2.X有状态会话Bean和JBoss3.x和4.x的HTTP负载平衡器提供会话复制和分布式缓存服务。MBean相关定义在 all/deploy/cluster-service.xml 文件中。

  • JBoss Cache 是一个分布式缓存框架,可以用在任何应用程序服务器环境,也可以独立使用,已经逐渐替换HASessionState 服务。JBoss AS 整合JBoss Cache 为HTTP会话, EJB 3.0 会话和实体Bean,Hibernate持久对象提供缓存服务。这些缓存服务都在独立的MBean中定义。

1.5 HTTP服务

HTTP会话复制用来在你的WEB客户端和集群的节点之间复制状态,那么当某一个节点崩溃时,集群中的其他节点可以恢复。要实现这个目的,必须执行两个步骤:

  • 会话状态复制

  • 请求负载平衡

如果使用all配置集启动JBoss,缺省会启用会话状态复制功能,只需要布署你的应用程序,会话状态就已经可以在集群中进行复制。

但是负载平衡需要额外的软件支持,作为一个常用的场景,我们将描述如何设置Apache和mod_jk。这个功能也可以通过专门的硬件或者其他软件来实现。

注意

一个负载平衡器跟踪HTTP请求,根据和请求关联的会话,决定派发请求到合适的节点。这被称作使用sticky-sessions的负载平衡器:一旦在某个节点创建了会话,随后的请求将由同一个节点进行处理。使用一个支持sticky-sessions的负载平衡器可以不用复制会话,没有会话状态复制的花销,每个请求将是被同一个节点处理。但是一旦这个节点崩溃,保存在这个节点的所有客户会话都将丢失,客户必须登录进另一个节点,重新启动一个新的会话。在某些情况,不复制HTTP会话是可以接受的,因为比较关键的状态都保存在数据库中,但是也有些情况下,丢失会话状态是无法接受的,这种情况下,会话状态复制的花销是必须承受的。

Apache 是一个可以通过插入模块扩展功能的WEB服务器,mod_jk(最新的mod_jk2)模块的主要功能就是允许从Apache分发请求到一个Servlet容器,还可以支持在多个Servlet容器中负载平衡HTTP调用(遵循sticky-sessions)。

1.5.1. 下载软件

http://httpd.apache.org/ 下载Apache,安装是非常直白的,不需要特别的配置,推荐使用2.0.x版本,这里假定Apache安装目录为APACHE_HOME。 

然后从www.apache.org/dist/jakarta/tomcat-connectors/jk/binaries/. 下载mod_jk模块,建议使用mod_jk 1.2.x版本。重命名下载的文件为mod_jk.so,拷贝到APACHE_HOME/modules/目录下。

1.5.2. 配置Apache使用mod_jk

更改APACHE_HOME/conf/httpd.conf 文件,在文件尾部添加一行:

java 代码
  1. # Include mod_jk's specific configuration file     
  2. Include conf/mod-jk.conf    

创建文件APACHE_HOME/conf/mod-jk.conf:

java 代码
  1. # Load mod_jk module   
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics