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 地址的列表。