JBoss AS7新加入了域(domain)的概念並實現了相關功能。域的提出及實現,其目的是使得多臺JBoss AS服務器的配置能夠集中於一點,統一配置、統一部署,從而在管理多臺JBoss AS服務器時,實現集中管理。本文詳細介紹如何使用AS7的這一新特性。html
域(Domain)的概念及其與羣集(Cluster)的區別web
對於使用過的JBoss AS過往版本的用戶,可能對AS所提供的集羣功能已經很熟悉了,所以在理解域的時候可能會遇到一點困擾.那麼域和集羣有什麼區別呢?在用法上有什麼不一樣呢?shell
總的來說,JBoss的羣集的目的是提供:瀏覽器
而域的目的則是將多臺服務器組成一個服務器組(Server Group),併爲一個服務器組內的多臺主機(Host)提供:安全
簡單來說,羣集的目標是讓多臺服務器分攤壓力,當一臺或多臺服務器當機時,服務能夠繼續保持運轉;而域的目標則是提供集中配置和管理多臺服務器的能力。服務器
在沒有域的概念時,要想讓羣集內的多臺服務器或幾組服務器保持統一的配置,一個一個分別的去手工維護,是很是麻煩的事情,而域的引入解決了這一問題。app
咱們能夠理解域和羣集的相互關係是"正交(orthogonal)"的:經過一橫一豎這兩條軸,JBoss AS爲咱們在運維方面提供了強大的可擴展能力。運維
實驗dom
熟悉了AS7中Domain的設計理念,接下來動手實際作個實驗,看看Domain是如何在AS7中工做的。webapp
準備工做
使用兩臺電腦作爲實驗器材,兩臺電腦的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目錄中的內容:
liweinan@mg:~/projs/jboss-7.0.0.CR1/bin$ ls domain.bat jboss-admin.bat standalone.conf wsconsume.sh domain.conf jboss-admin.sh standalone.conf.bat wsprovide.bat domain.conf.bat scripts standalone.sh wsprovide.sh domain.sh standalone.bat wsconsume.bat
在AS7之前版本中,用來啓動JBoss服務的 run.sh
不見了,取而代之的是 standalone.sh
(獨立運行模式)及 domain.sh
(域運行模式)。咱們稍後將使用 domain.sh
來運行JBoss AS7,但首先要將兩臺hosts配置好,接下來說解兩臺服務器的配置:
AS7的目錄結構和前一版本有很大不一樣,由於配置文件及其所在位置也有很大變更,下面是AS7的目錄結構:
bin docs jboss-modules.jar standalone bundles domain modules welcome-content
能夠看到有一個名爲"domain"的目錄,看一下這個domain目錄裏面的內容:
configuration content lib log servers
liweinan@mba:~/projs/jboss-7.0.0.CR1/domain/configuration$ ls domain-preview.xml host.xml mgmt-users.properties domain.xml host_xml_history 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 xmlns="urn:jboss:domain:1.0"> <extensions>... <system-properties>... <profiles> <profile name="default">... <profile name="ha">... </profiles> <interfaces>... <socket-binding-groups>... <server-groups> <server-group name="main-server-group" profile="default">... <server-group name="other-server-group" profile="ha">... </server-groups> </domain>
這個文件裏面有幾個部分是值得咱們關注一下的:
<host xmlns="urn:jboss:domain:1.0" name="master"> <management> <security-realms>... </security-realms> <management-interfaces> <native-interface interface="management" port="9999" /> <http-interface interface="management" port="9990"/> </management-interfaces> </management> <domain-controller> <local/> </domain-controller> <interfaces> <interface name="management"> <inet-address value="10.0.1.3"/> </interface> <interface name="public"> <inet-address value="10.0.1.3"/> </interface> </interfaces> <jvms>...</jvms> <servers> <server name="server-one" group="main-server-group">... </servers> </host>
上面是一些host.xml中須要配置的關鍵內容,已經針對要作的測試作了一些配置上面的修改,如下是詳細說明:
jboss-admin.sh
管理命令會使用這個端口;9990則提供基於WEB頁面的管理端。咱們等一下兩種管理端口都會用到。Slave這臺機器不做爲域控制器而存在,所以不須要管它,也能夠將domain.xml刪掉或更名。
<host xmlns="urn:jboss:domain:1.0" name="slave"> <management> .. </management> <domain-controller> <remote host="10.0.1.3" port="9999"/> </domain-controller> <interfaces> <interface name="management"> <inet-address value="10.0.1.18"/> </interface> <interface name="public"> <inet-address value="10.0.1.18"/> </interface> </interfaces> <jvms>...</jvms> <servers> <server name="server-one" group="main-server-group">... </servers> </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:
<management> <security-realms> <security-realm name="ManagementRealm"> <authentication> <properties path="mgmt-users.properties" relative-to="jboss.domain.config.dir"/> </authentication> </security-realm> </security-realms> <management-interfaces> <native-interface security-realm="ManagementRealm">...</native-interface> <http-interface security-realm="ManagementRealm">...</http-interface> </management-interfaces> </management>
能夠發現host.xml已經把安全配置應用起來了,使用ManagementRealm這個安全域進行認證。
接下來,咱們須要作一下slave對master的認證鏈接工做。slave要想和master創建域控關係,須要知道master的管理端帳號密碼。在域控這一塊,AS7對認證有要求:須要在域控制器上以過來鏈接的主機host名爲用戶名添加帳號。
咱們在slave的host.xml文件中指定了slave的host名爲slave:
<host xmlns="urn:jboss:domain:1.0" name="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進行認證通訊:
<management> <security-realms> <security-realm name="ManagementRealm"> <server-identities> <secret value="MTIzMTIz="/> </server-identities> <authentication> <properties path="mgmt-users.properties" relative-to="jboss.domain.config.dir"/> </authentication> </security-realm> </security-realms> <management-interfaces> <native-interface security-realm="ManagementRealm"> <socket interface="management" port="9999"/> </native-interface> <http-interface security-realm="ManagementRealm"> <socket interface="management" port="9990"/> </http-interface> </management-interfaces> </management> <domain-controller> <remote host="10.0.2.1" port="9999" security-realm="ManagementRealm" /> <!-- Alternative remote domain controller configuration with a host and port --> <!-- <remote host="192.168.100.1" port="9999"/> --> </domain-controller>
上面的配置中有這些值得注意:
<server-identities> <secret value="MTIzMTIz="/> </server-identities>
咱們在認證域ManagementRealm中配置了server-identities,這個認證域用在與域控制器master的鏈接方面。其中secret value是domain上對應slave主機名的那個帳號的密碼,用base64加密。咱們在master上面配置的slave帳號的密碼爲123123,MTIzMTIz=則是123123的base64加密後的文字。這個配置用在鏈接domain-controller時進行認證:
<domain-controller> <remote host="10.0.2.1" port="9999" security-realm="ManagementRealm" /> </domain-controller>
演示
配置完成後,接下來便到了實際部署的階段。 咱們將master和slave上面的AS7前後分別用domain.sh
啓動起來。 啓動成功的話,應該能夠在master的日誌中看到slave被成功註冊進來:
[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) [Host Controller] 21:18:02,635 INFO [org.jboss.domain] (pool-3-thread-1) Registered remote slave host 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:
./jboss-admin.sh You are disconnected at the moment. Type 'connect' to connect to the server or 'help' for the list of supported commands. [disconnected /] connect 10.0.1.3 Connected to domain controller at 10.0.1.3:9999
能夠看到,咱們已經鏈接到了master的9999管理端口。接下來能夠查看"default"這個profile當中的web模塊的運行狀況:
[domain@10.0.1.3: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@10.0.1.3: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@10.0.1.3: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 clean package
target `-- my-webapp.war
接下來是部署這個war包,對於本次實驗來說,關鍵的部分在於可否經過domain提供的server group管理功能,一次將一個項目部署進server group中的多臺服務器。咱們接下來就驗證這點,順便看下AS7提供的WEB管理功能,打開WEB瀏覽器,訪問master的HTTP端口的管理地址:
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概念的引入,與羣集的概念組合在一塊兒,經過一橫一從兩條軸,造成了完整的座標系。
參考資料
http://community.jboss.org/wiki/DomainRequirements – AS7 Domain需求文檔
http://community.jboss.org/wiki/DomainManagementModelDesign – AS7 Domain 管理模型設計文檔
http://community.jboss.org/en/jbossas/as7_users?view=discussions – AS7 用戶社區
http://community.jboss.org/en/jbossas/dev/jboss_as7_development?view=discussion s– AS7 開發社區
https://docs.jboss.org/author/display/AS7/Admin+Guide – AS7 管理員手冊
有關更多的AS7的安全配置的信息,可查看官方文檔:
https://docs.jboss.org/author/display/AS7/Securing+the+Management+Interfaces
關於host.xml的詳細配置方法,也可參考as7目錄下自帶的xsd文檔: