首页 > 代码库 > Jboss7集群配置说明

Jboss7集群配置说明

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

    AdvertiseSecurityKey 1234567890

   #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="http://www.mamicode.com/${jboss.bind.address.management:127.0.0.1}"/>

        </interface>

        <interfacename="public">

            <inet-addressvalue="http://www.mamicode.com/${jboss.bind.address:127.0.0.1}"/>

        </interface>

        <interfacename="unsecure">

            <inet-addressvalue="http://www.mamicode.com/${jboss.bind.address.unsecure: 127.0.0.1}"/>

        </interface>

    </interfaces>

改为

<interfaces>

        <interfacename="management">

            <inet-addressvalue="http://www.mamicode.com/${jboss.bind.address.management:192.168.1.204}"/>

        </interface>

        <interfacename="public">

            <inet-addressvalue="http://www.mamicode.com/${jboss.bind.address:192.168.1.204}"/>

        </interface>

        <interfacename="unsecure">

            <inet-addressvalue="http://www.mamicode.com/${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域模式的配置、布署、运行

一   准备

 

1)    两台具有不同IP的linux服务器:主机master,IP:192.168.1.204,从机slave,IP:192.168.1.206,确保在一个局域网内可互相访问

2)    下载jboss-as-7.1.1.Final.zip,分别解下缩布署到主机和从机上,命名为master和slave

二   账号权限设置

1)    master服务器端

               i.         进入bin目录,运行./add-user.sh,添加admin账号

 

              ii.         再次运行bin/add-user.bat,添加slave账号

 

请注意,用户名必须等于slave的host的名字。这意味着对于每个额外的host需要一个用户。

 

三   修改master服务器缺省配置

1)    修改domain/configuration/host.xml

 

2)    修改domain/configuration/domain.xml

 

四   修改slave服务器缺省配置

1)    修改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都启动成功,且相互已经建立了联系。

六   布署测试程序

1)    通过浏览器访问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自动启动。

Jboss7集群配置说明