2.4 群集

在群集环境中使用用户应用程序时必须考虑三件事情:

2.4.1 群集 JBoss

群集是提供一组服务的应用程序服务器节点的集合。 使用群集的目的是提高应用程序的性能和可靠性。 一般而言,群集为企业应用程序提供三个关键益处:

  • 高可用性
  • 可伸缩性(容量更大)
  • 负载平衡

高可用性意味着应用程序在部署期间的大部分时间内都可靠并且可用。 因为在所有节点上运行同一应用程序,所以群集能提供高可用性。 如果一个节点失败,则应用程序仍将在其它节点上运行。 在群集中运行时,Identity Manager 用户应用程序将获得较高的可用性。 但是,Identity Manager 用户应用程序不支持 HTTP 会话复制。 这意味着如果在某节点上进行会话时该节点失败,会话信息将会丢失。

负载平衡是在群集成员中分发工作量的做法。 负载平衡的目的是提高性能。 可以通过多种方法实现负载平衡(例如,DNS 循环复用、硬件负载平衡)。 有关各种负载平衡方法的讨论,请参见 http://www.onjava.com/pub/a/onjava/2001/09/26/load.html。 无论选择何种方法,都将要在群集配置中包含负载平衡。

JBoss 群集组

JBoss 群集以名为 JGroups 的通讯模块为基础。 JGroups 与 JBoss 一起安装(也可以在没有 JBoss 的情况下单独使用)。 JGroups 可提供组之间的通讯,这些组共享常用名、多路广播地址以及多路广播端口。

安装群集 JBoss 服务器时,JBoss 将定义两个不同的 JGroups 组,用于管理群集。 一个组为 DefaultPartition,在 /deploy/cluster-service.xml 中定义。JBoss 使用此群集组提供核心群集服务。 JBoss 还定义了另一个名为 Tomcat-Cluster 的群集组。 此群集组在 /deploy/tc-cluster-service.xml 中定义。此群集组为 JBoss 内运行的 Tomcat 服务器提供会话复制。

Identity Manager 用户应用程序使用第三个群集组。 此群集组使用 UUID 名以尽量减少与其它群集组(用户可能将其添加到服务器中)冲突的风险。 默认情况下,此群集组名为 c373e901aba5e8ee9966444553544200。 此群集未使用 JBoss 服务文件进行配置。 配置设置位于目录中,可以使用用户应用程序管理功能进行配置。 如果熟悉 JGroups 和 JBoss 群集,则可以使用此界面调整用户应用程序群集配置。 重启动服务器节点后,对该节点的群集配置所做的更改才能生效。

用户应用程序群集组仅用于在群集环境中协调用户应用程序超速缓存。 它独立于两个 JBoss 群集组,并且不以任何方式与之进行交互。 默认情况下,用户应用程序群集组和两个 JBoss 组使用不同的组名、多路广播地址和多路广播端口,因此无需进行重配置。

共享目录配置的所有 Identity Manager 3 应用程序都可共享用户应用程序群集组设置。 管理员可使用用户应用程序管理界面中的本地设置选项从群集中去除节点,或更改群集中服务器的成员资格。 例如,可以全局禁用群集,然后在本地对共享目录配置的服务器的子集启用该群集。

应用程序场

JBoss 允许将应用程序 EAR、WAR 或 JAR 复制到一个群集 JBoss 实例的 farm 目录中,从而在群集中进行热部署。 当群集正在运行时,在一台计算机上进行热部署将导致在此群集中所有实例上自动部署该部件。

由于 JBoss Application Server 4.0.2 版在使用方面存在未解决的问题,因此不推荐对它采取这种方式的应用程序部署。在编写本文档时,此版本已包含在用户应用程序安装程序中。 但是,我们还是提供了使用 JBoss 场技术成功部署用户应用程序应执行的基本步骤(请参见使用 JBoss 场将用户应用程序部署到群集中),因为此文档发布之后,该技术可能会改进。

MySQL 数据库

用户应用程序安装程序安装 MySQL 数据库管理器并创建用户应用程序使用的数据库,或者使用现有 Oracle、Microsoft SQL 服务器或 MySQL 数据库。 数据库负责保证数据的持续性。 JBoss 群集中的所有节点必须访问同一数据库实例。 用户应用程序使用标准 JDBC 调用来访问并更新此数据库。 用户应用程序使用联结到 JNDI 树的 JDBC 数据源打开与数据库的连接。 如果使用用户应用程序安装程序创建 JBoss 群集,将安装数据源。 如果选择手工安装 JBoss 群集,需要将数据源文件 (IDM-ds.xml) 复制到群集中所有节点的部署目录中。 另外,如果要使用 MySQL,则需要将位于 JBoss/server/IDM/lib 目录中的 MySQL JDBC 驱动程序 (mysql-connector-java-3.1.10-utf8-clob-fix-bin.jar) 复制到 JBossserver/IDM/lib 目录中。

