我想向您展示如何在域模式下设置JBoss AS7并启用群集,以便我们可以在节点之间获得HA(高可用性)和会话复制
我们需要准备两个主机(或虚拟主机)来进行实验。我们将使用以下两个主机:
在它们上安装centos6.5(另外的linux版本也可以使用,但我将在本文中使用centos6.5)
确保主机位于同一本地网络中
确保它们可以通过不同的TCP / UDP端口相互访问(最好在实验期间关闭防火墙并禁用SELinux,否则会导致网络问题)。
主节点和从节点都将运行AS7,master将作为域控制器运行,slave将在master的域管理下运行。
master
IP:192.168.98.129
domain controller
mod_cluster+httpd
slave
IP:192.168.98.128
1.将一个演示项目部署到域中,并验证项目是否由域控制器部署到主服务器和从服务器。因此,我们可以确认域管理为我们提供了单点管理单个域中多个主机的部署 2.我们将访问群集URL并验证httpd是否已将请求分发给as7主机之一。这有助于我们确认群集正常运行。 3.我们将尝试向集群发出请求,如果请求被转发到master as7,我们就会在master上终止as7进程。之后,我们将继续请求群集,我们应该看到请求已转发到slave,但会话尚未丢失。我们的目标是验证HA是否正常运行并且会话被复制。
好了,前面这些是我们要准备的环境和要达成的目的,现在我们将一步一步的搭建起这个环境
首先我们应该从网站下载AS7:
http://www.jboss.org/jbossas/downloads/
我下载的版本是7.1.0.CR1b,请不要使用此版本之前的版本,否则在群集模式下运行时您将遇到此错误:
https://issues.jboss.org/browse/AS7-2738
下载完成后
jboss-as-7.1.0.CR1b.tar.gz
然后我将包解压缩到master并运行:
tar -zxvf jboss-as-7.1.0.CR1b.tar.gz cd jboss-as-7.1.0.CR1b/bin ./domain.sh
如果一切正常,我们应该看到AS7在域模式下成功启动:
JBoss Bootstrap Environment
JBOSS_HOME: /Users/weli/Downloads/jboss-as-7.1.0.CR1b
JAVA: /Library/Java/Home/bin/java
JAVA_OPTS: -Xms64m -Xmx512m -XX:MaxPermSize=256m -Djava.net.preferIPv4Stack=true -Dorg.jboss.resolver.warning=true -Dsun.rmi.dgc.client.gcInterval=3600000 -Dsun.rmi.dgc.server.gcInterval=3600000 -Djboss.modules.system.pkgs=org.jboss.byteman -Djava.awt.headless=true
=========================================================================
...
[Server:server-two] 16:59:55,870 INFO [org.jboss.as] (Controller Boot Thread) JBoss AS 7.1.0.CR1b "Flux Capacitor" started in 2499ms - Started 148 of 214 services (64 services are passive or on-demand)
现在退出as7,让我们在slave主机上重复相同的步骤。最后我们在主服务器和从服务器上运行AS7,然后我们可以进入下一步。
域配置:
进入到AS7目录
vi domain/configuration/host.xml
此文件中接口的默认设置如下:
<interfaces> <interface name="management"> <inet-address value="${jboss.bind.address.management:127.0.0.1}"/> </interface> <interface name="public"> <inet-address value="${jboss.bind.address:127.0.0.1}"/> </interface> </interfaces>
我们需要将地址更改为管理接口,以便slave可以连接到master。公共接口允许应用程序通过非本地HTTP访问,而不安全的接口允许远程RMI访问。我的主人的IP地址是192.168.98.129,所以我将配置更改为:
<interfaces> <interface name="management"> <inet-address value="${jboss.bind.address.management:192.168.98.129}"/> </interface> <interface name="public"> <inet-address value="${jboss.bind.address:192.168.98.129}"/> </interface> <interface name="unsecured"> <inet-address value="192.168.98.129" /> </interface> </interfaces>
现在我们将在slave上设置接口。首先,我们需要从slave中删除domain.xml,因为slave不会充当域控制器并且在master的管理下。我只是重命名domain.xml,因此它不会被as7处理:
mv domain/configuration/domain.xml domain/configuration/domain.xml.move
然后让我们编辑host.xml。与master上的步骤类似,首先打开host.xml:
vi domain/configuration/host.xml
我们将在slave上使用的配置有点不同,因为我们需要让slave as7连接到master as7。首先,我们需要设置主机名。我们从以下位置更改name属性:
<host name="master" xmlns="urn:jboss:domain:1.1">
改变成
<host name="slave" xmlns="urn:jboss:domain:1.1">
然后我们需要修改域控制器部分,以便slave as7可以连接到master的管理端口:
<domain-controller> <remote host="10.211.55.7" port="9999"/> </domain-controller>
最后,我们还需要配置interfaces部分并将管理端口公开到公共地址:
<interfaces> <interface name="management"> <inet-address value="${jboss.bind.address.management:192.168.98.128}"/> </interface> <interface name="public"> <inet-address value="${jboss.bind.address:192.168.98.128}"/> </interface> ~~<interface name="unsecured"> <inet-address value="10.211.55.2" /> </interface>~~ </interfaces>
如果现在在主服务器和从服务器上都启动as7,您将看到无法启动从服务器as7,并显示以下错误:
[Host Controller] 20:31:24,575 ERROR [org.jboss.remoting.remote] (Remoting "endpoint" read-1) JBREM000200: Remote connection failed: javax.security.sasl.SaslException: Authentication failed: all available authentication mechanisms failed [Host Controller] 20:31:24,579 WARN [org.jboss.as.host.controller] (Controller Boot Thread) JBAS010900: Could not connect to remote domain controller 10.211.55.7:9999 [Host Controller] 20:31:24,582 ERROR [org.jboss.as.host.controller] (Controller Boot Thread) JBAS010901: Could not connect to master. Aborting. Error was: java.lang.IllegalStateException: JBAS010942: Unable to connect due to authentication failure.
因为我们没有在主设备和从设备之间正确设置认证。现在让我们继续吧:
在bin目录中有一个名为add-user.sh的脚本,我们将使用它将新用户添加到用于域管理身份验证的属性文件中:
./add-user.sh Enter the details of the new user to add. Realm (ManagementRealm) : Username : admin Password : 123123 Re-enter Password : 123123 The username 'admin' is easy to guess Are you sure you want to add user 'admin' yes/no? yes About to add user 'admin' for realm 'ManagementRealm' Is this correct yes/no? yes Added user 'admin' to file '/home/weli/projs/jboss-as-7.1.0.CR1b/standalone/configuration/mgmt-users.properties' Added user 'admin' to file '/home/weli/projs/jboss-as-7.1.0.CR1b/domain/configuration/mgmt-users.properties'
如上所示,我们创建了一个名为“admin”的用户,其密码为“123123”。然后我们添加另一个名为'slave'的用户:
./add-user.sh Enter the details of the new user to add. Realm (ManagementRealm) : Username : slave Password : 123123 Re-enter Password : 123123 About to add user 'slave' for realm 'ManagementRealm' Is this correct yes/no? yes Added user 'slave' to file '/home/weli/projs/jboss-as-7.1.0.CR1b/standalone/configuration/mgmt-users.properties' Added user 'slave' to file '/home/weli/projs/jboss-as-7.1.0.CR1b/domain/configuration/mgmt-users.properties'
在slave中,我们需要配置host.xml进行身份验证。我们应该更改security-realms部分如下:
<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>
我们已将服务器标识添加到security-realm中,当slave尝试连接到master时,它用于主机身份验证。因为slave的主机名设置为'slave',所以我们应该在master上使用'slave'用户的密码。在secret value属性中,我们有'MTIzMTIz =',它是'123123'的base64代码。您可以使用base64计算器生成此值,例如http://www.webutils.pl/index.php?idx=base64中的计算器 。
然后在域控制器部分我们还需要添加security-realm属性:
<domain-controller> <remote host="192.168.98.129" port="9999" security-realm="ManagementRealm"/> </domain-controller>
现在一切都设置为两个主机在域模式下运行。让我们通过在两台主机上运行domain.sh来启动它们。如果一切顺利,我们应该在登录master中看到以下内容:
[Host Controller] 21:30:52,042 INFO [org.jboss.as.domain] (management-handler-threads - 1) JBAS010918: Registered remote slave host slave
测试包我已经打好存放在百度云盘中,也可以自行打包,需要的给我留言即可。
git clone git://github.com/liweinan/cluster-demo.git mvn package
它将生成cluster-demo.war。然后我们需要将战争部署到域中。首先,我们应该访问master上的http管理控制台(因为master充当域控制器):
http://192.168.98.129:9990
它会弹出一个窗口,提示您输入帐户名和密码; 我们可以使用我们刚刚添加的“管理员”帐户。登录后,我们将看到“服务器实例”窗口。默认情况下,列出了三个服务器,它们是:
服务器一
服务器三
服务器二
我们可以看到server-one和server-two处于运行状态,它们属于main-server-group; server-three处于空闲状态,属于other-server-group。
所有这些服务器和服务器组都在master as7上的domain.xml中设置。我们需要更改的是domain.xml中的“other-server-group”:
我们只需要点击选择server-three,再点击右下角的start就可以启动这个服务器
从服务器节点也是一样需要启动server-three
然后开始部署war包,点击界面左下角的部署项目栏:
请注意我们有两个主机参与此服务器组,因此项目现在应该同时部署在主服务器和从服务器中 - 这就是域管理的强大功能。
现在让我们通过尝试从主服务器和从服务器访问集群演示来验证这一点。他们现在都应该工作:
丛节点:
主节点:
现在我们已完成项目部署并查看域控制器的用法,然后我们将继续使用这两个主机来建立集群
为什么端口号是8330而不是8080?请检查master和slave上host.xml中的设置:
<server name="server-three" group="other-server-group" auto-start="false"> <!-- server-three avoids port conflicts by incrementing the ports in the default socket-group declared in the server-group --> <socket-bindings port-offset="250"/> </server>
端口偏移量设置为250,因此8080 + 250 = 8330
现在我们退出master和slave上的as7进程。我们在host.xml配置上还有一些工作要做。打开master的host.xml,并对服务器部分进行以下修改:
<server name="server-three" group="other-server-group" auto-start="false"> <!-- server-three avoids port conflicts by incrementing the ports in the default socket-group declared in the server-group --> <socket-bindings port-offset="250"/> </server>
修改为
<server name="server-three" group="other-server-group" auto-start="true"> <!-- server-three avoids port conflicts by incrementing the ports in the default socket-group declared in the server-group --> <socket-bindings port-offset="250"/> </server>
我们已将auto-start设置为true,因此我们不需要在每次重启时都在管理控制台中启用它。现在打开slave的host.xml,并修改server-three部分:
<server name="server-three-slave" group="other-server-group" auto-start="true"> <!-- server-three avoids port conflicts by incrementing the ports in the default socket-group declared in the server-group --> <socket-bindings port-offset="250"/> </server>
除了将auto-start设置为true之外,我们还将'server-three'重命名为'server-three-slave'。我们需要这样做,因为mod_cluster将无法在单个服务器组中注册具有相同名称的主机。这会导致名称冲突。
完成上述配置后,让我们重新启动两个as7主机并继续进行群集配置。
集群配置:
们将在master上使用mod_cluster + apache httpd作为我们的集群控制器。因为AS7已配置为支持mod_cluster开箱即用,所以这是最简单的方法。
首先,我们需要确保安装了httpd:
yum install httpd -y
然后我们需要从其网站下载更新版本的mod_cluster:
http://www.jboss.org/mod_cluster/downloads
我下载的版本是(这里要注意自己的系统是64位还是32位):
我这里的系统版本是x64位所以下载这个
http://downloads.jboss.org/mod_cluster/1.1.3.Final/mod_cluster-1.1.3.Final-linux2-x64-so.tar.gz
x86
http://downloads.jboss.org/mod_cluster/1.1.3.Final/mod_cluster-1.1.3.Final-linux2-x86-so.tar.gz
然后我们将其提取到:
/etc/httpd/modules 目录中
然后我们编辑httpd.conf:
注释以下三行
#LoadModule proxy_balancer_module modules/mod_proxy_balancer.so #LoadModule proxy_ftp_module modules/mod_proxy_ftp.so #LoadModule proxy_connect_module modules/mod_proxy_connect.so
新增以下四行
LoadModule slotmem_module modules/mod_slotmem.so LoadModule manager_module modules/mod_manager.so LoadModule proxy_cluster_module modules/mod_proxy_cluster.so LoadModule advertise_module modules/mod_advertise.so
然后我们在httpd.conf的底部进行必要的配置:
# This Listen port is for the mod_cluster-manager, where you can see the status of mod_cluster. # Port 10001 is not a reserved port, so this prevents problems with SELinux. Listen 192.168.98.129:10001 # This directive only applies to Red Hat Enterprise Linux. It prevents the temmporary # files from being written to /etc/httpd/logs/ which is not an appropriate location. MemManagerFile /var/cache/httpd <VirtualHost 192.168.98.129:10001> <Directory /> Order deny,allow Deny from all Allow from 192.168.98. </Directory> # This directive allows you to view mod_cluster status at URL http://10.211.55.4:10001/mod_cluster-manager <Location /mod_cluster-manager> SetHandler mod_cluster-manager Order deny,allow Deny from all Allow from 192.168.98. </Location> KeepAliveTimeout 60 MaxKeepAliveRequests 0 ManagerBalancerName other-server-group AdvertiseFrequency 5 </VirtualHost>
有关mod_cluster配置的更多详细信息,请参阅此文档:
http://docs.jboss.org/mod_cluster/1.1.0/html/Quick_Start_Guide.html
测试:
service httpd start
访问集群
http://10.211.55.7/cluster-demo/put.jsp
我们应该看到请求从as7日志分发到其中一个主机(主机或从机).
[Server:server-three-slave] 09:42:43,454 INFO [stdout] (http-192.168.98.128-192.168.98.128-8330-3) Putting date now
现在我使用管理界面断开master as7。在上角选择“运行时”和服务器“主”。
选择“server-three”并按下停止按钮,活动图标应该更改。
使用系统命令杀死服务器会导致Host-Controller立即重启实例!
然后等待几秒钟并访问集群:
http://192.168.98.129/cluster-demo/get.jsp
[Server:server-three-slave] 09:43:14,692 INFO [stdout] (http-192.168.98.128-192.168.98.128-8330-6) Getting date now
从get.jsp我们应该看到,我们得到的时间与'put.jsp'相同。因此,事实证明会话已正确复制到slave。
到此整个jboss域集群和回话复制环境搭建完成,感谢大家浏览。有问题请指正,谢谢!