1.集群
——用JBoss群集实现高可用性企业服务
1.1 前言
群集系统(Clustering)允许我们在多台平行的服务器(群集节点)上运行一个应用程序。负载分布在不同的服务器上,即使其中任何一台崩溃,应用程序还是可以在其他群集节点(cluster nodes)上运行。群集对于可扩展性企业级应用程序是很关键的,因为你简单地把更多节点加入到群集系统里就可以提高性能。
JBoss
应用服务器(
AS
)缺省支持群集系统。最简单的启动
JBoss
服务器群集的方法就是在同一本地网络里启动多个
JBoss
实例,每个实例都可以用
run -c all
命令来运行。这些按照
all
配置文件启动的实例,可以检测到对方而自动组成一个群集系统。
在本章的第一部分,我们将讨论
JBoss
群集服务的基本概念。在阅读本章后面的内容之前,先理解这些概念是很重要的。在这部分内容之后,我们将介绍怎样为特定类型的应用程序配置群集系统。
1.1.1 群集系统的定义
群集系统是节点(
node
)的集合。在
JBoss
群集系统里,节点是一个
JBoss
服务器实例。因此,为了建立一个群集,
JBoss
实例必须组合在一起(通称
"partition"
)。在同一个网络里,我们可能有不同的群集。为了区分,每个群集都必须有一个唯一的名字。
![](https://i-blog.csdnimg.cn/blog_migrate/c1d85bd65c84cf549794dda0357a2c18.jpeg)
图 1.1. 集群和服务节点
![](https://i-blog.csdnimg.cn/blog_migrate/6c62bb1fdc62d9b635ca14217e7a5dc7.jpeg)
每个
JBoss
服务器实例(节点)在
deploy/cluster-service.xml
文件的
ClusterPartition MBean
里指定了它所加入的群集(也就是
partition
)。所有具有相同
ClusterPartition MBean
配置的节点加入到同一个群集系统里。因此,如果你想把同一个网络里的
JBoss
节点分开到两个群集里,你可以使用两个不同的
ClusterPartition MBean
配置,每个节点可以根据它所需要加入的群集来选择其中一个配置。如果节点启动的时候,它指定的群集不存在,这个群集将被创建。相同地,当群集系统的所有节点都被删除后,这个群集也将被删除。
![](https://i-blog.csdnimg.cn/blog_migrate/34be63bfdf1970a97a7ee3e6097086a1.jpeg)
在这里,我们忽略了这个群集的详细的
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 系统属性来修改群集系统的名字。
![](https://i-blog.csdnimg.cn/blog_migrate/659afd8134af4ad96de2e9fa950a84ea.jpeg)