日志记录

要启用群集的日志记录,需要编辑 log4j.xml 配置文件,该文件位于 JBoss 服务器配置的 \conf 目录中(例如,\server\IDM\conf),并取消底部的注释,如下所示:

<!--  Clustering logging --> - <!-- Uncomment the following to redirect the org.jgroups and org.jboss.ha categories to a cluster.log file. <appender name="CLUSTER" class="org.jboss.logging.appender.RollingFileAppender"> <errorHandler class="org.jboss.logging.util.OnlyOnceErrorHandler"/> <param name="File" value="${jboss.server.home.dir}/log cluster.log"/> <param name="Append" value="false"/> <param name="MaxFileSize" value="500KB"/> <param name="MaxBackupIndex" value="1"/> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d %-5p [%c] %m%n"/> </layout> </appender> <category name="org.jgroups"> <priority value="DEBUG" /> <appender-ref ref="CLUSTER"/> </category> <category name="org.jboss.ha"> <priority value="DEBUG" /> <appender-ref ref="CLUSTER"/> </category> --> 

可以在 JBoss 服务器配置的 log 目录中找到 cluster.log 文件(例如,\server\IDM\log)。

2.4.2 将用户应用程序安装到 JBoss 群集

将用户应用程序安装到群集的推荐方法是,使用用户应用程序安装程序将用户应用程序安装到群集中的每个节点。 虽然不建议使用 JBoss 场将用户应用程序部署到群集中,但本文中也包括了这种方式的操作过程,供您选用。

在群集中的每个节点上使用用户应用程序安装程序

JBoss 附带了三种现成的服务器配置: 最小默认所有。 只有在所有配置中可以启用群集。 /deploy 文件夹中的 cluster-service.xml 文件说明默认群集分区的配置。 如果安装用户应用程序时指示安装程序要安装到群集中,安装程序将生成所有配置的拷贝,将拷贝命名为 IDM(默认情况下为此名称;安装程序允许更改拷贝名称),并将用户应用程序安装到此配置中。

要使用用户应用程序安装程序将用户应用程序安装到群集中的每个节点,请执行以下操作:

  1. 在第一个 JBoss 节点上完整安装用户应用程序(MySQL、JBoss 以及用户应用程序)。 有关使用用户应用程序安装程序的信息,请参见《Identity Manager 3 安装指南》

    • 如果要使用 MySQL 作为用户应用程序的数据库,则用户应用程序安装程序将创建 MySQL 的新安装。 请记住所指定的 MySQL 根用户口令;在群集中的其余节点上安装用户应用程序时需要此信息。
    • 在安装程序《IDM 配置》屏幕中,选择“群集(所有)”选项。
    • 选择其它适合于环境的安装选项。
  2. 如果尚未运行 MySQL,则使用位于 /IDM/mysql 目录中的 start-mysql.bat 文件启动 MySQL。

    注:在 Linux 中,以下壳层命令有助于确定是否正在运行 MySQL 守护程序:

    
    ps -A | grep mysqld
    

    如果此命令返回多个以 mysqld 结束的行,那么此守护程序正在运行。

  3. 使用位于 IDM 目录中的 start-jboss.bat (Windows) 或 start-jboss.sh (Linux) 文件启动 JBoss 和用户应用程序。

    说明:说明: 图示
  4. 在 JBoss 群集中的每个附加节点上执行用户应用程序的自定义安装。

    • 仅选择要安装的用户应用程序:
    说明:说明: 图示
    • 指定将安装用户应用程序数据库的服务器的 IP 地址或主机名。
    • 指定用户应用程序数据库的数据库用户名和口令。 如果使用 MySQL,用户名为 root,口令为步骤 1中的安装进程期间所指定的口令。
    • 在安装程序《IDM 配置》屏幕中,选择“群集(所有)”选项。
    • 选择其它适合于环境的安装选项。
  5. 使用位于 IDM 目录中的 start-jboss.bat (Windows) 或 start-jboss.sh (Linux) 启动 JBoss 群集中每个节点。

使用 JBoss 场将用户应用程序部署到群集中

