JBoss AS7 域、部署項目和域名綁定


JBoss AS7新加入了域(domain)的概念並實現了相關功能。域的提出及實現,其目的是使得多台JBoss AS服務器的配置可以集中於一點,統一配置、統一部署,從而在管理多台JBoss AS服務器時,實現集中管理。本文詳細介紹如何使用AS7的這一新特性。

域(Domain)的概念及其與群集(Cluster)的區別

對於使用過JBoss AS過往版本的用戶,可能對AS所提供的群集功能已經很熟悉了,在理解域的時候可能會遇到困難。那么域和群集有什么區別,用處上有什么不同呢?

總的來講,JBoss的群集的目的是提供:

  • 負載平衡(Load Balance)
  • 高可用(High Availablity)

而域的目的則是將多台服務器組成一個服務器組(Server Group),並為一個服務器組內的多台主機(Host)提供:

  • 單點集中配置(通過一個域控制器,即Domain Controller,實現組內主機的統一配置)
  • 單點統一部署,通過域控制器將項目一次部署至組內全部主機。

簡單來講,群集的目標是讓多台服務器分攤壓力,當一台或多台服務器當機時,服務可以繼續保持運轉;而域的目標則是提供集中配置和管理多台服務器的能力。

在沒有域的概念時,要想讓群集內的多台服務器或幾組服務器保持統一的配置,一個一個分別的去手工維護,是非常麻煩的事情,而域的引入解決了這一問題。

我們可以理解域和群集的相互關系是"正交(orthogonal)"的:通過一橫一豎這兩條軸,JBoss AS為我們在運維方面提供了強大的可擴展能力。

實驗

熟悉了AS7中Domain的設計理念,接下來動手實際做個實驗,看看Domain是如何在AS7中工作的。

准備工作

使用兩台電腦做為實驗器材,兩台電腦的IP分別為 10.0.1.3 及 10.0.1.18 ,分別運行JBoss AS7,並組成一個服務器組(Server Group)。其中,使用 10.0.1.3 這台機器做為域控制器(Domain Controller):

如上圖所示,兩台主機分別被命名為”master“及”slave“。通過配置,將master與slave組成一個服務器組,名為’main-server-group’,其中master將做為這個服務器組的域控制器。

需要說明一點的是,服務器組(Server Group)可以由多台服務器(Host)組成,並不一定只有兩台,所以不要被master及slave這樣的名字給迷惑了,以為一個服務器組僅支持一主一從兩台hosts。

本文中因為只使用兩台服務器做為實驗器材,因此出於方便角度將它們分別命名為master及slave。

此外,在一個服務器組中,只有一台域控制器,在本實驗中我們將使用master這台機器做為domain controller。

配置

AS7由於經過了重新設計,因此在目錄結構與配置文件上面與前一版本有了很大不同,對於熟悉了對AS6的配置和的人來講,使用AS7會接觸不少新概念和新思路。為了清楚表達,我會將一些與AS6及以前版本不同的地方做出必要的說明。

首先是bin目錄中的內容:

1 liweinan@mg:~/projs/jboss-7.0.0.CR1/bin$ ls
2 domain.bat         
jboss-admin.bat     standalone.conf     wsconsume.sh
3 domain.conf        
jboss-admin.sh      standalone.conf.bat wsprovide.bat
4 domain.conf.bat    
scripts             standalone.sh       wsprovide.sh
5 domain.sh          
standalone.bat      wsconsume.bat

在AS7以前版本中,用來啟動JBoss服務的 run.sh 不見了,取而代之的是 standalone.sh(獨立運行模式)及 domain.sh (域運行模式)。我們稍后將使用 domain.sh 來運行JBoss AS7,但首先要將兩台hosts配置好,接下來講解兩台服務器的配置:

AS7的目錄結構和前一版本有很大不同,因為配置文件及其所在位置也有很大變動,下面是AS7的目錄結構:

1 bin              
docs              jboss-modules.jar standalone
2 bundles          
domain            modules           welcome-content

可以看到有一個名為"domain"的目錄,看一下這個domain目錄里面的內容:

1 configuration
content       lib           log           servers

這個目錄中包含了AS7運行在domain模式下所需的配置及內容,其中名為“configuration”的目錄里面含有我們所需要的配置文件:

1 liweinan@mba:~/projs/jboss-7.0.0.CR1/domain/configuration$ ls
2 domain-preview.xml   
host.xml              mgmt-
users.properties
3 domain.xml           
host_xml_history
4 domain_xml_history   
logging.properties

其中 domain.xml 和 host.xml 是我們需要關注的內容。我們需要對master及slave上面的配置文件分別進行配置:

