JBoss-mod_cluster
概述
mod_cluster是jboss的一个开源集群模块(基于httpd 2.2.x,也就是httpd2的一个模块),主要功能包括:自动发现集群主机并注册主机;为集群提供负载均衡能力;为集群提供容灾的能力。
mod_cluster 和mod_jk, mod_proxy类似,是一个基于httpd的负载均衡器,能够将请求从httpd转发给应用服务器集群(Tomcat,JBoss等)。mod_cluster与 mod_jk和mod_proxy的区别是,mod_cluster为web服务器和httpd服务器之间提供后台通道。web服务器使用后台通道给httpd端提供当前状态信息。
Apache httpd作为负载均衡器和后台中间件服务器构建构架高可用企业应用集群是非常普遍的一种方式,当前主要三大中间件JBoss,Weblogic,Websphere都支持Apache httpd作为负载均衡器。
mod_cluster作为Apache的插件模块负责连接Apache和JBoss,根据负载均衡策略分发和请求给后台JBoss,所以我们可以将Apache httpd 加mod_cluster作为负载均衡器。
官网:
http://mod-cluster.jboss.org/
使用mod_cluster的必要条件
- httpd-2.2.8+
- JBoss AS 5.0.0+ or JBossWeb 2.1.1+
mod_cluster模块
mod_cluster是以模块的形式集成在Apache httpd服务器中的一个工具。
主要由6各模块构成:
- mod_proxy.so,httpd标准模块,基础核心模块
- mod_proxy_ajp.so,httpd标准模块,基本通讯协议模块
- mod_slotmem.so,mod_cluster提供的模块,共享内存模块
- mod_manager.so,mod_cluster提供的模块,从JBOSS或者Tomcat获得信息的模块
- mod_proxy_cluster.so,mod_cluster提供的模块,为mode_proxy提供负载均衡的模块
- mod_advertise.so,mod_cluster提供的模块,使httpd可以将监听的ip和port广播出去给jboss或tomcat
工作原理
mod_manager负责监控网段中的属于同一管理组的主机,发现之后注册到核心模块mod_proxy中进行管理。由mod_proxy_ajp模块使用AJP协议与集群中的各个主机通讯。当接收到请求时,会在内存共享mod_slotmem中记录该请求,mod_proxy_cluster为集群提供负载均衡能力决策由哪个主机进行该请求的处理。最终由mod_proxy_ajp将请求转发到具体主机。mod_slotmem为集群提供容错能力,当一台主机没有能够正确返回,或者主机在处理过程中挂掉了。mod_proxy_cluster会重新计算并发请求给存活的主机。
httpd端安装
下载mod_cluster
比如下载mod_cluster-1.2.6
http://mod-cluster.jboss.org/mod_cluster/downloads/1-2-6-Final-bin
常用下载版本如下:
- linux-x86_64 mod_cluster binaries,一组httpd的so模块,下载后得到压缩包mod_cluster-1.2.6.Final-linux2-x64-so.tar.gz,只包含mod_advertise.so, mod_manager.so, mod_proxy_cluster.so, mod_slotmem.so 四个so文件,还需要单独安装httpd
- linux-x86_64 httpd binaries,一个已内置mod_cluster的httpd,下载后得到压缩包mod_cluster-1.2.6.Final-linux2-x64.tar.gz,解压后会得到一个安装配置完成的httpd位于opt/jboss目录下,不需要再单独安装httpd
安装mod_cluster
使用独立httpd
如果下载的是httpd的so模块,还需要安装一个httpd,然后将mod_advertise.so, mod_manager.so, mod_proxy_cluster.so, mod_slotmem.so 四个so包拷贝到Apache httpd的modules目录下。
使用内置mod_cluster的httpd
如果下载的是已内置httpd的mod_cluster,则不需单独安装httpd,直接开始配置即可。
如果使用从mod_cluster官网下载的内置mod_cluster模块的httpd,几个重要的配置目录如下:
- opt/jboss/httpd/lib/httpd/modules目录:放置httpd模块的地方,包含mod_cluster的6个组件。
- opt/jboss/httpd/httpd/conf/httpd.conf文件:httpd的配置文件。
- opt/jboss/httpd/sbin目录: installhome.sh环境变量设置脚本和apachectl.sh是httpd的启动文件。
需要执行opt/jboss/httpd/sbin/installhome.sh脚本(如果使用独立的httpd服务器就不需要执行这个步骤了),这个脚本负责将我们下载的这个httpd的关键目录写入到环境变量中,如果不执行它的话系统找不到httpd的正确执行路径,因为不能正确启动mod_cluster。
httpd端配置
在httpd的配置文件ServerRoot/conf/httpd.conf中添加mod_cluster相关配置。
模块加载
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.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
其中mod_proxy和mod_proxy_ajp是httpd自带的标准模块,剩下4个是mod_cluster提供的模块。
常用配置项
ManagerBalancerName mycluster
,默认值mycluster,当JBoss AS/JBossWeb/Tomcat没有提供balancer时所用的balancer名。SetHandler mod_cluster-manager
,mod_cluster管理界面的handler,可查看服务端结点的基本信息。
如上配置后可通过http://localhost/mod_cluster-manager 访问管理界面。<Location /mod_cluster-manager> SetHandler mod_cluster-manager Order deny,allow Deny from all Allow from 127.0.0.1 </Location>
ServerAdvertise On|Off|On http://hostname:port
,配置使用Advertise广播来自动发现JBoss AS/JBossWeb/Tomcat结点。On开启,Off关闭,默认将httpd虚拟主机VirtualHost的IP和端口广播出去,如果VirtualHost配置不正确或未配置则广播On http://hostname:port 配置的IP和端口。
代理发现
mod_cluster提供两种代理发现方法:
- 通过proxyList参数手动配置代理服务器列表
- 通过Advertise广播自动发现代理服务器
启用Advertise代理自动发现机制后,httpd会发送广播来自动发现服务端结点。这是通过mod_cluster的mod_advertise模块实现的,它会向广播组中发送UDP报文,服务端结点接收报文后可自动发现代理服务器。
mod_advertise报文示例:
HTTP/1.0 200 OK
Date: Wed, 08 Apr 2009 12:26:32 GMT
Sequence: 16
Digest: f2d5f806a53effa6c67973d2ddcdd233
Server: 1b60092e-76f3-49fd-9f99-a51c69c89e2d
X-Manager-Address: 127.0.0.1:6666
X-Manager-Url: /bla
X-Manager-Protocol: http
X-Manager-Host: 10.33.144.3
其中包含httpd虚拟主机的IP和端口,或通过ServerAdvertise命令配置的IP和端口。
如果不想使用Advertise广播代理发现,在httpd.conf中配置ServerAdvertise Off
关闭Advertise广播功能,在服务端手动配置proxyList代理服务器列表:
<property name="proxyList">10.33.144.3:6666,10.33.144.1:6666</property>
<property name="advertise">false</property>
httpd端配置示例
# 加载必要的.so模块
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.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
# 设置监听主机IP和端口,用于发现jboss节点,或接受管理界面请求
Listen 192.168.1.117:6666
# 配置虚拟主机,指定接受请求的IP和端口
<VirtualHost 192.168.1.117:6666>
# 配置目录权限
<Directory />
Order deny,allow
Deny from all
Allow from 192.168.1.
</Directory>
# 管理界面,配置之后可通过http://192.168.1.117:6666/mod_cluster-manager 来访问管理界面,查看结点信息
<Location /mod_cluster-manager>
SetHandler mod_cluster-manager
Order deny,allow
Allow from all
</Location>
KeepAliveTimeout 60
MaxKeepAliveRequests 0
# 声明一个负载均衡器
ManagerBalancerName mycluster
# 打开Advertise广播功能
ServerAdvertise On
EnableMCPMReceive
</VirtualHost>
配置完成后重启httpd,可通过http://192.168.1.117:6666/mod_cluster-manager 来访问管理界面表示配置成功。
服务端安装
服务端安装包下载
比如下载mod_cluster-1.2.6
http://mod-cluster.jboss.org/mod_cluster/downloads/1-2-6-Final-bin
选择java bundles,此为用于JBoss AS和Tomcat的jar包,下载后得到压缩包mod_cluster-parent-1.2.6.Final-bin.tar.gz,解压后的文件夹中包含demo,JBossWeb-Tomcat和mod_cluster.sar三个文件夹,JBossWeb-Tomcat用于tomcat,mod_cluster.sar用于jboss
JBoss AS 6.0及以上
无需安装,mod_cluster已内置在JBoss AS 6.0+ 及JBoss AS 7+版本中
JBoss AS 5.x中安装
将mod_cluster.sar文件夹拷贝到想使用的实例的deploy文件夹中,比如想在all实例中使用mod_cluster,则拷贝mod_cluster.sar文件夹到JBOSS_HOME/server/all/deploy/中
Tomcat中安装
假设CATALINA_HOME是tomcat安装根目录,则将JBossWeb-Tomcat/lib文件夹中的jar包拷贝到tomcat的lib目录中:
cp JBossWeb-Tomcat/lib/jboss-logging.jar CATALINA_HOME/lib/
cp JBossWeb-Tomcat/lib/mod_cluster-container-catalina* CATALINA_HOME/lib/
cp JBossWeb-Tomcat/lib/mod_cluster-container-spi* CATALINA_HOME/lib/
cp JBossWeb-Tomcat/lib/mod_cluster-core* CATALINA_HOME/lib/
对于tomcat6,需拷贝额外的jar包:
cp JBossWeb-Tomcat/lib/mod_cluster-container-tomcat6* CATALINA_HOME/lib
对于tomcat7也需要:
cp JBossWeb-Tomcat/lib/mod_cluster-container-tomcat7* CATALINA_HOME/lib
服务端配置
JBoss5配置
其他JBoss版本(JBoss5及以下)中,通过配置文件$JBOSS_HOME/server/$PROFILE/deploy/mod_cluster.sar/META-INF/mod_cluster-jboss-beans.xml
进行配置。
mod_cluster-jboss-beans.xml中,首先定义了容器事件监听和处理bean ModClusterListener
,其有两个构造参数,一个事件处理器ContainerEventHandler
和一个管理MBeanServer
<!-- Entry point: catalina lifecycle listener -->
<bean name="ModClusterListener" class="org.jboss.modcluster.container.jbossweb.JBossWebEventHandlerAdapter">
<constructor>
<parameter class="org.jboss.modcluster.container.ContainerEventHandler">
<inject bean="ModClusterService"/><!-- Non-clustered mode -->
<!--inject bean="HAModClusterService"/--><!-- Clustered mode -->
</parameter>
<parameter class="javax.management.MBeanServer">
<inject bean="JMXKernel" property="mbeanServer"/>
</parameter>
</constructor>
</bean>
事件处理器ContainerEventHandler有两种实现,一种集群模式(clustered)HAModClusterService
,一种非集群模式(non-clustered)ModClusterService
。官网下载的服务端版本中,1.2.6版的配置文件中没有HAModClusterService的定义,1.2.0版中有。
非集群模式Non-clustered
非集群模式中,每个JBoss结点直接与负载均衡器通信,彼此之间不互联。非集群模式通过ModClusterService
bean配置,ModClusterService bean有两个构造参数,一个定义配置项的beanModClusterConfig
,以及一个负载均衡计算beanLoadBalanceFactorProvider
<!-- The core mod_cluster service -->
<bean name="ModClusterService" class="org.jboss.modcluster.ModClusterService" mode="On Demand">
<annotation>@org.jboss.aop.microcontainer.aspects.jmx.JMX(name="jboss.web:service=ModCluster",exposedInterface=org.jboss.modcluster.ModClusterServiceMBean.class)</annotation>
<constructor>
<parameter class="org.jboss.modcluster.config.ModClusterConfig">
<inject bean="ModClusterConfig"/>
</parameter>
<parameter class="org.jboss.modcluster.load.LoadBalanceFactorProvider">
<inject bean="DynamicLoadBalanceFactorProvider"/>
</parameter>
</constructor>
</bean>
集群模式clustered
集群模式由beanHAModClusterService
定义,其中也要注入配置项定义beanModClusterConfig
,其他HA集群相关bean不知道是在哪儿定义的。
<!-- The core mod_cluster service, implemented as an HA singleton -->
<bean name="HAModClusterService" class="org.jboss.modcluster.ha.HAModClusterService" mode="On Demand">
<annotation>@org.jboss.aop.microcontainer.aspects.jmx.JMX(name="jboss.web:service=ModCluster",exposedInterface=org.jboss.modcluster.ha.HAModClusterServiceMBean.class)</annotation>
<constructor>
<parameter class="org.jboss.modcluster.config.ha.impl.HAModClusterConfig"><inject bean="ModClusterConfig"/></parameter>
<parameter class="org.jboss.modcluster.load.LoadBalanceFactorProvider"><inject bean="DynamicLoadBalanceFactorProvider"/></parameter>
<parameter class="org.jboss.ha.framework.interfaces.HAPartition"><inject bean="HAPartition"/></parameter>
<parameter class="org.jboss.ha.framework.interfaces.HASingletonElectionPolicy"><bean class="org.jboss.ha.singleton.HASingletonElectionPolicySimple"/></parameter>
</constructor>
</bean>
服务端可用配置项
ModClusterConfig
bean定义了mod_cluster的所有可用配置项及默认值,在集群模式和非集群模式中都要用到。
详见:http://docs.jboss.org/mod_cluster/1.2.0/html/java.properties.html
其中主要用到的几个:
<property name="proxyList">${jboss.mod_cluster.proxyList,jboss.modcluster.proxyList:}</property>
,配置Apache服务器列表,可在run.sh启动脚本参数中通过参数-Djboss.mod_cluster.proxyList=IP:Port[,...]
配置。<property name="stickySession">true</property>
,黏着session,默认开启。advertise
,启用Advertise广播自动发现代理服务器,默认为true,启用Advertise广播后,不需要手动配置代理列表proxyList;如果手动配置了代理列表proxyList,可以关闭此项。
<!-- Configure this node's communication with the load balancer -->
<bean name="ModClusterConfig" class="org.jboss.modcluster.config.ha.impl.HAModClusterConfig" mode="On Demand">
<!-- Comma separated list of address:port listing the httpd servers where mod_cluster is running. -->
<property name="proxyList">${jboss.mod_cluster.proxyList,jboss.modcluster.proxyList:}</property>
<!-- URL prefix to send with commands to mod_cluster. Default is no prefix. -->
<!--property name="proxyURL"></property-->
<!-- mod_advertise is a small httpd module that advertises the
availability of httpd servers via multicast, allowing
ModClusterService to discover the httpd front-end instead of/in
addition to having them defined in proxyList. -->
<!-- Whether to listen for advertise messages -->
<property name="advertise">${jboss.mod_cluster.advertise:true}</property>
<!-- Multicast address on which to listen for advertisements -->
<property name="advertiseGroupAddress">${jboss.mod_cluster.advertise.address,jboss.modcluster.advertise.address,jboss.partition.udpGroup:224.0.1.105}</property>
<!-- Port to listen to for advertisements -->
<property name="advertisePort">${jboss.mod_cluster.advertise.port,jboss.modcluster.advertise.port:23364}</property>
<!-- Comma delimited list of contexts that should *not* be auto-registered with httpd. -->
<!-- ROOT indicates the root context. -->
<!-- Context may be qualified by host using a colon, e.g. host1:context1 -->
<!-- If no host is defined, localhost is assumed. -->
<property name="excludedContexts">${jboss.mod_cluster.excludedContexts,jboss.modcluster.excludedContexts:ROOT,admin-console,invoker,jbossws,jmx-console,juddi,web-console}</property>
<property name="autoEnableContexts">${jboss.mod_cluster.autoEnableContexts:true}</property>
<!-- Security key the proxy is going to send with advertise messages.
Default is none. -->
<!--property name="advertiseSecurityKey"></property-->
<!-- Whether to use SSL to communicate with mod_cluster. Note this
has nothing to do with handling of https requests by JBoss Web -->
<property name="ssl">false</property>
<!-- Configuration values for the load balancer itself (must be the
same on all nodes in the cluster). These will be passed to the
load balancer. -->
<property name="stickySession">true</property>
<property name="stickySessionForce">false</property>
<property name="stickySessionRemove">false</property>
<property name="maxAttempts">1</property>
<property name="workerTimeout">-1</property>
</bean>
JBoss6+配置
JBoss EAP 6.0+ 或JBoss AS 7+ 版本中,通过mod_cluster子系统(subsystem)进行配置,详见“负载均衡配置-服务端配置-JBoss6+配置”,可用配置项与上相同。
Tomcat配置
将JBossWeb-Tomcat/lib文件夹中的jar包拷贝到tomcat的lib目录后,通过CATALINA_HOME/conf/server.xml配置mod_cluster。
在server.xml中添加<Listener className="org.jboss.modcluster.container.catalina.standalone.ModClusterListener" />
即可,所有可用的配置项都以Listen元素属性的方式配置,比如开启advertise广播配置为:<Listener className="org.jboss.modcluster.container.catalina.standalone.ModClusterListener" advertise="true"/>
注意:mod_cluster需要用到jboss-logging,tomcat中没有,所以需要将jboss-logging-spi.jar包拷贝到$CATALINA_HOME/lib
jvm route结点ID
类似mod_jk和mod_proxy_balancer,mod_cluster也通过唯一的jvm route区分不同结点,默认情况下,mod_cluster使用以下值决定结点的jvm route:
- tomcat中,使用server.xml配置文件中的
<Engine jvmRoute="..."/>
值,如果定义了的话。 - jboss中,使用
jboss.mod_cluster.jvmRoute=node1
配置中的值,可以在run.sh启动脚本参数中通过参数-Djboss.mod_cluster.jvmRoute=node1
配置。
负载均衡配置实例
假设httpd端配置如”httpd端配置示例”所示。
JBoss6+配置
JBoss EAP 6.0+ 或JBoss AS 7+ 版本中,直接将mod_cluster做为其中一个子系统(subsystem)集成到JBoss中。在JBOSS_HOME/modules/system/layers/base/org/jboss/as/modcluster/main/ 中是mod_cluster的模块jar包,模块名称为org.jboss.as.modcluster
JBOSS_HOME/domain/configuration/domain.xml 文件打开后能看到已经默认的放置在<extensions>
加载项中<extension module="org.jboss.as.modcluster"/>
可以通过如下三种方式添加proxy-list,balancer完成JBoss端集群配置,注意proxy-list和balancer一定要和httpd中的配置一致,依次对各个jboss结点进行配置。
修改配置文件
编辑JBOSS_HOME/standalone/configuration/standalone-ha.xml文件,找到<subsystem xmlns="urn:jboss:domain:modcluster:1.1">
部分,修改<mod-cluster-config>
的属性,负载均衡使用busyness标准配置,也就是忙的时候才调度别的主机:
<subsystem xmlns="urn:jboss:domain:modcluster:1.1">
<mod-cluster-config advertise-socket="modcluster" proxy-list="192.168.1.117:6666" balancer="myCluster" sticky-session="true" connector="ajp">
<dynamic-load-provider>
<load-metric type="busyness"/>
</dynamic-load-provider>
</mod-cluster-config>
</subsystem>
保存修改文件即完成配置。
通过命令行界面
以standalone-ha.xml模式(./standalone.sh -c standalone-ha.xml
)启动JBoss后进入到命令行界面,依次执行如下命令:
/subsystem=modcluster/mod-cluster-config=configuration/:write-attribute(name=balancer,value=myCluster)
/subsystem=modcluster/mod-cluster-config=configuration/:write-attribute(name=sticky-session,value=true)
/subsystem=modcluster/mod-cluster-config=configuration/:write-attribute(name=proxy-list,value=192.168.1.117:6666)
通过Web管理界面
以standalone-ha.xml模式(./standalone.sh -c standalone-ha.xml
)启动JBoss后登录管理界面 http://localhost:9990/console ,选择Profile,Web,mod_cluster,在弹出界面点击相关按钮,编辑balancer值为myCluster,proxy-list值为192.168.1.117:6666,sticky-session值为true,点击保存按钮即完成配置。
JBoss5配置
在run.sh启动脚本参数中配置apache负载均衡代理,通过参数-Djboss.mod_cluster.proxyList=IP:Port[,...]
配置Apache服务器。
例如下面的jboss结点配置了2台Apache负载均衡服务器
run.sh -c aisServer4 -g aisCluster2 -u 225.225.234.2 -Djboss.service.binding.set=ports-01 -b 192.168.1.85 -Djboss.messaging.ServerPeerID=4 -Djboss.mod_cluster.proxyList=192.168.1.117:6666,192.168.1.118:6666
Tomcat配置
修改CATALINA_HOME/conf/server.xml,添加:
<Listener className="org.jboss.modcluster.container.catalina.standalone.ModClusterListener" advertise="true"/>
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">
通过Advertise广播自动发现服务端结点,注意httpd端也要打开Advertise广播功能。jvmRoute定义结点ID。
参考
JBoss 系列二:使用Apache httpd(mod_cluster)和JBoss构架高可用集群环境
http://blog.csdn.net/kylinsoong/article/details/12292707/使用mod_cluster进行负载均衡初步预研(mod_cluster加tomcat)
http://pengtyao.iteye.com/blog/794855JBOSS EAP 6 系列九 Cluster负载均衡集群
http://blog.csdn.net/yaoyu_leo/article/details/38469323jboss eap 6.3 集群(cluster)配置
http://www.cnblogs.com/yjmyzz/p/jboss-eap-mod-cluster.html使用mod_cluster进行apache httpd server和jboss eap 6.1集群配置
http://blog.csdn.net/skmbw/article/details/10511237Chapter 9. Advanced Configuration
https://access.redhat.com/documentation/en-US/Red_Hat_JBoss_Web_Server/1.0/html/HTTP_Connectors_Load_Balancing_Guide/chap-HTTP_Connector_Guide-JBoss_HTTP_Advanced_Configure.html
上一篇 WSDL
下一篇 Apache-Tomcat
页面信息
location:
protocol
: host
: hostname
: origin
: pathname
: href
: document:
referrer
: navigator:
platform
: userAgent
: