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