從上圖中可以看到,master的JBoss AS中需要配置 domain.xml 及 host.xml 兩個文件,其中 domain.xml 是做為域控制器必須配置的內容, host.xml 則是master及slave各自的JBoss AS都需要配置的文件。我們先從master上面的配置看起:

Master上面的配置

  • domain.xml
01 <domain xmlns="urn:jboss:domain:1.0">
02  
03     <extensions>...
04      
05     <system-properties>...
06      
07     <profiles>
08         <profile name="default">...
09          
10         <profile name="ha">...
11     </profiles>
12      
13     <interfaces>...
14          
15     <socket-binding-groups>...
16      
17     <server-groups>
18         <server-group name="main-server-group"profile="default">...
19         <server-group name="other-server-group"profile="ha">...
20     </server-groups>
21      
22 </domain>

這個文件里面有幾個部分是值得我們關注一下的:

  1. extensions – 這一部分定義了域中服務器在啟動時需要加載的模塊。AS7使用了全新設計的JBoss Modules來加載模塊,大幅提高了服務器的啟動。這一內容不是本文講解重點,后續我會專門寫一篇文章來介紹。目前了解到這一程度即可。
  2. profiles – profiles是domain中定義的一個核心概念,也是domain的核心組成部分。基於profiles,AS7便實現了域中各服務器的統一集中配置:用戶可通過profile對各子系統(subsystem)進行配置,完成后將profile配置給某個或多個服務器組,各服務器組內的主機共用一份配置。
  3. server groups – 服務器組的概念已經在前面的介紹中一再提及,也是AS7的域的設計中一個核心組成部分。在這里,AS7默認定義了兩個服務器組:main-server-group及other-server-group,它們分別使用’default’ profile及’ha’ profile。在本實驗中,我們將使用main-server-group。
  • host.xml
01 <host xmlns="urn:jboss:domain:1.0" name="master">
02  
03     <management>
04         <security-realms>...
05           <management-interfaces>
06           <native-interface interface="management"port="9999" />
07           <http-interface interface="management"port="9990"/>
08        </management-interfaces>
09     </management>
10  
11     <domain-controller>
12        <local/>
13     </domain-controller>
14  
15     <interfaces>
16         <interface name="management">
17             <inet-address value="10.0.1.3"/>
18         </interface>
19         <interface name="public">
20            <inet-address value="10.0.1.3"/>
21         </interface>
22     </interfaces>
23  
24     <jvms>...
25      
26     <servers>
27         <server name="server-one" group="main-server-group">...
28     </servers>
29 </host>

上面是一些host.xml中需要配置的關鍵內容,已經針對要做的測試做了一些配置上面的修改,以下是詳細說明:

  1. host name按照我們的需要改成了"master"。
  2. management – management定義了服務器的管理端口,其中:9999端口是所謂"native"二進制端口,后面的 jboss-admin.sh 管理命令會使用這個端口;9990則提供基於WEB頁面的管理端。我們等一下兩種管理端口都會用到。
  3. domain controller – 定義本服務器所需連接的domain控制器所在地址,因為master本身就是domain controller,所以連接至本機localhost即可。
  4. interfaces – management及public接口服務所在的地址,我們要將其設為slave可以訪問到的IP地址,保證slave可以連接至host
  5. servers – 一個物理主機實際上可以同時運行多台JBoss AS7的Server,而每一台Server都可以配置到不同的服務器組去。在本實驗中,我們使用最簡的情況,master上面只跑一個server-one,屬於main-server-group,把其它AS7默認設定的server可以都刪掉,只留server-one。

Slave上面的配置

  • domain.xml

Slave這台機器不作為域控制器而存在,因此不需要管它,也可以將domain.xml刪掉或改名。

  • host.xml
01 <host xmlns="urn:jboss:domain:1.0" name="slave">
02  
03     <domain-controller>
04        <remote host="10.0.1.3" port="9999"/>
05     </domain-controller>
06  
07     <interfaces>
08         <interface name="management">
09             <inet-address value="10.0.1.18"/>
10         </interface>
11         <interface name="public">
12            <inet-address value="10.0.1.18"/>
13         </interface>
14     </interfaces>
15  
16     <jvms>...
17      
18     <servers>
19         <server name="server-one" group="main-server-group">...
20     </servers>
21 </host>

上面的配置有幾點需要說明:

  • slave里面,host name指定為"slave"。
  • domain-controller:指定為master的IP:10.0.1.3,通過9999管理端口進行通訊。
  • slave上面,屬於main-server-group的server也命名為"server-one",這會和master上面的server沖突嗎?實際上不會,因為兩台同樣名字的server運行在不同的host當中。

部署

配置完成后,接下來便到了實際部署的階段,我們將master和slave上面的AS7分別用domain.sh 啟動起來。

