JBOSS7集群配置说明
第一节 前言
JBOSS7具有独立模式(standalone)和域模式(domain)两种运行方式。独立模式(standalone)是单机器单进程方式,配置布署简单,适用于一般单服务器项目。域模式(domain)是多机器多进程方式,配置稍复杂,适用于大型分布式项目。如果要集群布署项目,最简单的方式就是使用域模式(domain)。
当使用域模式(domain)时,一台机器上的一个JBOSS7应用(host)可以开启多个Web Server,将一个JBOSS7应用(host)作为主控制服务器,就能控制管理其它机器上的JBOSS7应用(host),这样理论上通过增加机器,我们就可以获得无限个Web Server。把我们的JAVA项目通过主控制服务器布署到这些Web Server上,再通过httpd+mod_cluster,就能获得集群功能。
mod_cluster是JBOSS开发的专门用于集群的httpd模块,JBOSS7应该已内置有mod_cluster模块并已配置好,JBOSS官网也提供了配置好mod_cluster的httpd项目,我们只需下载使用即可。
注意:JBOSS中文文档很少,项目本身的版本更新又频繁,因此初学者不易掌握,容易走入误区。请根据本文的写作顺序,并下载指定的程序版本,确保程序版本匹配。调试环境除httpd+mod_cluster和jboss7独立模式(standalone)可以在windows系统下以外,jboss7域模式(domain)一定要用linux环境,否则无法调试通过
第二节 httpd+ mod_cluster安装、配置、运行
作为初学者,最好先把httpd+mod_cluster调试成功后再往后进行,网上的资料多是针对熟悉linux、jboss、httpd的读者,因此有不同程度的内容缺失,请按本文的介绍操作。
一 下载、安装、运行httpd+mod_cluster
访问http://www.jboss.org/mod_cluster/downloads/1-2-0-Final下载mod_cluster-1.2.0.Final-linux2-x64-ssl.tar.gz(windows下是mod_cluster-1.2.0.Final-windows-x86-ssl)。注意版本是1.2.0.Final,因为我们后面用的是jboss-as-7.1.1.Final,它内置的是mod_cluster-1.2.0.Final版本。还要注意这里下载的是httpd+mod_cluster,也就是包含了httpd的程序,所以文件大小应该是8-9M,而不是只有几百K,只包含几个so文件的程序。网上一般介绍的是下载只包含几个so文件的程序,然后修改linux自带的httpd配置,但是根据测试发现linux自带的httpd版本和我们需要的mod_cluster不匹配,无法配置成功。所以我们要下载包含完全httpd程序的mod_cluster文件。
在linux命令行下输入tar –zxvf mod_cluster-1.2.0.Final-windows-x86-ssl解压文件包,解压后第一件事就是进入opt/jboss/httpd/sbin目录输入./installhome.sh(windows下是httpd-2.2\bin\installconf.bat),生成默认配置。注意这一步不能缺,如果不先生成默认配置,我们后面就没法根据需要修改配置文件。
接着修改opt/jboss/httpd/httpd/conf/httpd.conf文件内容(可以用SSH Secure File Transfer Client把文件下载下来修改保存后再上传上去):
Listen 8000改成
Listen 192.168.1.204:80
#ServerName localhost:8000 改成
ServerName 192.168.1.204:80
文件最下面的
<IfModule manager_module>
Listen 127.0.0.1:6666
ManagerBalancerName mycluster
<VirtualHost 127.0.0.1:6666>
<Location />
Order deny,allow
Deny from all
Allow from 127.0.0.1
</Location>
KeepAliveTimeout 300
MaxKeepAliveRequests 0
#ServerAdvertise on http://127.0.0.1:6666
AdvertiseFrequency 5
#AdvertiseSecurityKey secret
#AdvertiseGroup 224.0.1.105:23364
EnableMCPMReceive
<Location /mod_cluster_manager>
SetHandler mod_cluster-manager
Order deny,allow
Deny from all
Allow from 127.0.0
</Location>
</VirtualHost>
</IfModule>
改成
<IfModule manager_module>
Listen 192.168.1.204:6666
ManagerBalancerName mycluster
<VirtualHost *:6666>
<Location />
Order deny,allow
Deny from all
Allow from all
</Location>
KeepAliveTimeout 300
MaxKeepAliveRequests 0
#ServerAdvertise on http://127.0.0.1:6666
AdvertiseFrequency 5
AdvertiseSecurityKey1234567890
#AdvertiseGroup 224.0.1.105:23364
EnableMCPMReceive
AllowDisplay On
<Location /mod_cluster_manager>
SetHandler mod_cluster-manager
Order deny,allow
Deny from all
Allow from all
</Location>
</VirtualHost>
</IfModule>
基本上改动的就是把127.0.0.1换成本机局域网IP,Listen192.168.1.204:80是监听IP和端口,这样httpd才会处理访问访问这个IP端口的请求,ServerName 192.168.1.204:80是对外的访问地址,当服务器有DNS功能时,可以改成ServerName www.example.com:80,由DNS来解析域名的IP。注意,本机必须处在一个局域网内并分配有IP,否则可能调试不过。必须启用AdvertiseSecurityKey并设置好密码,没有密码jboss7.1.1.Final无法连接mod_cluster,这是网上多数资料没有讲到的。AllowDisplayOn是显示详细内容,开启后才能看出有没有连接成功的消息。
进入opt/jboss/httpd目录运行./sbin/apachectl start(windows直接运行bin/httpd),注意不要直接进入sbin目录再运行./apachectl start,因为这会运行linux自带的httpd程序,而不是我们这里的httpd(很奇怪的问题)。命令功能运行后应该没有任何输出就直接结束,如果有输入信息,就可能表示有问题。成功启动后,通过浏览器访问http://192.168.1.204,正常情况下页面上会显示It works!文字,如果显示的是apache的介绍页面,则说明你启动的可能是红帽linux自带的apache程序,而不是我们这里使用的httpd程序。再访问http://192.168.1.204:6666/mod_cluster_manager,注意是mod_cluster_manager而不是mod_cluster-manager,“_”和“-”的区别。出现这个画面表示运行正常:
二 用jboss7独立模式(standalone)来检验mod_cluster的配置结果
访问https://www.jboss.org/jbossas/downloads.html下载jboss-as-7.1.1.Final,
解压缩后进入standalone\configuration目录,删除standalone.xml文件,将standalone-full-ha.xml重命名为standalone.xml文件,因为mod_cluster缺省配置都在standalone-full-ha.xml中,现在我们要使用standalone-full-ha.xml内的配置来运行jboss7。修改文件内容:
<serverxmlns="urn:jboss:domain:1.2">
改为
<server name="standalone-node1"xmlns="urn:jboss:domain:1.2">
<mod-cluster-configadvertise-socket="modcluster">
改为
<mod-cluster-configadvertise-socket="modcluster" advertise-security-key="1234567890">
<subsystemxmlns="urn:jboss:domain:web:1.1"default-virtual-server="default-host" native="false">
改为
<subsystemxmlns="urn:jboss:domain:web:1.1"default-virtual-server="default-host" native="false" instance-id="${jboss.node.name}">
<interfaces>
<interfacename="management">
<inet-addressvalue="${jboss.bind.address.management:127.0.0.1}"/>
</interface>
<interfacename="public">
<inet-addressvalue="${jboss.bind.address:127.0.0.1}"/>
</interface>
<interfacename="unsecure">
<inet-addressvalue="${jboss.bind.address.unsecure: 127.0.0.1}"/>
</interface>
</interfaces>
改为
<interfaces>
<interfacename="management">
<inet-addressvalue="${jboss.bind.address.management:192.168.1.204}"/>
</interface>
<interfacename="public">
<inet-addressvalue="${jboss.bind.address:192.168.1.204}"/>
</interface>
<interfacename="unsecure">
<inet-addressvalue="${jboss.bind.address.unsecure:192.168.1.204}"/>
</interface>
</interfaces>
name="standalone-node1"是添加Server名称,advertise-security-key="1234567890"是在httpd配置中定义的AdvertiseSecurityKey,没有这个则连接不上httpd+mod_cluster,instance-id="${jboss.node.name}"是JBOSS7.1.1.Final的bug,如果不添加此项,则mod_cluster无法找到Node节点名称。
配置完成后,进入bin目录,运行./standalone.sh, 启动后通过浏览器访问http://192.168.1.204:6666/mod_cluster_manager,依然和刚才一样并无变化。接下来要在服务器上布署项目才能看得出变化。先停止jboss7。
https://github.com/liweinan/cluster-demo下载cluster-demo-master.zip,解压后将里面的内容手工打包为cluster.war文件,cluster.war文件是一个很简单的web项目,唯一不同的是项目内的web.xml文件中多了一行<distributable/>,这个标记会开启jboss cluster功能。将cluster.war拷贝到standalone\deployments目录中,再启动./standalone.sh。
注意观察命令行,如果jboss7正常启动mod_cluster功能,会出现如下信息:
18:58:34,855 INFO [org.jboss.modcluster.ModClusterService] (MSC service thread 1-1)Initializing mod_cluster 1.2.0.Final
这里可以看出启动了mod_cluster,且版本是1.2.0.Finals
18:58:36,449 INFO [org.jboss.as.server.deployment] (MSC service thread 1-4) JBAS015876:Starting deployment of "cluster.war"
18:58:36,949 INFO [stdout](pool-14-thread-1)
18:58:36,964 INFO [stdout](pool-14-thread-1)-------------------------------------------------------------------
18:58:36,964 INFO [stdout](pool-14-thread-1) GMS: address=standalone-node1/web, cluster=web, physicaladdress=192.168.1.204:55200
18:58:36,964 INFO [stdout](pool-14-thread-1)-------------------------------------------------------------------
这里可以看出web server启动mod_cluster功能,如果没有,说明mod_cluster没启动。
上述信息只会在有java应用程序布署到jboss7后才会出现,也只有jboss7中的web server节点布署了java应用程序后才能促使jboss7启动mod_cluster功能。
布署后再次访问http://192.168.1.204:6666/mod_cluster_manager,应该会在原来的内容下有如下显示:
如果有,则表示httpd+mod_cluster配置无误,可以接着往下进入域模式的配置管理了。如果没有,说明httpd+mod_cluster或jboss配置有误,二者没能成功建立起联系,需要检查配置并修改重试,直到有上述显示为止,才能说明httpd+mod_cluster是配置成功的。
第三节 JBOSS7域模式的配置、布署、运行
一 准备
- 两台具有不同IP的linux服务器:主机master,IP:192.168.1.204,从机slave,IP:192.168.1.206,确保在一个局域网内可互相访问
- 下载jboss-as-7.1.1.Final.zip,分别解下缩布署到主机和从机上,命名为master和slave
二 账号权限设置
- master服务器端
i. 进入bin目录,运行./add-user.sh,添加admin账号
ii. 再次运行bin/add-user.bat,添加slave账号
请注意,用户名必须等于slave的host的名字。这意味着对于每个额外的host需要一个用户。
三 修改master服务器缺省配置
- 修改domain/configuration/host.xml
- 修改domain/configuration/domain.xml
四 修改slave服务器缺省配置
- 修改domain/configuration/host.xml
添加server-identities到security-realm,用于从机尝试连接到主机时的身份验证。因为slave服务名设置为‘slave‘,所以我们应该用‘slave‘用户的密码。加密值属性中的‘MTIzMTIz =‘,是‘123123’的Base64编码。可以通过使用base64计算器来获得 http://www.webutils.pl/index.php?idx=base64。在域控制器部分中<domain-controller>,我们还需要添加安全领域属性security-realm="ManagementRealm"
五 试运行
现在一切都是为两个主机设置在域模式下运行。试着在两个主机上分别运行./domain.sh。如果一切都好,我们可以看到master上的日志显示:
这表明master和slave都启动成功,且相互已经建立了联系。
六 布署测试程序
- 通过浏览器访问http://192.168.1.204:9990,使用前名创建的账号:admin,密码:123123。192.168.1.204是主控制端host所在地址,我们用这个host来控制其他的host。进入后可以看到master和slave都有三个server,分别是
我们要把cluster.war布署在server-three上,因为这个server属于other-server-group,在domain.xml中可以看到other-server-group用的profile是“full-ha”,是专用于mod_cluster的配置。
进入“Manage Deployments”页面,点击“Add Content”在右上角。然后我们应该选择cluster.war文件,遵循指令将其添加到我们的内容库。现在我们可以看到cluster.war已经添加。接下来,我们点击“添加组”按钮,并添加cluster.war到“other-server-group”,然后单击“保存”。
注意,在Server Active启动的状态下,是无法布署war项目的,因此布署前确保server-three处于关闭状态。
接下来,启动master和slave的server-three,观察命令行,会出现如下信息:
18:58:34,855 INFO [org.jboss.modcluster.ModClusterService](MSC service thread 1-1) Initializing mod_cluster 1.2.0.Final
……
18:58:36,449 INFO [org.jboss.as.server.deployment] (MSC service thread 1-4) JBAS015876:Starting deployment of "cluster.war"
18:58:36,949 INFO [stdout](pool-14-thread-1)
18:58:36,964 INFO [stdout](pool-14-thread-1)-------------------------------------------------------------------
18:58:36,964 INFO [stdout] (pool-14-thread-1)GMS: address=master /web, cluster=web, physical address=192.168.1.204:55200
18:58:36,964 INFO [stdout](pool-14-thread-1)-------------------------------------------------------------------
这里可以看出web server启动mod_cluster功能,如果没有,说明mod_cluster没启动。
启动后再访问http://192.168.1.204:6666/mod_cluster_manager,应该会在原来的内容下有类似如下内容
这表明httpd+cluster和master,slave成功建产了联系,再访问http://192.168.1.204/cluster/,应该会看到httpd+mod_cluster自动将请求转发至master或slave其中一台服务器上,会显示如下内容
一切顺利的话,我们可以测试一下,把master或slave不管哪一个host停掉,http://192.168.1.204/cluster/依然会继续运行,httpd+mod_cluster会自动将请求转发至仍然运行的host服务器上,并能转移session会话(我试过slave断了,session能转发到master,但master断了,session无法转发到slave,仍有待解决,但不是大问题)。
最后,可以修改host.xml文件,将<servername="server-three" group="other-server-group"auto-start="false">
改为
<server name="server-three"group="other-server-group" auto-start="true">
使server-three自动启动。
本文内容参考:https://docs.jboss.org/author/display/AS71/AS7+Cluster+Howto