1.集群
——用JBoss群集实现高可用性企业服务
1.1 前言
群集系统(Clustering)允许我们在多台平行的服务器(群集节点)上运行一个应用程序。负载分布在不同的服务器上,即使其中任何一台崩溃,应用程序还是可以在其他群集节点(cluster nodes)上运行。群集对于可扩展性企业级应用程序是很关键的,因为你简单地把更多节点加入到群集系统里就可以提高性能。
JBoss 应用服务器(AS)缺省支持群集系统。最简单的启动 JBoss 服务器群集的方法就是在同一本地网络里启动多个 JBoss 实例,每个实例都可以用 run -c all 命令来运行。这些按照 all 配置文件启动的实例,可以检测到对方而自动组成一个群集系统。
在本章的第一部分,我们将讨论 JBoss 群集服务的基本概念。在阅读本章后面的内容之前,先理解这些概念是很重要的。在这部分内容之后,我们将介绍怎样为特定类型的应用程序配置群集系统。
1.1.1 群集系统的定义
群集系统是节点(node)的集合。在 JBoss 群集系统里,节点是一个 JBoss 服务器实例。因此,为了建立一个群集,JBoss 实例必须组合在一起(通称"partition")。在同一个网络里,我们可能有不同的群集。为了区分,每个群集都必须有一个唯一的名字。
图1.1“集群服务节点”, 展示了网络里的 JBoss 服务器实例被分到三个群集系统里,有的群集系统只有一个节点。在任何时候,你都可以在群集里加入或删除节点。
每个 JBoss 服务器实例(节点)在 deploy/cluster-service.xml 文件的 ClusterPartition MBean 里指定了它所加入的群集(也就是 partition)。所有具有相同 ClusterPartition MBean 配置的节点加入到同一个群集系统里。因此,如果你想把同一个网络里的 JBoss 节点分开到两个群集里,你可以使用两个不同的 ClusterPartition MBean 配置,每个节点可以根据它所需要加入的群集来选择其中一个配置。如果节点启动的时候,它指定的群集不存在,这个群集将被创建。相同地,当群集系统的所有节点都被删除后,这个群集也将被删除。
下例展示了标准 JBoss AS 发行版本里的 MBean 的定义。如果你在本地网络里用缺省的群集设定来启动 JBoss 服务器,你将得到一个叫 DefaultPartition 的缺省群集,它包括了所有作为节点的服务器实例。
在这里,我们忽略了这个群集的详细的 JGroups 协议配置(protocal configuration)。JGroups 处理节点之间底层的点到点通信,我们将在 Section 1, “JGroups配置”里讨论它的配置。下面的列表展示了 ClusterPartition MBean 里可用的配置属性。
u PartitionName 是用来指定节点名称的可选属性。它的缺省值是 DefaultPartition。
u NodeAddress 是一个可选属性,指定这个节点所绑定的IP地址。
u DeadlockDetection 是用来通知 Jgroups 为每个请求运行消息死锁检测算法(message deadlock detection algorithms)的可选布尔值属性。它的缺省值是 false。
u StateTransferTimeout 是用来指定跨群集的状态复制(state replication)的超时时间(以毫秒为单位)的可选属性。它的缺省值是 30000。
u PartitionConfig 是一个用来为这个群集(见Section 1, “JGroups 配置”) 指定 JGroup 配置选项的元素(element)。.
为了组成一个群集系统,它们必须有刚好一样的 PartitionName 和 ParitionConfig 元素。只改变其中一些而不是全部节点会导致群集的分离。通常来说,修改 ParitionConfig(即:地址/端口)而不是 PartitionName 来运行多个群集系统会比较容易,因为后者需要在其他配置文件里的多个地方修改。然而,在 4.0.2+ 以后的版本里,修改 PartitionName 反而更方便了。因为使用了 ${jboss.partition.name} 属性,它允许通过单个的 jboss.partition.name 系统属性来修改群集系统的名字。
你可以用浏览器访问群集系统里的任何 JBoss 实例的 JMX 控制台来查看当前的群集信息(如,[url]http://hostname:8080/jmx-console/[/url]),点击 jboss:service=DefaultPartition MBean(如果这个节点没有加入 DefaultPartition,你可以改变 MBean 名来反映群集名)。CurrentView 字段会显示当前群集的 IP 地址的列表。