1 [Server:server-one]
21:17:14,491 INFO  [org.jboss.as] (Controller Boot Thread) JBoss AS 7.0.0.CR1 
"White Rabbit"started in 6029ms - Started 109 of 163 services (54 services are passive or on-demand)
2 [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的(在我目前使用的7.0.0 CR1 White Rabbit版本中是這樣),我們可以在 domain.xml 中配置默認加載virtual-host,也可以在服務器運行起來后,使用管理端命令動態的加載,在這里我准備使用后一種方式,從而講解AS7管理端的使用方法。

在AS7的bin目錄下面有一個 jboss-admin.sh , 這是AS7提供的全新的管理工具,我們使用這個工具,連接至master:

1 ./jboss-admin.sh
2 You
are disconnected at the moment. Type 
'connect' to connect to the server or 'help' for the list of supported commands.
3 [disconnected
/] connect 10.0.1.3
4 Connected
to domain controller at 10.0.1.3:9999

可以看到,我們已經連接到了master的9999管理端口。接下來可以查看"default"這個profile當中的web模塊的運行情況:

1 [domain@10.0.1.3:9999
/] /profile=default/subsystem=web:
read-children-names(child-type=connector)
2 {
3     "outcome" => "success",
4     "result" => ["http"]
5 }

可見http服務器已經啟動,由於我們的"main-server-group"使用的是default這個profile,因此,服務器組中的兩台host的web模塊接受profile的統一配置,都是已啟動的。繼續看一下web模塊中的細節:

01 [domain@10.0.1.3:9999
/] /profile=default/subsystem=web/connector=http:
read-resource(recursive=true)
02 {
03     "outcome" => "success",
04     "result" => {
05         "protocol" => "HTTP/1.1",
06         "scheme" => "http",
07         "socket-binding" => "http",
08         "ssl" => undefined,
09         "virtual-server" => undefined
10     }
11 }

注意到virtual-server的狀態是未定義(undefined),我們要想將一個web項目部署進服務器組中的各個host,就必須加載一個待部署的virtual-server,因此我們使用命令來添加:

01 [domain@10.0.1.3:9999
/] /profile=default/subsystem=web/virtual-server=other.com:add  
02 {
03     "outcome" => "success",
04     "result" => {"server-groups" => [("main-server-group" => {
05     "master" => {
06         "host" => "master",
07         "response" => {"outcome" => "success"}
08     },
09     "slave" => {
10         "host" => "slave",
11         "response" => {
12             "outcome" => "success",
13             "result" => undefined
14         }
15     }
16 })]}
17 }

可以看到,我們之前在 domain.xml 中配置的 “other.com” 這個 virtual host被成功添加了。

接下來是部署WEB應用的環節,我們首先用maven制作一個最簡單的web項目,僅包含一個歡迎頁面:

1 mvn
archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-webapp -DarchetypeArtifactId=maven-archetype-webapp

生成的項目如下:

1 .
2 |--
pom.xml
3 `--
src
4     `-- main
5         |-- resources
6         `-- webapp
7             |-- WEB-INF
8             |   `-- web.xml
9             `-- index.jsp

使用如下命令將項目打成WAR包:

1 mvn
package

得到war:

1 target
2 `--
my-webapp.war

接下來是部署這個war包,對於本次實驗來講,關鍵的部分在於能否通過domain提供的server group管理功能,一次將一個項目部署進server group中的多台服務器。我們接下來就驗證這點,順便看下AS7提供的WEB管理功能,打開WEB瀏覽器,訪問master的HTTP端口的管理地址:

1 http://10.0.1.3:9990/console/App.html

可以看到,管理頁識別出AS7正運行在domain模式之下,並且目前共有兩台主機運行(左上角的列表分別列有master及slave)。我們要關注的是server-group:點擊右上角的"Server Groups",進入服務器組的管理頁面,然后點擊左邊的"Manage Deployments"頁面,進入部署功能頁面:

可以看到,目前還沒有任何資源被加至服務器組,此時點擊右邊的"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的項目部署方式與原有版本相比有了較大變化,本文通過實例來講解AS7中的項目部署方式。

有關JBoss AS7的下載和安裝,請參考藍點上面的另一篇文章: JBoss AS7 快速上手

部署一個簡單的Web項目

下載安裝完成后,我們用standalone方式來啟動JBoss AS71 :

1 liweinan@smart:~/projs/jboss-7.0.0.CR1/bin$
./standalone.sh

啟動后,我們試着向AS7中部署一個簡單的項目。首先使用Maven來創建一個簡單的Web工程:

1 mvn
archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-webapp -DarchetypeArtifactId=maven-archetype-webapp

生成的項目如下:

1 .
2 |--
pom.xml
3 `--
src
4     `-- main
5         |-- resources
6         `-- webapp
7             |-- WEB-INF
8             |   `-- web.xml
9             `-- index.jsp

使用如下命令將項目打成WAR包:

1 mvn
package

得到war:

1 target
2 `--
my-webapp.war

接下來,我們將這個war部署進AS7。在AS7的根目錄下,有一個名為’standalone’的目錄,當AS7以standalone模式運行時,我們要將項目部署到這里面,進入到standalone目錄:

1 liweinan@smart:~/projs/jboss-7.0.0.CR1$ cd standalone
2 liweinan@smart:~/projs/jboss-7.0.0.CR1/standalone$ ls
3 configuration
deployments   log
4 data         
lib           tmp
5 liweinan@smart:~/projs/jboss-7.0.0.CR1/standalone$

standalone目錄中包含許多運行所需的內容,比如’configuration’目錄包含了服務器的有關配置,我們稍后會進行說明。現在我們要關心的是’deployments’目錄,我們要將需要部署的項目放在這里,JBoss AS7會自動掃描這個目錄並進行部署。我們將剛剛制作好的 my-webapp.war 拷貝至deployments目錄:

1 liweinan@smart:~/projs/my-webapp/target$ cp my-webapp.war ~/projs/jboss-7.0.0.CR1/standalone/deployments/

此時查看AS7的日志輸出:

1 16:12:33,822
INFO  [org.jboss.as.server.deployment] (MSC service thread 1-6) Starting deployment of 
"my-webapp.war"
2 16:12:36,616
INFO  [org.jboss.web] (MSC service thread 1-4) registering web context: /my-webapp
3 16:12:36,740
INFO  [org.jboss.as.server.controller] (DeploymentScanner-threads - 2) Deployed 
"my-webapp.war"

從日志中可以看出,項目被成功地部署進了AS7。我們試着訪問下已部署的服務:

AS7中項目的自動部署及手工部署

我們在上一節通過將項目拷貝至deployments目錄,就實現了AS7對項目的自動掃描及自動部署。實際上AS7還支持手工的部署模式,這樣,我們就可以控制項目的部署及啟動時機。配置AS7的部署模式有兩種方式:一個是通過在配置文件指定,另一個是在AS7運行時,通過管理端來進行實時的配置。

我們首先來看一下配置文件中的內容,JBoss AS7相對以前版本比較,大大簡化了精減了配置文件的數量。原來的 *-ds.xml 等數據庫的配置文件,都被合並至了統一的配置文件: standalone.xml 3 。這個文件位於剛才提到的 /standalone/configuration 目錄當中,詳細講解這個配置文件也不是這篇文章要關注的地方,因此我們只需要了解一下這個配置文件中,與部署有關的這段內容4 :

1 <subsystem xmlns="urn:jboss:domain:deployment-scanner:1.0">
2    <deployment-scanner scan-interval="5000"
3       relative-to="jboss.server.base.dir" path="deployments"/>
4 </subsystem>

可以看到,配置中指定 deployment-scanner 去掃描deployments目錄,掃描間隔為5秒鍾。

除了在配置文件中進行配置,我們也可以在AS7實時運行時,通過管理端來改變AS7的部署方式。首先是登錄到管理端,使用AS7中bin目錄中帶有的管理端連接程序 jboss-admin.sh

1 liweinan@smart:~/projs/jboss-7.0.0.CR1/bin$
./jboss-admin.sh
2 You
are disconnected at the moment. Type 
'connect' to connect to the server or 'help' for the list of supported commands.
3 [disconnected
/] connect 127.0.0.1
4 Connected
to standalone controller at 127.0.0.1:9999
5 [standalone@127.0.0.1:9999
/]

連接成功后,我們可以查看當前的scanner配置:

01 [standalone@127.0.0.1:9999
/] /subsystem=deployment-scanner:
read-resource(recursive=true)
02 {
03     "outcome" => "success",
04     "result" => {"scanner" => {"default" => {
05         "auto-deploy-exploded" => false,
06         "auto-deploy-zipped" => true,
07         "deployment-timeout" => 60L,
08         "name" => "default",
09         "path" => "deployments",
10         "relative-to" => "jboss.server.base.dir",
11         "scan-enabled" => true,
12         "scan-interval" => 5000
13     }}}
14 }

如上所示,和配置文件中對應的配置是一致的。我們可以移除這個自動掃描的scanner:

1 [standalone@127.0.0.1:9999
/] /subsystem=deployment-scanner/scanner=default:remove
2 {"outcome" => "success"}

此時再次查看:

1 [standalone@127.0.0.1:9999
/] /subsystem=deployment-scanner:
read-resource(recursive=true)