1.集群
——用JBoss群集實(shí)現(xiàn)高可用性企業(yè)服務(wù)
1.1 前言
群集系統(tǒng)(Clustering)允許我們在多臺平行的服務(wù)器(群集節(jié)點(diǎn))上運(yùn)行一個(gè)應(yīng)用程序。負(fù)載分布在不同的服務(wù)器上,即使其中任何一臺崩潰,應(yīng)用程序還是可以在其他群集節(jié)點(diǎn)(cluster nodes)上運(yùn)行。群集對于可擴(kuò)展性企業(yè)級應(yīng)用程序是很關(guān)鍵的,因?yàn)槟愫唵蔚匕迅喙?jié)點(diǎn)加入到群集系統(tǒng)里就可以提高性能。
JBoss 應(yīng)用服務(wù)器(AS)缺省支持群集系統(tǒng)。最簡單的啟動 JBoss 服務(wù)器群集的方法就是在同一本地網(wǎng)絡(luò)里啟動多個(gè) JBoss 實(shí)例,每個(gè)實(shí)例都可以用 run -c all 命令來運(yùn)行。這些按照 all 配置文件啟動的實(shí)例,可以檢測到對方而自動組成一個(gè)群集系統(tǒng)。
在本章的第一部分,我們將討論 JBoss 群集服務(wù)的基本概念。在閱讀本章后面的內(nèi)容之前,先理解這些概念是很重要的。在這部分內(nèi)容之后,我們將介紹怎樣為特定類型的應(yīng)用程序配置群集系統(tǒng)。
1.1.1 群集系統(tǒng)的定義
群集系統(tǒng)是節(jié)點(diǎn)(node)的集合。在 JBoss 群集系統(tǒng)里,節(jié)點(diǎn)是一個(gè) JBoss 服務(wù)器實(shí)例。因此,為了建立一個(gè)群集,JBoss 實(shí)例必須組合在一起(通稱"partition")。在同一個(gè)網(wǎng)絡(luò)里,我們可能有不同的群集。為了區(qū)分,每個(gè)群集都必須有一個(gè)唯一的名字。
圖1.1“集群服務(wù)節(jié)點(diǎn)”, 展示了網(wǎng)絡(luò)里的 JBoss 服務(wù)器實(shí)例被分到三個(gè)群集系統(tǒng)里,有的群集系統(tǒng)只有一個(gè)節(jié)點(diǎn)。在任何時(shí)候,你都可以在群集里加入或刪除節(jié)點(diǎn)。
每個(gè) JBoss 服務(wù)器實(shí)例(節(jié)點(diǎn))在 deploy/cluster-service.xml 文件的 ClusterPartition MBean 里指定了它所加入的群集(也就是 partition)。所有具有相同 ClusterPartition MBean 配置的節(jié)點(diǎn)加入到同一個(gè)群集系統(tǒng)里。因此,如果你想把同一個(gè)網(wǎng)絡(luò)里的 JBoss 節(jié)點(diǎn)分開到兩個(gè)群集里,你可以使用兩個(gè)不同的 ClusterPartition MBean 配置,每個(gè)節(jié)點(diǎn)可以根據(jù)它所需要加入的群集來選擇其中一個(gè)配置。如果節(jié)點(diǎn)啟動的時(shí)候,它指定的群集不存在,這個(gè)群集將被創(chuàng)建。相同地,當(dāng)群集系統(tǒng)的所有節(jié)點(diǎn)都被刪除后,這個(gè)群集也將被刪除。
下例展示了標(biāo)準(zhǔn) JBoss AS 發(fā)行版本里的 MBean 的定義。如果你在本地網(wǎng)絡(luò)里用缺省的群集設(shè)定來啟動 JBoss 服務(wù)器,你將得到一個(gè)叫 DefaultPartition 的缺省群集,它包括了所有作為節(jié)點(diǎn)的服務(wù)器實(shí)例。
在這里,我們忽略了這個(gè)群集的詳細(xì)的 JGroups 協(xié)議配置(protocal configuration)。JGroups 處理節(jié)點(diǎn)之間底層的點(diǎn)到點(diǎn)通信,我們將在 Section 1, “JGroups配置”里討論它的配置。下面的列表展示了 ClusterPartition MBean 里可用的配置屬性。
u PartitionName 是用來指定節(jié)點(diǎn)名稱的可選屬性。它的缺省值是 DefaultPartition。
u NodeAddress 是一個(gè)可選屬性,指定這個(gè)節(jié)點(diǎn)所綁定的IP地址。
u DeadlockDetection 是用來通知 Jgroups 為每個(gè)請求運(yùn)行消息死鎖檢測算法(message deadlock detection algorithms)的可選布爾值屬性。它的缺省值是 false。
u StateTransferTimeout 是用來指定跨群集的狀態(tài)復(fù)制(state replication)的超時(shí)時(shí)間(以毫秒為單位)的可選屬性。它的缺省值是 30000。
u PartitionConfig 是一個(gè)用來為這個(gè)群集(見Section 1, “JGroups 配置”) 指定 JGroup 配置選項(xiàng)的元素(element)。.
為了組成一個(gè)群集系統(tǒng),它們必須有剛好一樣的 PartitionName 和 ParitionConfig 元素。只改變其中一些而不是全部節(jié)點(diǎn)會導(dǎo)致群集的分離。通常來說,修改 ParitionConfig(即:地址/端口)而不是 PartitionName 來運(yùn)行多個(gè)群集系統(tǒng)會比較容易,因?yàn)楹笳咝枰谄渌渲梦募锏亩鄠€(gè)地方修改。然而,在 4.0.2+ 以后的版本里,修改 PartitionName 反而更方便了。因?yàn)槭褂昧?${jboss.partition.name} 屬性,它允許通過單個(gè)的 jboss.partition.name 系統(tǒng)屬性來修改群集系統(tǒng)的名字。
你可以用瀏覽器訪問群集系統(tǒng)里的任何 JBoss 實(shí)例的 JMX 控制臺來查看當(dāng)前的群集信息(如,[url]http://hostname:8080/jmx-console/[/url]),點(diǎn)擊 jboss:service=DefaultPartition MBean(如果這個(gè)節(jié)點(diǎn)沒有加入 DefaultPartition,你可以改變 MBean 名來反映群集名)。CurrentView 字段會顯示當(dāng)前群集的 IP 地址的列表。