【轉】JBoss AS 7中的新概念——域

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

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

對於使用過的JBoss AS過往版本的用戶,可能對AS所提供的集羣功能已經很熟悉了,所以在理解域的時候可能會遇到一點困擾.那麼域和集羣有什麼區別呢?在用法上有什麼不一樣呢?shell

總的來說,JBoss的羣集的目的是提供:瀏覽器

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

而域的目的則是將多臺服務器組成一個服務器組(Server Group),併爲一個服務器組內的多臺主機(Host)提供:安全

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

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

在沒有域的概念時,要想讓羣集內的多臺服務器或幾組服務器保持統一的配置,一個一個分別的去手工維護,是很是麻煩的事情,而域的引入解決了這一問題。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

這個目錄中包含了AS7運行在domain模式下所需的配置及內容,其中名爲「configuration」的目錄裏面含有咱們所須要的配置文件:
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.xml

<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>

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

  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

<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中須要配置的關鍵內容,已經針對要作的測試作了一些配置上面的修改,如下是詳細說明:

  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
<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>

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

  • slave裏面,host name指定爲"slave"。
  • domain-controller:指定爲master的IP:10.0.1.3,經過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:

<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文檔:

docs/schema/jboss-as-config_1_1.xsd

相關文章
相關標籤/搜索