本文介绍基于mod_cluster组件的JBOSS集群的架设,首先介绍了mod_cluster的原理,然后通过一个实例展示如何构建一个真正的Jboss集群。最后通过一系列测试及讲解介绍集群的负载均衡机制。
mod_cluster是一个非常简单易用的集群管理工具,主要功能:自动发现集群主机并注册主机。为集群提供负载均衡能力,为集群提供容灾的能力。官网链接http://mod-cluster.jboss.org/
JBOSS7.2之后直接将mod_cluster做为其中一个模块集成到JBOSS中。在$JBOSS_HOME/modules/system/layers/base/org/jboss/as/modcluster/main中是mod_cluster的模块配置,模块名称为org.jboss.as.modcluster。 domain.xml文件打开后能看到已经默认的放置在extensions加载项中<extensionmodule="org.jboss.as.modcluster"/>
Mod cluster是以模块的形式集成在Apache httpd服务器中的一个工具。主要由6各模块构成:
工作原理,mod_manager负责监控网段中的属于同一管理组的主机,发现之后注册到核心模块mod_proxy中进行管理。由mod_proxy_ajp模块使用AJP协议与集群中的各个主机通讯。当接收到请求时,会在内存共享mod_slotmem中记录该请求,mod_proxy_cluster为集群提供负载均衡能力决策由哪个主机进行该请求的处理。最终由mod_proxy_ajp将请求转发到具体主机。mod_slotmem为集群提供容错能力,当一台主机没有能够正确返回,或者主机在处理过程中挂掉了。mod_proxy_cluster会重新计算并发请求给存活的主机。
在上一节《ManagedDomain》的基础上,我们添加一台主机(clusterManager)专门做集群管理。因此我们有3台计算机:
6台虚拟主机中server-one,server-four,server-five属于同一个管理域main-server-group,而server-two,server-three,server-six属于同一个管理组other-server-group。
一下实验通过对mod_cluster1.2.0Final的安装配置,JBOSS域管理文件的配置来实现对other-server-group的管理
JBOSS需要配置两样东西,一个是modcluster与虚拟主机通讯使用的HornetQ,一个是modcluster的须在均衡配置。
打开master中的$JBOSS_HOME/domain/configuration/domain.xml文件。找到other-server-group对应的profile配置<profilename="full-ha">
在其中找到<subsystemxmlns="urn:jboss:domain:messaging:1.4">为<hornetq-server>做一个简单的配置,如下
<subsystem xmlns="urn:jboss:domain:messaging:1.4"> <hornetq-server> <cluster-user>jms-user</cluster-user> <cluster-password>simple-pass</cluster-password> </hornetq-server> </subsystem>
在<subsystemxmlns="urn:jboss:domain:modcluster:1.1">中配置如下
<subsystem xmlns="urn:jboss:domain:modcluster:1.1"> <mod-cluster-config advertise-socket="modcluster"connector="ajp"> <dynamic-load-provider> <load-metric type="busyness"/> </dynamic-load-provider> </mod-cluster-config> </subsystem>
配置使用APJ协议通讯,负载均衡使用busyness标准配置。也就是忙的时候才调度别的主机。具体的负载均衡在后面的部分会做更详细的介绍。
下载http://mod-cluster.jboss.org/downloads/1-2-0-Final,为了简单起见,我们使用带httpd的mod_cluster包,选择一下包进行下载。
binaries linux2-x86 |
mod_cluster 1.2.0.Final tar bundles |
8.3M |
2012-02-09 |
LGPL |
mod_cluster- |
之后放到clusterManager中解压,往后解压目录我们简称为$Mod_Cluster。这其实就是一个配置了mod_cluster组件的httpd服务器。
我们看一下其中的几个重要的目录:
我们需要关注的就是以上3个地方。(如果不是直接下载,而是使用apache2服务器,我们可以进入对应的models去放置这6个组件并配置到httpd.conf中。)我们这里是直接使用带mod_cluster的完整httpd,所以只需要简单看一眼有没有这6各组件即可。
需要执行以下$Mod_Cluster/opt/jboss/httpd/sbin/installhome.sh,(如果是直接部署在apache2服务器上就不需要执行这个步骤了。)这个脚本负责将我们下载的这个httpd的关键目录写入到环境变量中,如果不执行它的话系统找不到httpd的正确执行路径,因为不能正确启动mod_cluster。
然后进入httpd.conf文件进行配置,需要修改以下三处:
<IfModule manager_module> Listen192.168.0.110:10001 <VirtualHost*:10001> <Location/> Orderdeny,allow Deny from all #Allow fromall Allow from192.168.0. </Location> #ServerAdvertise on http://@IP@:6666 #AdvertiseSecurityKey 1234567890 #AdvertiseGroup@ADVIP@:23364 EnableMCPMReceive AllowDisplay On <Location/mod_cluster_manager> SetHandlermod_cluster-manager Orderdeny,allow Deny fromall #Allow fromall Allow from192.168.0. </Location> KeepAliveTimeout 300 MaxKeepAliveRequests 0 ManagerBalancerName other-server-group AdvertiseFrequency 5 </VirtualHost> </IfModule>
其中Listen192.168.0.110:10001用于暴露cluster的管理端口。<Location/mod_cluster_manager>用于配置登陆页面,开启之后我们可以通过192.168.0.110:10001/mod_cluster_manager来访问查看cluster的信息。
两处Allowfrom all注释掉修改为Allowfrom 192.168.0.特定的网段:
执行启动命令:
$Mod_Cluster/opt/jboss/httpd/sbin/apache start 开启httpd服务
$Mod_Cluster/opt/jboss/httpd/sbin/apache stop 关闭httpd服务
启动后可以使用如下链接检查httpd的启动是否正确
检查管理页面 http://192.168.0.110:10001/mod_cluster_manager
如果启动着master和server,我们会看到other-server-group的虚拟机都注册到了集群当中
Master:
[Server:server-two] 20:48:40,323 INFO [org.jboss.modcluster](ContainerBackgroundProcessor[StandardEngine[jboss.web]]) MODCLUSTER000011:jboss.web will use <strong>31a70009-aa44-3ed1-b207-38872bf0d1cf</strong> as jvm-route [Server:server-three] 20:48:45,996 INFO [org.jboss.modcluster](ContainerBackgroundProcessor[StandardEngine[jboss.web]]) MODCLUSTER000011:jboss.web will use <strong>a162a574-0743-3e04-be21-8068c31481aa</strong> as jvm-route
Server2
[Server:server-six] 20:48:39,441 INFO [org.jboss.modcluster](ContainerBackgroundProcessor[StandardEngine[jboss.web]]) MODCLUSTER000011:jboss.web will use <strong>bfd7a91e-0e3b-3860-9b9c-2bb4771c424e</strong> as jvm-route
同时在http://192.168.0.110:10001/mod_cluster_manager会看到注册了的这3台虚拟主机
本节主要介绍集群的能力,特别是负载均衡能力。分三小节包括两个测试和一个负载均衡的配置方式的讲解。
通过http://192.168.0.110/HelloDomain/来访问部署到other-server-group中的应用HelloDomain.
Master的日志中能看到下面这条:
[Server:server-three] 21:39:34,659 INFO [stdout] (ajp-/192.168.0.115:8259-2)HelloDomain
也就是说这次的请求被转发给了server-three来处理。
如本文3.2中介绍的,在master的domain.xml文件中有一下配置
<subsystem xmlns="urn:jboss:domain:modcluster:1.1"> <mod-cluster-config advertise-socket="modcluster"connector="ajp"> <dynamic-load-provider> <load-metric type="busyness"/> </dynamic-load-provider> </mod-cluster-config> </subsystem>
其中<load-metrictype="busyness"/>用于指定负载均衡的机制。具体怎么配可以查看$JBOSS_HOME/docs/schema/jboss-as-mod-cluster_1_1.xsd,文件中有下配置用于设置load-metric。
<xs:simpleTypename="loadMetricEnum"> <xs:restriction base="xs:token"> <xs:enumerationvalue="cpu"/> <xs:enumeration value="mem"/> <xs:enumeration value="heap"/> <xs:enumeration value="sessions"/> <xs:enumeration value="requests"/> <xs:enumeration value="send-traffic"/> <xs:enumeration value="receive-traffic"/> <xs:enumeration value="busyness"/> </xs:restriction> </xs:simpleType>
load-metric每项有两个属性weight和capacity。可设置为形如
<span style="color: rgb(51, 51, 51); font-family: arial; font-size: 13.333333015441895px; line-height: 16.66666603088379px; "><</span><span style="font-style: normal; color: rgb(204, 0, 0); font-family: arial; font-size: 13.333333015441895px; line-height: 16.66666603088379px; ">load-metric</span><span style="color: rgb(51, 51, 51); font-family: arial; font-size: 13.333333015441895px; line-height: 16.66666603088379px; "> </span><span style="font-style: normal; color: rgb(204, 0, 0); font-family: arial; font-size: 13.333333015441895px; line-height: 16.66666603088379px; ">type=</span><span style="color: rgb(51, 51, 51); font-family: arial; font-size: 13.333333015441895px; line-height: 16.66666603088379px; ">"cpu" weight="2" capacity="1"/> </span>
load-metric能配置多项,具体计算方式是根据各项的weight和capacity矩阵来计算各个虚拟机的能力从而实现负载均衡。weight和capacity从1开始往上权重越来越低。
为了看到负载均衡的效果,我们简单的配置一个<load-metrictype="cpu"/>在负载均衡配置项中。然后写一个计算量大的程序来占用大量的cpu运算单元。从而观察mod_cluster的负载均衡机制。
<%@ page language="java" contentType="text/html;charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <!DOCTYPE htmlPUBLIC "-//W3C//DTDHTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type"content="text/html; charset=ISO-8859-1"> <title>Please delay the session</title> </head> <body> <% System.out.println("Evaluatingdate now" ); java.util.Datedate = new java.util.Date(); %> Hello! The start time is now <%= date %> <br> <% double num = 1; for(int i = 1 ; i < 99999; i++){ for(int j = 0; j < 99999; j++){ num= num + i*j; } } java.util.Datedate2 = new java.util.Date(); %> Hello! The finish time is now <%= date2 %> The number is: <%= num %> </body> </html>
然后打包为Delay.war,将其部署到other-server-group中,从虚拟主机的log可以看到成功部署的信息
[Server:server-three]22:07:11,253 INFO [org.jboss.as.server.deployment] (MSC service thread 1-2) JBAS015876:Starting deployment of "Delay.war" (runtime-name:"Delay.war") [Server:server-two]22:07:11,267 INFO [org.jboss.as.server.deployment] (MSC service thread 1-2) JBAS015876:Starting deployment of "Delay.war" (runtime-name:"Delay.war") [Server:server-three]22:07:11,353 INFO [org.jboss.web](ServerService Thread Pool -- 78) JBAS018210: Register web context: /Delay [Server:server-two]22:07:11,389 INFO [org.jboss.web](ServerService Thread Pool -- 74) JBAS018210: Register web context: /Delay [Server:server-three]22:07:11,498 INFO [org.jboss.as.server](host-controller-connection-threads - 3) JBAS018559: Deployed"Delay.war" (runtime-name : "Delay.war") [Server:server-two]22:07:11,501 INFO [org.jboss.as.server](host-controller-connection-threads - 3) JBAS018559: Deployed"Delay.war" (runtime-name : "Delay.war") [Server:server-six] 22:07:11,248 INFO [org.jboss.as.server.deployment] (MSC servicethread 1-1) JBAS015876: Starting deployment of "Delay.war"(runtime-name: "Delay.war") [Server:server-six] 22:07:11,318 INFO [org.jboss.web] (ServerService Thread Pool --74) JBAS018210: Register web context: /Delay [Server:server-six] 22:07:11,489 INFO [org.jboss.as.server](host-controller-connection-threads - 2) JBAS018559: Deployed"Delay.war" (runtime-name : "Delay.war")
然后我们开7个浏览器多次调用http://192.168.0.110/Delay/可以看到3个虚拟主机上都有负载出现,因而实现了负载均衡机制。
[Server:server-two] 22:18:04,382 INFO [stdout] (ajp-/192.168.0.115:8159-15)Evaluating date now [Server:server-two] 22:18:04,385 INFO [stdout] (ajp-/192.168.0.115:8159-16)Evaluating date now [Server:server-two] 22:18:04,422 INFO [stdout] (ajp-/192.168.0.115:8159-18)Evaluating date now [Server:server-three] 22:18:36,496 INFO [stdout] (ajp-/192.168.0.115:8259-4)Evaluating date now [Server:server-six]22:18:27,662 INFO [stdout](ajp-/192.168.0.116:8259-1) Evaluating date now [Server:server-six] 22:18:46,341 INFO [stdout] (ajp-/192.168.0.116:8259-4)Evaluating date now [Server:server-six] 22:18:46,349 INFO [stdout] (ajp-/192.168.0.116:8259-3)Evaluating date now
集群有三种:HPCC高性能集群、balancer负载均衡集群、disasterRecovery容灾集群或高可用性集群。Mod_cluster实现JBOSS的一种Balancer负载均衡型集群。本文介绍了modcluster原理,集群实现,以及如何配置负载均衡。