Jboss7集群配置說明
Jboss7集群配置說明
第一節 前言
JBOSS7具有獨立模式(standalone)和域模式(domain)兩種運行方式。獨立模式(standalone)是單機器單進程方式,配置布署簡單,適用於一般單服務器項目。域模式(domain)是多機器多進程方式,配置稍復雜,適用於大型分布式項目。如果要集群布署項目,最簡單的方式就是使用域模式(domain)。
當使用域模式(domain)時,一臺機器上的一個JBOSS7應用(host)可以開啟多個Web Server,將一個JBOSS7應用(host)作為主控制服務器,就能控制管理其它機器上的JBOSS7應用(host),這樣理論上通過增加機器,我們就可以獲得無限個Web Server。把我們的Java項目通過主控制服務器布署到這些Web Server上,再通過httpd+mod_cluster,就能獲得集群功能。
mod_cluster是JBOSS開發的專門用於集群的httpd模塊,JBOSS7應該已內置有mod_cluster模塊並已配置好,JBOSS官網也提供了配置好mod_cluster的httpd項目,我們只需下載使用即可。
註意:JBOSS中文文檔很少,項目本身的版本更新又頻繁,因此初學者不易掌握,容易走入誤區。請根據本文的寫作順序,並下載指定的程序版本,確保程序版本匹配。調試環境除httpd+mod_cluster和jboss7獨立模式(standalone)可以在windows系統下以外,jboss7域模式(domain)一定要用Linux環境,否則無法調試通過
第二節 httpd+ mod_cluster安裝、配置、運行
作為初學者,最好先把httpd+mod_cluster調試成功後再往後進行,網上的資料多是針對熟悉linux、jboss、httpd的讀者,因此有不同程度的內容缺失,請按本文的介紹操作。
一 下載、安裝、運行httpd+mod_cluster
訪問http://www.jboss.org/mod_cluster/downloads/1-2-0-Final下載mod_cluster-1.2.0.Final-linux2-x64-ssl.tar.gz(windows下是mod_cluster-1.2.0.Final-windows-x86-ssl)。註意版本是1.2.0.Final,因為我們後面用的是jboss-as-7.1.1.Final,它內置的是mod_cluster-1.2.0.Final版本。還要註意這裏下載的是httpd+mod_cluster,也就是包含了httpd的程序,所以文件大小應該是8-9M,而不是只有幾百K,只包含幾個so文件的程序。網上一般介紹的是下載只包含幾個so文件的程序,然後修改linux自帶的httpd配置,但是根據測試發現linux自帶的httpd版本和我們需要的mod_cluster不匹配,無法配置成功。所以我們要下載包含完全httpd程序的mod_cluster文件。
在linux命令行下輸入tar –zxvf mod_cluster-1.2.0.Final-windows-x86-ssl解壓文件包,解壓後第一件事就是進入opt/jboss/httpd/sbin目錄輸入./installhome.sh(windows下是httpd-2.2\bin\installconf.bat),生成默認配置。註意這一步不能缺,如果不先生成默認配置,我們後面就沒法根據需要修改配置文件。
接著修改opt/jboss/httpd/httpd/conf/httpd.conf文件內容(可以用SSH Secure File Transfer Client把文件下載下來修改保存後再上傳上去):
Listen 8000改成
Listen 192.168.1.204:80
#ServerName localhost:8000 改成
ServerName 192.168.1.204:80
文件最下面的
<IfModule manager_module>
Listen 127.0.0.1:6666
ManagerBalancerName mycluster
<VirtualHost 127.0.0.1:6666>
<Location />
Order deny,allow
Deny from all
Allow from 127.0.0.1
</Location>
KeepAliveTimeout 300
MaxKeepAliveRequests 0
#ServerAdvertise on http://127.0.0.1:6666
AdvertiseFrequency 5
#AdvertiseSecurityKey secret
#AdvertiseGroup 224.0.1.105:23364
EnableMCPMReceive
<Location /mod_cluster_manager>
SetHandler mod_cluster-manager
Order deny,allow
Deny from all
Allow from 127.0.0
</Location>
</VirtualHost>
</IfModule>
改成
<IfModule manager_module>
Listen 192.168.1.204:6666
ManagerBalancerName mycluster
<VirtualHost *:6666>
<Location />
Order deny,allow
Deny from all
Allow from all
</Location>
KeepAliveTimeout 300
MaxKeepAliveRequests 0
#ServerAdvertise on http://127.0.0.1:6666
AdvertiseFrequency 5
AdvertiseSecurityKey 1234567890
#AdvertiseGroup 224.0.1.105:23364
EnableMCPMReceive
AllowDisplay On
<Location /mod_cluster_manager>
SetHandler mod_cluster-manager
Order deny,allow
Deny from all
Allow from all
</Location>
</VirtualHost>
</IfModule>
基本上改動的就是把127.0.0.1換成本機局域網IP,Listen192.168.1.204:80是監聽IP和端口,這樣httpd才會處理訪問訪問這個IP端口的請求,ServerName 192.168.1.204:80是對外的訪問地址,當服務器有DNS功能時,可以改成ServerName www.example.com:80,由DNS來解析域名的IP。註意,本機必須處在一個局域網內並分配有IP,否則可能調試不過。必須啟用AdvertiseSecurityKey並設置好密碼,沒有密碼jboss7.1.1.Final無法連接mod_cluster,這是網上多數資料沒有講到的。AllowDisplayOn是顯示詳細內容,開啟後才能看出有沒有連接成功的消息。
進入opt/jboss/httpd目錄運行./sbin/apachectl start(windows直接運行bin/httpd),註意不要直接進入sbin目錄再運行./apachectl start,因為這會運行linux自帶的httpd程序,而不是我們這裏的httpd(很奇怪的問題)。命令功能運行後應該沒有任何輸出就直接結束,如果有輸入信息,就可能表示有問題。成功啟動後,通過瀏覽器訪問http://192.168.1.204,正常情況下頁面上會顯示It works!文字,如果顯示的是apache的介紹頁面,則說明你啟動的可能是紅帽linux自帶的apache程序,而不是我們這裏使用的httpd程序。再訪問http://192.168.1.204:6666/mod_cluster_manager,註意是mod_cluster_manager而不是mod_cluster-manager,“_”和“-”的區別。出現這個畫面表示運行正常:
二 用jboss7獨立模式(standalone)來檢驗mod_cluster的配置結果
訪問https://www.jboss.org/jbossas/downloads.html下載jboss-as-7.1.1.Final,
解壓縮後進入standalone\configuration目錄,刪除standalone.xml文件,將standalone-full-ha.xml重命名為standalone.xml文件,因為mod_cluster缺省配置都在standalone-full-ha.xml中,現在我們要使用standalone-full-ha.xml內的配置來運行jboss7。修改文件內容:
<serverxmlns="urn:jboss:domain:1.2">
改為
<server name="standalone-node1"xmlns="urn:jboss:domain:1.2">
<mod-cluster-configadvertise-socket="modcluster">
改為
<mod-cluster-configadvertise-socket="modcluster" advertise-security-key="1234567890">
<subsystemxmlns="urn:jboss:domain:web:1.1"default-virtual-server="default-host" native="false">
改為
<subsystemxmlns="urn:jboss:domain:web:1.1"default-virtual-server="default-host" native="false"instance-id="${jboss.node.name}">
<interfaces>
<interfacename="management">
<inet-addressvalue="${jboss.bind.address.management:127.0.0.1}"/>
</interface>
<interfacename="public">
<inet-addressvalue="${jboss.bind.address:127.0.0.1}"/>
</interface>
<interfacename="unsecure">
<inet-addressvalue="${jboss.bind.address.unsecure: 127.0.0.1}"/>
</interface>
</interfaces>
改為
<interfaces>
<interfacename="management">
<inet-addressvalue="${jboss.bind.address.management:192.168.1.204}"/>
</interface>
<interfacename="public">
<inet-addressvalue="${jboss.bind.address:192.168.1.204}"/>
</interface>
<interfacename="unsecure">
<inet-addressvalue="${jboss.bind.address.unsecure:192.168.1.204}"/>
</interface>
</interfaces>
name="standalone-node1"是添加Server名稱,advertise-security-key="1234567890"是在httpd配置中定義的AdvertiseSecurityKey,沒有這個則連接不上httpd+mod_cluster,instance-id="${jboss.node.name}"是JBOSS7.1.1.Final的bug,如果不添加此項,則mod_cluster無法找到Node節點名稱。
配置完成後,進入bin目錄,運行./ standalone.sh, 啟動後通過瀏覽器訪問http://192.168.1.204:6666/mod_cluster_manager,依然和剛才一樣並無變化。接下來要在服務器上布署項目才能看得出變化。先停止jboss7。
https://github.com/liweinan/cluster-demo下載cluster-demo-master.zip,解壓後將裏面的內容手工打包為cluster.war文件,cluster.war文件是一個很簡單的web項目,唯一不同的是項目內的web.xml文件中多了一行<distributable/>,這個標記會開啟jboss cluster功能。將cluster.war拷貝到standalone\deployments目錄中,再啟動./ standalone.sh。
註意觀察命令行,如果jboss7正常啟動mod_cluster功能,會出現如下信息:
18:58:34,855 INFO [org.jboss.modcluster.ModClusterService] (MSC service thread 1-1)Initializing mod_cluster 1.2.0.Final
這裏可以看出啟動了mod_cluster,且版本是1.2.0.Finals
18:58:36,449 INFO [org.jboss.as.server.deployment] (MSC service thread 1-4) JBAS015876:Starting deployment of "cluster.war"
18:58:36,949 INFO [stdout](pool-14-thread-1)
18:58:36,964 INFO [stdout](pool-14-thread-1)-------------------------------------------------------------------
18:58:36,964 INFO [stdout](pool-14-thread-1) GMS: address=standalone-node1/web, cluster=web, physicaladdress=192.168.1.204:55200
18:58:36,964 INFO [stdout](pool-14-thread-1)-------------------------------------------------------------------
這裏可以看出web server啟動mod_cluster功能,如果沒有,說明mod_cluster沒啟動。
上述信息只會在有java應用程序布署到jboss7後才會出現,也只有jboss7中的web server節點布署了java應用程序後才能促使jboss7啟動mod_cluster功能。
布署後再次訪問http://192.168.1.204:6666/mod_cluster_manager,應該會在原來的內容下有如下顯示:
如果有,則表示httpd+mod_cluster配置無誤,可以接著往下進入域模式的配置管理了。如果沒有,說明httpd+mod_cluster或jboss配置有誤,二者沒能成功建立起聯系,需要檢查配置並修改重試,直到有上述顯示為止,才能說明httpd+mod_cluster是配置成功的。
第三節 JBOSS7域模式的配置、布署、運行
一 準備
1) 兩臺具有不同IP的linux服務器:主機master,IP:192.168.1.204,從機slave,IP:192.168.1.206,確保在一個局域網內可互相訪問
2) 下載jboss-as-7.1.1.Final.zip,分別解下縮布署到主機和從機上,命名為master和slave
二 賬號權限設置
1) master服務器端
i. 進入bin目錄,運行./add-user.sh,添加admin賬號
ii. 再次運行bin/add-user.bat,添加slave賬號
請註意,用戶名必須等於slave的host的名字。這意味著對於每個額外的host需要一個用戶。
三 修改master服務器缺省配置
1) 修改domain/configuration/host.xml
2) 修改domain/configuration/domain.xml
四 修改slave服務器缺省配置
1) 修改domain/configuration/host.xml
添加server-identities到security-realm,用於從機嘗試連接到主機時的身份驗證。因為slave服務名設置為‘slave‘,所以我們應該用‘slave‘用戶的密碼。加密值屬性中的‘MTIzMTIz =‘,是‘123123’的Base64編碼。可以通過使用base64計算器來獲得http://www.webutils.pl/index.php?idx=base64。在域控制器部分中<domain-controller>,我們還需要添加安全領域屬性security-realm="ManagementRealm"
五 試運行
現在一切都是為兩個主機設置在域模式下運行。試著在兩個主機上分別運行./domain.sh。如果一切都好,我們可以看到master上的日誌顯示:
這表明master和slave都啟動成功,且相互已經建立了聯系。
六 布署測試程序
1) 通過瀏覽器訪問http://192.168.1.204:9990,使用前名創建的賬號:admin,密碼:123123。192.168.1.204是主控制端host所在地址,我們用這個host來控制其他的host。進入後可以看到master和slave都有三個server,分別是
我們要把cluster.war布署在server-three上,因為這個server屬於other-server-group,在domain.xml中可以看到other-server-group用的profile是“full-ha”,是專用於mod_cluster的配置。
進入“Manage Deployments”頁面,點擊“Add Content”在右上角。然後我們應該選擇cluster.war文件,遵循指令將其添加到我們的內容庫。現在我們可以看到cluster.war已經添加。接下來,我們點擊“添加組”按鈕,並添加cluster.war到“other-server-group”,然後單擊“保存”。
註意,在Server Active啟動的狀態下,是無法布署war項目的,因此布署前確保server-three處於關閉狀態。
接下來,啟動master和slave的server-three,觀察命令行,會出現如下信息:
18:58:34,855 INFO [org.jboss.modcluster.ModClusterService](MSC service thread 1-1) Initializing mod_cluster 1.2.0.Final
……
18:58:36,449 INFO [org.jboss.as.server.deployment] (MSC service thread 1-4) JBAS015876:Starting deployment of "cluster.war"
18:58:36,949 INFO [stdout](pool-14-thread-1)
18:58:36,964 INFO [stdout](pool-14-thread-1)-------------------------------------------------------------------
18:58:36,964 INFO [stdout] (pool-14-thread-1)GMS: address=master /web, cluster=web, physical address=192.168.1.204:55200
18:58:36,964 INFO [stdout](pool-14-thread-1)-------------------------------------------------------------------
這裏可以看出web server啟動mod_cluster功能,如果沒有,說明mod_cluster沒啟動。
啟動後再訪問http://192.168.1.204:6666/mod_cluster_manager,應該會在原來的內容下有類似如下內容
這表明httpd+cluster和master,slave成功建產了聯系,再訪問http://192.168.1.204/cluster/,應該會看到httpd+mod_cluster自動將請求轉發至master或slave其中一臺服務器上,會顯示如下內容
一切順利的話,我們可以測試一下,把master或slave不管哪一個host停掉,http://192.168.1.204/cluster/依然會繼續運行,httpd+mod_cluster會自動將請求轉發至仍然運行的host服務器上,並能轉移session會話(我試過slave斷了,session能轉發到master,但master斷了,session無法轉發到slave,仍有待解決)。
最後,可以修改host.xml文件,將<servername="server-three" group="other-server-group"auto-start="false">
改為
<server name="server-three"group="other-server-group" auto-start="true">
使server-three自動啟動。
Jboss7集群配置說明