安裝的軟件:
Redhat.Enterprise.Linux.v6.UPDATE.3.X86_64
jdk-6u33-linux-x64
jboss-as-7.1.0.Final
httpd-2.2.22
mod_cluster-1.1.3.Final-linux2-x64-so.tar
安裝jdk
1)下載jdk-6u33-linux-x64,上傳到linux系統,/usr/local/java的文件夾。
2)添加執行權限:chmod 755 jdk-6u33-linux-x64
3)執行該文件:./jdk-6u33-linux-x64,會出現jdk的文件夾。
4)更改系統環境變量:用root用戶,vi /etc/profile,在后面添加:
#SetEnvironment of java & jboss
JAVA_HOME=/usr/local/java/jdk1.6.0_33
JRE_HOME=/usr/local/java/jdk1.6.0_33/jre
PATH=$PATH:$JAVA_HOME/bin:JRE_HOME/bin
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:
修改后通過source /etc/profile使它生效。
5)替換系統jdk:RHEL好多都自帶jdk,但是版本比較老,要使用新下載的jdk,需要重新連接。
cd /usr/bin
ln -s -f /usr/local/java/jdk1.6/jre/bin/java
ln -s -f /usr/local/java/jdk1.6/bin/javac
6)檢查jdk版本:java –version。出現下面顯示,表示安裝成功。
java version "1.6.0_33"
Java(TM) SE Runtime Environment (build 1.6.0_33-b04)
Java HotSpot(TM) 64-Bit Server VM (build 20.8-b03, mixed mode)
分配用戶組:
# groupadd-g 700 jboss
# useradd -u700 -g 700 jboss--創建用戶
# passwd jboss--激活jboss用戶
執行下列命令將/jboss分配給jboss用戶。
# cd /
# chown -R jboss:jboss/jboss
# chmod 755/jboss
JBOSS AS7的新特性:
JBoss AS7新加入了域(domain)的概念并實現了相關功能。域的提出及實現,其目的是使得多臺JBossAS服務器的配置可以集中于一點,統一配置、統一部署,從而在管理多臺JBoss AS服務器時,實現集中管理。本文詳細介紹如何使用AS7的這一新特性。
域(Domain)的概念及其與群集(Cluster)的區別
對于使用過JBoss AS過往版本的用戶,可能對AS所提供的群集功能已經很熟悉了,在理解域的時候可能會遇到困難。那么域和群集有什么區別,用處上有什么不同呢?
總的來講,JBoss的群集的目的是提供:
*負載平衡(Load Balance)
*高可用(High Availablity)
而域的目的則是將多臺服務器組成一個服務器組(Server Group),并為一個服務器組內的多臺主機(Host)提供:
*單點集中配置(通過一個域控制器,即Domain Controller,實現組內主機的統一配置)
*單點統一部署,通過域控制器將項目一次部署至組內全部主機。
簡單來講,群集的目標是讓多臺服務器分攤壓力,當一臺或多臺服務器宕機時,服務可以繼續保持運轉;而域的目標則是提供集中配置和管理多臺服務器的能力。
在沒有域的概念時,要想讓群集內的多臺服務器或幾組服務器保持統一的配置,一個一個分別的去手工維護,是非常麻煩的事情,而域的引入解決了這一問題。
我們可以理解域和群集的相互關系是”正交(orthogonal)”的:通過一橫一豎這兩條軸,JBoss AS為我們在運維方面提供了強大的可擴展能力。
使用兩臺電腦做為實驗器材,兩臺電腦的IP分別為192.168.191.134,192.168.191.130。分別運行JBoss AS7,并組成一個服務器組(Server Group)。
192.168.191.134這臺機器做為域控制器(Domain Controller)主機分別被命名為”master“及”slave“。通過配置,將master與slave組成一個服務器組,名為’main-server-group’,其中master將做為這個服務器組的域控制器。
解釋:
服務器組(Server Group):可以由多臺服務器(Host)組成,并不一定只有兩臺,所以不要被master及slave這樣的名字給迷惑了,以為一個服務器組僅支持一主一從兩臺hosts。在一個服務器組中,只有一臺域控制器。
AS7配置說明
* domain.xml*
...
..
...
...
...
...
...
...
這個文件里面有幾個部分是值得我們關注一下的:
# extensions –這一部分定義了域中服務器在啟動時需要加載的模塊。AS7使用了全新設計的JBoss Modules來加載模塊,大幅提高了服務器的啟動。這一內容不是本文講解重點,后續我會專門寫一篇文章來介紹。目前了解到這一程度即可。
# profiles – profiles是domain中定義的一個核心概念,也是domain的核心組成部分。基于profiles,AS7便實現了域中各服務器的統一集中配置:用戶可通過profile對各子系統(subsystem)進行配置,完成后將profile配置給某個或多個服務器組,各服務器組內的主機共用一份配置。
# server groups –服務器組的概念已經在前面的介紹中一再提及,也是AS7的域的設計中一個核心組成部分。在這里,AS7默認定義了兩個服務器組:main-server-group及other-server-group,它們分別使用’default’profile及’ha’ profile。在本實驗中,我們將使用main-server-group。
* host.xml
...
...
...
上面是一些host.xml中需要配置的關鍵內容,已經針對要做的測試做了一些配置上面的修改,以下是詳細說明:
# host name按照我們的需要改成了”master”。
# management – management定義了服務器的管理端口,其中:9999端口是所謂”native”二進制端口,后面的jboss-admin.sh管理命令會使用這個端口;9990則提供基于WEB頁面的管理端。我們等一下兩種管理端口都會用到。
# domain controller –定義本服務器所需連接的domain控制器所在地址,因為master本身就是domain controller,所以連接至本機localhost即可。
# interfaces – management及public接口服務所在的地址,我們要將其設為slave可以訪問到的IP地址,保證slave可以連接至host
# servers –一個物理主機實際上可以同時運行多臺JBoss AS7的Server,而每一臺Server都可以配置到不同的服務器組去。在本實驗中,我們使用最簡的情況,master上面只跑一個server-one,屬于main-server-group,把其它AS7默認設定的server可以都刪掉,只留server-one。
* domain.xml
Slave這臺機器不作為域控制器而存在,因此不需要管它,也可以將domain.xml刪掉或改名。
* host.xml
...
...
上面的配置有幾點需要說明:
* slave里面,host name指定為”slave”。
* domain-controller:指定為master的IP:192.168.191.134,通過9999管理端口進行通訊。
* slave上面,屬于main-server-group的server也命名為”server-one”,這會和master上面的server沖突嗎?實際上不會,因為兩臺同樣名字的server運行在不同的host當中。
AS 7.1的補充說明
從JBoss AS 7.1開始,對控制端口(9999及HTTP端的9990)的安全配置成為必須。因此需要補充下述安全配置方面的步驟:
首先要在master上面創建管理員的賬號,在bin目錄下有add-user工具可以幫我們創建賬號密碼并進行配置,我們創建一個管理員賬號admin,密碼為123123:
master:~/projs/as7/710/bin$ ./add-user.sh
Enter details of new user to add.
Realm (ManagementRealm) :
Username : admin
Password :
Re-enter Password :
About to add user 'admin' for realm'ManagementRealm'
Is this correct yes/no? yes
Added user 'admin' to file'master/as7/710/standalone/configuration/mgmt-users.properties'
Added user 'admin' to file'master/as7/710/domain/configuration/mgmt-users.properties'
可以看到系統為我們分別在domain和standalone創建了mgmt-users.properties,我們是用域模式運行,因此查看domain/configuration/mgmt-users.properties這個文件的最后一行:
admin=95333971266d87fbfa7d9963dd5e89d6
可以看到相關賬號密碼已經被創建。此時查看host.xml:
...
...
可以發現host.xml已經把安全配置應用起來了,使用ManagementRealm這個安全域進行認證。
同樣地,我們需要在slave主機上進行一模一樣的工作。
接下來,我們需要做一下slave對master的認證連接工作。slave要想和master建立域控關系,需要知道master的管理端賬號密碼。在域控這一塊,AS7對認證有要求:需要在域控制器上以過來連接的主機host名為用戶名添加賬號。
我們在slave的host.xml文件中指定了slave的host名為slave:
因此,master做為域控制器,需要在上面添加名為slave的管理員賬號,密碼仍為123123:
master:~/projs/as7/710/bin$ ./add-user.sh
Enter details of new user to add.
Realm (ManagementRealm) :
Username : slave
Password :
Re-enter Password :
About to add user 'admin' for realm'ManagementRealm'
Is this correct yes/no? yes
Added user 'slave' to file'master/as7/710/standalone/configuration/mgmt-users.properties'
Added user 'slave' to file'master/as7/710/domain/configuration/mgmt-users.properties'
這時再查看mgmt-users.properties,可以看到多了slave賬號:
admin=95333971266d87fbfa7d9963dd5e89d6
slave=f469d84edde53032bdac0a42bdedd810
接下來,我們要在slave主機的的host.xml做下認證配置,使用這個賬號與master進行認證通信:
上面的配置中有這些值得注意:
我們在認證域ManagementRealm中配置了server-identities,這個認證域用在與域控制器master的連接方面。其中secretvalue是domain上對應slave主機名的那個賬號的密碼,用base64加密。我們在master上面配置的slave賬號的密碼為123123,MTIzMTIz=則是123123的base64加密后的文字。這個配置用在連接domain-controller時進行認證:
有關更多的AS7的安全配置的信息,可查看官方文檔:
https://docs.jboss.org/author/display/AS7/Securing+the+Management+Interfaces
關于host.xml的詳細配置方法,也可參考as7目錄下自帶的xsd文檔:
docs/schema/jboss-as-config_1_1.xsd
配置完成后,接下來便到了實際部署的階段,我們將master和slave上面的AS7分別用domain.sh啟動起來。
[Server:server-one] 21:17:14,491 INFO[org.jboss.as] (Controller Boot Thread) JBossAS 7.0.0.CR1 "White Rabbit" started in 6029ms - Started 109 of 163services (54 services are passive or on-demand)
[Host Controller] 21:18:02,635 INFO[org.jboss.domain] (pool-3-thread-1)Registered remote slave host slave
啟動成功的話,應該可以在master上面看到上面的日志,slave被成功的注冊進來。
完成啟動后,我們需要將待使用的virtual-host啟動起來,當AS7以domain的方式啟動時,默認是不啟動任何virtual server,我們可以在domain.xml中配置默認加載virtual-host,也可以在服務器運行起來后,使用管理端命令動態的加載,在這里我準備使用后一種方式,從而講解AS7管理端的使用方法。
在AS7的bin目錄下面有一個jboss-admin.sh, 這是AS7提供的全新的管理工具,我們使用這個工具,連接至master:
./jboss-admin.sh
You are disconnected at the moment. Type'connect' to connect to the server or 'help' for the list of supportedcommands.
[disconnected /] connect 192.168.191.134
Connected to domain controller at192.168.191.134:9999
可以看到,我們已經連接到了master的9999管理端口。接下來可以查看”default”這個profile當中的web模塊的運行情況:
[domain@192.168.191.134:9999 /]/profile=default/subsystem=web:read-children-names(child-type=connector)
{
"outcome" => "success",
"result" => ["http"]
}
可見http服務器已經啟動,由于我們的”main-server-group”使用的是default這個profile,因此,服務器組中的兩臺host的web模塊接受profile的統一配置,都是已啟動的。繼續看一下web模塊中的細節:
[domain@192.168.191.134:9999 /]/profile=default/subsystem=web/connector=http:read-resource(recursive=true)
{
"outcome" => "success",
"result" => {
"protocol" =>"HTTP/1.1",
"scheme" => "http",
"socket-binding" => "http",
"ssl" => undefined,
"virtual-server" => undefined
}
}
注意到virtual-server的狀態是未定義(undefined),我們要想將一個web項目部署進服務器組中的各個host,就必須加載一個待部署的virtual-server,因此我們使用命令來添加:
[domain@192.168.191.134:9999 /]/profile=default/subsystem=web/virtual-server=other.com:add
{
"outcome" => "success",
"result" => {"server-groups" =>[("main-server-group" => {
"master" => {
"host" => "master",
"response" => {"outcome" =>"success"}
},
"slave" => {
"host" => "slave",
"response" => {
"outcome" => "success",
"result" => undefined
}
}
})]}
}
可以看到,我們之前在domain.xml中配置的“other.com”這個virtual host被成功添加了。
接下來是部署WEB應用的環節,我們首先用maven制作一個最簡單的web項目,僅包含一個歡迎頁面:
mvn archetype:generate-DgroupId=com.mycompany.app -DartifactId=my-webapp-DarchetypeArtifactId=maven-archetype-webapp
生成的項目如下:
|-- pom.xml
`-- src
`--main
|-- resources
`-- webapp
|-- WEB-INF
|`-- web.xml
`-- index.jsp
使用如下命令將項目打成WAR包:
mvn package
得到war:
target
`-- my-webapp.war
接下來是部署這個war包,對于本次實驗來講,關鍵的部分在于能否通過domain提供的servergroup管理功能,一次將一個項目部署進server group中的多臺服務器。我們接下來就驗證這點,順便看下AS7提供的WEB管理功能,打開WEB瀏覽器,訪問master的HTTP端口的管理地址:
http://192.168.191.134:9990/console/App.html
可以看到,管理頁識別出AS7正運行在domain模式之下,并且目前共有兩臺主機運行(左上角的列表分別列有master及slave)。我們要關注的是server-group:點擊右上角的”Server Groups”,進入服務器組的管理頁面,然后點擊左邊的”ManageDeployments”頁面,進入部署功能頁面:
可以看到,目前還沒有任何資源被加至服務器組,此時點擊右邊的”Add Content”功能,將my-webpp.war添加進Content Repository(域控制器用于保存待部署資源的目錄)。
然后點擊”Add To Group”將my-webapp.war添加至“main-server-group”,并將其enable。
此時我們預期的結果應該是my-webapp.war被同時部署至master及slave了,分別試著訪問master及slave的http資源,看看是否都部署上my-webapp這個應用了:
結果如我們所預期的那樣,兩臺服務器都可以訪問到這個部署的資源。通過對一個點(Domain Controller)的配置與部署,我們實現了多AS7服務器的集中管理。
小結
通過域這個概念,實現了多服務器統一管理,統一配置,資源統一部署的目標。通過集中管理,我們可以在此基礎上再進行群集的劃分與部署,實現群集內多臺服務器的單點配置與管理。可以說AS7的Domain概念的引入,與群集的概念組合在一起,通過一橫一從兩條軸,形成了完整的坐標系。
AS7的群集功能,從大的框架上來講承襲沿用以往版本的設計,核心仍是基于JGroup。
AS7的群集功能設計有了多方面改進:首先是簡化了配置文件,實現單點式配置;此外,AS7中引入了域的概念,通過域對群集內各主機實現了統一配置部署。
AS7開始,群集配置被大大簡化,并且當AS7運行在域控模式下時,群集默認是自發現,自啟動的。雖然配置變得更為傻瓜,但我們仍需了解一些技術細節,從而可以理解AS7為我們提供的默認群集配置,并根據自己的需要進行配置調整。下面是詳細講解:
AS7的群集配置主要集中在域控制器的配置文件domain.xml里。在domain.xml中,默認有兩個profile,一個是default,一個是ha:
...
...
其中,ha這個profile里面配置了群集的所需組件(ha的含義代表High Availability,高可用)。這其中主要包括JGroup,Infinispan和modcluster:
...
...
...
這三個組件都是構成AS7群集的要素:
* JGroup用與群集中多AS服務器之間的通信和連接。有關JGroup的詳細配置,需要對JGroup本身有一個了解,本文不詳細展開這一塊。
* Infinispan從AS7開始,開始代替JBossCache承擔緩存的功能
* modcluster負責Apache HTTPD與AS群集的連接工作。通過HTTPD作為前端,為用戶提供一個統一的群集訪問點,后面負責將負載分擔至群集內各節點。
有關Infinispan可以多說幾句:這個項目的引入是AS7的亮點之一,有興趣可以去它的項目網站上進行深入的了解:
http://www.jboss.org/infinispan
AS7利用Infinispan為多個模塊提供緩存服務,包括:
*為群集提供緩存
*為Hibernate提供二級緩存
*為Stateful Session Bean提供群集復制緩存
*為web項目的session群集復制提供緩存
這一點可以從剛剛提到的domain.xml中的ha配置中看到,我們稍微展開一下Infinispan子系統的配置:
...
...
...
...
可以看到,Infinispan為剛才說明的4個部分提供緩存。這塊已經完全替代了AS6及原有JBoss AS版本中的JBoss Cache。
接下來我們要看domain.xml中另一塊與群集相關的配置:
...
...
在協議層配置方面,我們發現有domain.xml為我們配置好了一個ha-sockets的端口綁定方案。最后,在server-group中,我們可以在domain.xml中發現一個配置好的,支持群集的服務器組:
可以看到,這個other-server-group使用了ha這個配置方案,并在協議層綁定至ha-sockets。
因此通過以上分析,如果我們想使用AS7提供的群集功能,在默認情況下,將項目部署至other-server-group這個服務器組即可。接下來是實際操作的過程:
配置好了域模式來啟動AS7。這里要說明一下,AS7的群集功能并不依賴于域管理功能,但是在AS7下,域管理功能和群集結合起來用是推薦的使用方式,通過域管理可以對群集內各AS服務器節點進行統一管理,非常方便。
按照《AS7配置說明》一文中的方法將master和slave兩臺主機運行起來。但有一點需要注意,我們要使用domain.xml中不同的服務器組來部署群集應用:
注意到在server-groups之中,有一個名為“other-server-group”的服務器組,默認使用ha配置方案,并且綁定至ha-sockets。部署在這個服務器組中的項目,將可以組建群集。
此外還有一點配置需注意,在master和slave的host.xml中,要為使用other-server-group的主機使用相同的端口offset。下面分別是master和slave中host.xml的相關配置。首先是master的配置:
...
the default socket-groupdeclared in the server-group -->
然后是slave中的host.xml配置:
the default socket-group declaredin the server-group -->
這里的重點是master和slave的端口port-offset都設定為250。因為我們要用這兩臺主機組建一個群集,如果兩個主機服務于不同的端口,那么將會在后續兩臺主機分擔請求時造成不必要的麻煩。此外,在本文中后續我們將使用mod_cluster來將用戶請求分派至JBoss AS群集內各節點,而mod_cluster需要群集內各JBoss AS節點服務于相同端口,才能保證正確地將請求分派。
下面再多說幾句關于host.xml中的server的port-offset的問題。為什么我們要設置port-offset呢?因此AS7支持同時運行多服務器,并且不同的服務器可以運行于不同的服務器組,這有點類似于Apache HTTPD中虛擬主機的概念,運行一個服務器,可以服務于多個域名,跑很多項目。
因此,如果AS同時跑著多個服務器,為避免端口沖突,就需要使用port-offset將不同的服務器置于不同的端口之下。比如:
類似上面這樣的配置,有三個服務器,第一個服務器綁定于默認設置的端口上,第二個服務器offset為150,第三個為250。那么,如果默認的服務端口號為8080,那么第二個服務器就是8080+150 = 8230,第三個則服務于8080+250= 8330端口,其它各服務端口依此類推。
通過使用offset配置,大大減少了重復的配置。AS7將所有端口的設置置于domain.xml的配置之中:
...
通過在domain.xml的socket-binding-groups中設置好服務的端口號,再在host.xml中配合port-offset的設置,就實現了多服務器的集中管理,簡化了配置工作。
和上文中介紹的一樣,我們還是用兩臺主機做實驗,域控制器為master,此外還有一臺域內主機slave。
然后我們創建一個測試用的項目,這個項目應該包含Session的群集復制。在web.xml中添加這樣一行就可以開啟session的群集復制了:
為了方便起見,我創建了一個demo項目在這里:
https://github.com/liweinan/cluster-demo
可以把代碼簽出使用maven進行編譯打包,然后通過域控制器部署至AS7。如果你在master及slave中的host.xml都將server-three設置成了啟動時自動加載:
...
注意到auto-start=true,那么兩臺主機啟動時,你可以看到群集組建的日志(因此server-three的服務器組為other-server-group,而如前所述,other-server-group使用了群集配置方案):
master上面的日志:
[Server:server-three] 14:27:28,581 INFO[stdout] (MSC service thread 1-2)
[Server:server-three] 14:27:28,582 INFO[stdout] (MSC service thread 1-2)-------------------------------------------------------------------
[Server:server-three] 14:27:28,582 INFO[stdout] (MSC service thread 1-2) GMS:address=server-three/web, cluster=web, physical address=192.168.191.134:55450
[Server:server-three] 14:27:28,582 INFO[stdout] (MSC service thread 1-2)-------------------------------------------------------------------
slave上面的日志:
[Server:server-three-slave] 14:28:02,779INFO[stdout] (MSC service thread 1-11)
[Server:server-three-slave] 14:28:02,779INFO[stdout] (MSC service thread 1-11)-------------------------------------------------------------------
[Server:server-three-slave] 14:28:02,779INFO[stdout] (MSC service thread 1-11)GMS: address=server-three-slave/web, cluster=web, physical address=192.168.191.2:55450
[Server:server-three-slave] 14:28:02,779INFO[stdout] (MSC service thread 1-11)-------------------------------------------------------------------
[Server:server-three-slave] 14:28:02,925INFO[org.jboss.as.clustering.CoreGroupCommunicationService.web] (MSC servicethread 1-9) JBAS010207: Number of cluster members: 2
以及我們可以看到群集復制及緩存也都加載了起來:
[Server:server-three-slave] 14:28:03,419INFO[org.jboss.as.clustering] (MSCservice thread 1-9) JBAS010301: Started repl cache from web container
[Server:server-three-slave] 14:28:03,419INFO[org.jboss.as.clustering] (MSCservice thread 1-8) JBAS010301: Started registry cache from web container
當然,如果將host.xml中的主機配置改為auto-start=false也沒有關系,只不過AS7在啟動時不會加載這些群集模塊,只有項目被部署至server-three時才會按需加載,從而提高AS7的第一次啟動時間。
啟動完成之后是部署cluster-demo應用,訪問域控制器的web控制端進行部署,需要注意的是要部署到server-three:
如果沒有什么問題的話,通過域控制器,這個項目就被同時部署到master及slave上面了。
我們可以試著分別訪問群集內兩個節點主機,注意到我們在host.xml配置server-three端口的offset為250,因此兩個節點服務于8080+250=8330端口:
可以看到,群集內兩個節點都跑起來了。我們接下來要使用這個群集,讓它們承擔負載平衡及并提供HA高可用。在這一點上,有多種方案可以選擇,比如基于硬件的群集控制器,基于協議層的LVS,或是nginx來分發請求至群集內的兩個節點。
但是AS7默認支持mod_cluster的方式是最方便的,mod_cluster也針對AS7做了很多優化工作,支持開箱即用,不需要很復雜的配置,因此本文下面將基于mod_cluster來講解群集的使用方法。
mod_cluster使用Apache HTTPD做為群集控制服務器,用戶訪問httpd提供的服務端口,然后由mod_cluster負責把請求轉給后端的AS7內群集各節點。
負載均衡原理如下圖:
mod_cluster的負載平衡計算策略是十分智能的,它通過監控群集內各服務器的性能使用情況,把請求按需進行分配。有關mod_cluster的詳細配置策略,可參考:
http://docs.jboss.org/mod_cluster/1.1.0/html_single/#LoadMetric
這里簡單介紹下安裝方法:
安裝Aapche httpd
分配用戶組:
# useradd-d /apache -u 701 -g 700 webadmin--把/apache目錄分配給jboss
# passwd webadmin--激活webadmin用戶
執行下列命令將/apache分配給webadmin用戶。
# cd /
# chown -R webadmin:jboss/apache
# chmod 755/apache
先卸載自帶的apache,再安裝新的apache。
1)我安裝的是apache2.2.22,那么安裝前要卸載系統自帶的apache2.0。避免沖突,rpm
–qa|grep httpd,系統會列出所有的httpd的包,我的是有個四個,下面需要一個一個卸載,rpm –e包的名稱,將他們卸載完畢,在這里不用輸入包的版本號,只是輸入名稱就可以卸載。卸載干凈后就可以安裝高版本的apache了。
注:有的包之間有連帶關系,需要注意卸載的先后順序。
注:有的包卸載會報依賴關系的通知,輸入:rpm -e包的名稱--nodeps
2)仿照jboss用戶建立,建立apache的組合用戶,用root用戶建立apache文件夾并分給apache用戶權限,但是apache用戶不能起”apache”這個名字,這個名字系統有了,換個名字起,如:webadmin。
3)下載Apache2222.tar.gz。并上傳至系統,放在/home的文件夾下面。
4)安裝:進入安裝文件所在目錄,解壓縮:
tar –zxvf Apache2222.tar.gz
完后會看到httpd的文件夾進入,配置:
./configure? --prefix=/apache/ \
--enable-module=so --enable-module=setenvif? --enable-module=rewrite \
--enable-rewrite=shared? --enable-proxy=shared --with-mpm=prefork \
--enable-so? --enable-auth-anon --enable-file-cache=shared \
--enable-disk-cache=shared? --enable-mem-cache=shared
接來下,編譯安裝
make clean
make
make install
從這里下載mod_cluster:
http://www.jboss.org/mod_cluster/downloads
我下載的是:
mod_cluster-1.1.3.Final-linux2-x64-so.tar.gz
然后將相關的包解壓到httpd的modules目錄:
/etc/httpd/modules$ tar zxvfmod_cluster-1.1.3.Final-linux2-x64-so.tar.gz
然后,編輯httpd.conf:
% vi /etc/httpd/conf/httpd.conf
首先要讓httpd偵聽到公共端口上,而不是默認的localhost:
Listen 192.168.191.134:80
我們在這個demo中,mod_cluster和master域控制器在一臺機器上,所以IP地址和master是一樣。但是mod_cluster并不要求AS的域控制器與其在一臺機器上,只要它們在一個子網即可通過IP Multicast來自動發現。此外,mod_cluster還支持廣域網組建群集,但我懷疑這種方式的實用性,并且也不是本文的重點,所以并不詳細展開協議層方面的細節。只需要理解一點就可以了:
*將你的mod_cluster+httpd服務器和你的與你的AS服務器置于一個子網。
然后是加載相關模塊:
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_ajp_modulemodules/mod_proxy_ajp.so
LoadModule slotmem_modulemodules/mod_slotmem.so
LoadModule manager_module modules/mod_manager.so
LoadModule proxy_cluster_modulemodules/mod_proxy_cluster.so
LoadModule advertise_modulemodules/mod_advertise.so
注意要把mod_proxy_balancer給disable掉,這個是和mod_proxy_cluster沖突的:
#LoadModule proxy_balancer_modulemodules/mod_proxy_balancer.so
最后是mod_proxy的相關配置:
Listen 192.168.191.134:6666
#Listen 127.0.0.1:8330
Order deny,allow
Deny from all
Allow from 192.168.191.
KeepAliveTimeout 60
MaxKeepAliveRequests 0
ManagerBalancerName other-server-group
AdvertiseFrequency 5
上面的重點在于這樣幾處:
Allow from 192.168.191.
我們的群集內各節點都處于192.168.191網段內,因此配置mod_cluster尋找這個網段內的所有節點。接下來是:
ManagerBalancerName other-server-group
AdvertiseFrequency 5
給群集起個名字,我們為方便說明,使用AS7中群集所在服務器組的名字:other-server-group。這個并沒有什么強制要求。AdvertiseFrequency是mod_cluster發現各節點的查詢間隔。這樣,有新的節點加入群集,或是從群集中去掉,mod_cluster都是自動配置。
最后是啟動httpd:
service httpd restart
查看httpd的日志,看看是否正常啟動了:
% tail -f /etc/httpd/logs/error_log
[Fri Jan 20 16:48:44 2012] [notice] Advertiseinitialized for process 6189
[Fri Jan 20 16:48:44 2012] [notice]Apache/2.2.15 (Unix) DAV/2 mod_cluster/1.1.x configured -- resuming normaloperations
如果有上述日志說明正常啟動了。如果有問題,任何時候日志都是你排錯的好朋友。接下來我們來啟動master和slave兩個AS服務器,啟動后,如果沒什么問題,可以發現兩臺AS服務器都已經被mod_cluster發現,并納入了mod_cluster的群集控制之下:
[Server:server-three-slave] 16:51:00,798INFO[org.infinispan.remoting.transport.jgroups.JGroupsTransport](Incoming-7,null) ISPN000094: Received new cluster view:[server-three-slave/web|7] [server-three-slave/web, server-three/web]
[Server:server-three] 16:51:07,676 INFO[org.jboss.modcluster.ModClusterService](ContainerBackgroundProcessor[StandardEngine[jboss.web]]) Engine [jboss.web]will use jvmRoute: a019cde8-113d-362c-992e-ea4abc1bf389
接下來我們試著訪問httpd的偵聽地址,看看請求是否被mod_cluster轉發至群集節點。
測試mod_cluster負載平衡
接下來我們試試群集的高可用, 我們這里要用到cluster-demo項目。下面是方案:
*在master上面訪問cluster-demo項目的put.jsp,設置一個session。
*斷掉master服務。
*訪問群集,訪問get.jsp
*預期結果:用戶的請求被轉到slave,并且session的數據沒有丟失。
接下來是實際操作:
首先訪問master的put.jsp:
然后我們將master的AS7服務器停掉,這時候slave上面的AS7開始報錯:
[Host Controller] 18:43:02,320 WARN[org.jboss.as.host.controller] (Thread-27)JBAS010900: Could not connect to remote domain controller 192.168.191.134:9999
報告連接不到域控制器。這個沒有關系,我們此時還是訪問群集節點:
會發現服務仍然可用,并且session數據沒有丟失。但查看slave的日志,發現請求實際由slave承擔了。整個實驗實現了我們的預期。
此時,將master重新啟動,發現master發現了slave,并重新接管域管理的工作。mod_cluster也發現了master并將其加入了群集節點,一切都是自動化的。
數據源(Data sources)
Datasources在通過子系統進行配置。聲明一個新的數據源,需要兩個步驟:提供一個JDBC驅動,然后定義一個使用這個JDBC驅動的數據源。
JDBC驅動安裝
在應用服務器中安裝JDBC驅動推薦使用一個常規的jar進行部署。因為當在域模式下運行應用服務器時,部署的內容會自動傳送到要部署的所有服務器上,因此使用jar文件將利用這一特性而不需要關心額外的事情。
任何符合JDBC4的啟動將會被自動識別并且按照名字和版本安裝到系統中。JDBC jar使用Java server provider機制進行識別。Jar文件中需要包含一個文件名是META-INF/services/java.sql.Driver的文本文件,這個文件中包含在這個jar里的驅動類的名稱。如果你的JDBC驅動jar不符合JDBC規范,我們通過其他方式也可以部署這樣的驅動。
修改Jar文件
最直接的方式是簡單的修改Jar文件添加缺失的文件。你可以通過一下命令添加:
The most straightforward solution is to simply modify the JAR and add themissing file. You can do
1.改變路徑到或者創建一個空的臨時文件夾.
2.創建一個META-INF子目錄
3.創建一個META-INF/services子目錄
4.創建一個只包含一行內容:JDBC驅動類的全名的文件META-INF/services/java.sql.Driver.
5.使用jar命令來跟新這個jar文件:
jar \-uf jdbc-driver.jar META-INF/services/java.sql.Driver
如何部署
JDBC4驅動
jar文件,請參考”應用部署“章節。
數據源定義(DatasourceDefinitions)
數據源在datasources子系統里定義:
jdbc:h2:mem:test;DB_CLOSE_DELAY=-1
h2
10
20
true
sa
sa
h2
jdbc:h2:mem:test
10
20
true
sa
sa
org.h2.jdbcx.JdbcDataSource
(參見standalone/configuration/standalone.xml)
如以上示例所示,數據源通過邏輯名來引用JDBC驅動.通過命令行(CLI)可以很方便的查詢同樣的信息:
[standalone@localhost:9999 /] /subsystem=datasources:read-resource(recursive=true)
{
"outcome" => "success",
"result" => {
"data-source" => {"java:/H2DS" => {
"connection-url" => "jdbc:h2:mem:test;DB_CLOSE_DELAY=-1",
"jndi-name" => "java:/H2DS",
"driver-name" => "h2",
"pool-name" => "H2DS",
"use-java-context" => true,
"enabled" => true,
"jta" => true,
"pool-prefill" => true,
"pool-use-strict-min" => false,
"user-name" => "sa",
"password" => "sa",
"flush-strategy" => "FailingConnectionOnly",
"background-validation" => false,
"use-fast-fail" => false,
"validate-on-match" => false,
"use-ccm" => true
}},
"xa-data-source" => undefined,
"jdbc-driver" => {"h2" => {
"driver-name" => "h2",
"driver-module-name" => "com.h2database.h2",
"driver-xa-datasource-class-name" => "org.h2.jdbcx.JdbcDataSource"
}}
}
}
[standalone@localhost:9999 /] /subsystem=datasources:installed-drivers-list
{
"outcome" => "success",
"result" => [{
"driver-name" => "h2",
"deployment-name" => undefined,
"driver-module-name" => "com.h2database.h2",
"module-slot" => "main",
"driver-xa-datasource-class-name" => "org.h2.jdbcx.JdbcDataSource",
"driver-class-name" => "org.h2.Driver",
"driver-major-version" => 1,
"driver-minor-version" => 2,
"jdbc-compliant" => true
}]
}
使用web控制臺和命令行可以極大的簡化JDBC驅動的部署和數據源的創建。
命令行方式提供了一些列的命令來創建和更改數據源:
[standalone@localhost:9999 /] help
Supported commands:
[...]
data-source- allows to add new, modify and remove existing data sources
xa-data-source- allows add new, modify and remove existing XA data sources
特定命令的詳細描述請使用”
-b”參數查詢。