请勿在 JBoss 4.0.2 版或更早版本中使用 JBoss 场,可能会遇到问题(请参见 http://jira.jboss.com/jira/browse/JBAS-1899)。 建议使用用户应用程序安装程序在群集中的每个节点上安装用户应用程序(请参见本章中的在群集中的每个节点上使用用户应用程序安装程序)。 但是,如果要使用场将用户应用程序部署到使用 JBoss 4.0.3 或更高版本的 JBoss 群集中,请遵循以下步骤。

注:这些步骤针对希望独自试用 JBoss 4.0.3 的客户。 正式支持的版本为 4.0.2。

要使用 JBoss 场将用户应用程序部署到群集中,请执行以下操作:

  1. 选择要安装的用户应用程序和 MySQL(如果使用 MySQL 的话;否则,将只安装用户应用程序),将用户应用程序自定义安装到 JBoss 群集的一个节点上。 执行安装时此节点上的所有群集都可运行,但是安装用户应用程序的节点应该是群集中第一个启动的节点。

  2. 将位于 /server/IDM/lib 目录中的 JDBC 驱动程序文件(例如,如果要使用 MySQL,JDBC 驱动程序为 mysql-connector-java-3.1.10-utf8-clob-fix-bin.jar)复制到群集中每个节点的相应目录中。

  3. 将随用户应用程序一起安装的 JRE 的 /lib/security 目录中的 cacerts 文件复制到群集中各个节点的 JRE/lib/security 目录中。

  4. 将 IDM.war 文件和 IDM-ds.xml 数据源文件从服务器配置目录的 /deploy 目录移动到服务器配置目录的 /farm 目录。 必须实际移动这些文件。 不要将原文件留在 /deploy 目录中。

  5. 启动用户应用程序的数据库(如果要使用所提供的 MySQL,请用位于 /IDM/mysql 目录中的 start-mysql.bat 文件启动 MySQL)。

  6. 使用 start-jboss.bat (Windows) 或 start-jboss.sh (Linux)(位于安装了用户应用程序和用户应用程序数据库的节点上的 IDM 目录中)启动 JBoss 和用户应用程序。

  7. 启动群集中的其它节点。

2.4.3 配置用户应用程序群集组超速缓存配置

熟悉 JGroups 和 JBoss 群集的用户可以使用用户应用程序管理用户界面修改群集组超速缓存配置(请参见部分 13.3.5, 群集的超速缓存设置)。 重启动服务器节点后,对该节点的群集配置所做的更改才能生效。

2.4.4 配置群集的工作流程

工作流程引擎群集独立于用户应用程序超速缓存框架工作。 必须执行若干步骤以确保工作流程引擎在群集环境中的正常工作。

  • 群集中的所有服务器都需指向同一数据库。 如果使用推荐的方法将用户应用程序安装到群集中(请参见在群集中的每个节点上使用用户应用程序安装程序),则在安装进程期间,通过指定安装用户应用程序数据库的服务器的 IP 地址或主机名,可以完成此操作。 如果使用场将用户应用程序部署到群集节点中(请参见使用 JBoss 场将用户应用程序部署到群集中),将数据源文件 (IDM-ds.xml) 从首次安装用户应用程序的节点上的 /deploy 目录移动到 /farm 目录中,即可完成此操作。 这将导致数据源被部署到群集中的所有节点上。
  • 需要使用唯一的引擎 ID 启动群集中的每个服务器。可以在启动服务器时通过设置 com.novell.afw.wf.engine-id 系统属性完成此操作。 例如,如果要启动 JBoss 并将引擎 ID ENGINE1 指派给该服务器的工作流程引擎,应使用以下命令:

    run.sh -Dcom.novell.afw.wf.engine-id=ENGINE1 (Linux)

    run.bat -Dcom.novell.afw.wf.engine-id=ENGINE1 (Windows)

一个工作流程进程实例由特定服务器上运行的工作流程引擎启动后,就只能在该服务器上运行并完成。 这将确保工作流程进程的安全执行。 但是,它不提供进程实例故障转移支持。 如果群集中的服务器崩溃,则直到重启动具有同一 ID 的引擎后,进程实例才会重启动。

如果因严重的硬件或软件故障而无法重启动服务器计算机,则可以使用那台不可恢复的计算机上所用的同一工作流程引擎 ID,在新计算机上启动应用程序服务器。 由于引擎 ID 是一个逻辑名,而不是对引擎所运行的物理计算机的直接映射,因此中断的进程实例将在新计算机上成功完成。

进程实例由启动进程的引擎所拥有。 但是,用户可以登录群集中的任意用户应用程序以查看进程详情、收回进程或完成所指派的任务。 收回的进程或在并未拥有此进程的引擎上完成的任务将进入待发状态,一旦被拥有它们的引擎发现,将继续执行。