apache 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作为负载均衡器。
官网:
使用mod_cluster的必要条件
- httpd-2.4.55+
- JBoss AS 5.0.0+ or JBossWeb 2.1.1+
mod_cluster模块
mod_cluster是以模块的形式集成在Apache httpd服务器中的一个工具。
主要由4各模块构成:
LoadModule advertise_module modules/prod_mod_cluster/mod_advertise.so
LoadModule manager_module modules/prod_mod_cluster/mod_manager.so
LoadModule cluster_slotmem_module modules/prod_mod_cluster/mod_cluster_slotmem.so
LoadModule proxy_cluster_module modules/prod_mod_cluster/mod_proxy_cluster.so
工作原理
mod_manager负责监控网段中的属于同一管理组的主机,发现之后注册到核心模块mod_proxy中进行管理。由mod_proxy_ajp模块使用AJP协议与集群中的各个主机通讯。当接收到请求时,会在内存共享mod_slotmem中记录该请求,mod_proxy_cluster为集群提供负载均衡能力决策由哪个主机进行该请求的处理。最终由mod_proxy_ajp将请求转发到具体主机。mod_slotmem为集群提供容错能力,当一台主机没有能够正确返回,或者主机在处理过程中挂掉了。mod_proxy_cluster会重新计算并发请求给存活的主机。
下载mod_cluster
常用下载版本如下: 1. 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
2. linux-x86_64 httpd binaries,一个已内置mod_cluster的httpd,下载后得到压缩包mod_cluster-1.2.6.Final-linux2-x64.tar.gz,
解压后会得到一个安装配置完成的httpd位于opt/jboss目录下,不需要再单独安装httpd
使用独立httpd
如果下载的是httpd的so模块,还需要安装一个httpd,然后将mod_advertise.so, mod_manager.so, mod_proxy_cluster.so, mod_slotmem.so 四个so包拷贝到Apache httpd的modules目录下。
https://github.com/modcluster/mod_cluster/releases/download/1.2.6.Final/mod_cluster-1.2.6.Final-linux2-x64-so.tar.gz
在httpd的配置文件ServerRoot/conf/httpd.conf中添加mod_cluster相关配置。
模块加载
LoadModule advertise_module modules/prod_mod_cluster/mod_advertise.so
LoadModule manager_module modules/prod_mod_cluster/mod_manager.so
LoadModule cluster_slotmem_module modules/prod_mod_cluster/mod_cluster_slotmem.so
LoadModule proxy_cluster_module modules/prod_mod_cluster/mod_proxy_cluster.so
其中mod_proxy和mod_proxy_ajp是httpd自带的标准模块,剩下4个是mod_cluster提供的模块。
使用内置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。
wget https://ghproxy.com/https://github.com/modcluster/mod_cluster/releases/download/1.3.1.Final/mod_cluster-1.3.1.Final-linux2-x64-so.tar.gz
httpd.conf 配置
常用配置项
ManagerBalancerName mycluster
,默认值mycluster,当JBoss AS/JBossWeb/Tomcat没有提供balancer时所用的balancer名。SetHandler mod_cluster-manager
,mod_cluster管理界面的handler,可查看服务端结点的基本信息
[root@apache conf]# cat /opt/jboss/httpd/httpd/conf/httpd.conf
最后添加
Include conf/extra/mod_cluster.conf
[root@master2 conf]# cat extra/mod_cluster.conf LoadModule advertise_module modules/prod_mod_cluster/mod_advertise.so LoadModule manager_module modules/prod_mod_cluster/mod_manager.so LoadModule cluster_slotmem_module modules/prod_mod_cluster/mod_cluster_slotmem.so LoadModule proxy_cluster_module modules/prod_mod_cluster/mod_proxy_cluster.so <IfModule manager_module> Listen 192.168.86.102:7777 <VirtualHost 192.168.86.102:7777> # Where your worker nodes connect from <Location /> Require ip 192.168.86 Require ip 172.20.106 Require ip 127.0.0 </Location> ServerAdvertise On EnableMCPMReceive # Where administrator reads the console from <Location /mod_cluster-manager> SetHandler mod_cluster-manager Require ip 192.168.86 Require ip 172.20.106 Require ip 127.0.0 </Location> </VirtualHost> </IfModule>
参考:
https://docs.modcluster.io/
搜索:4.6.1. mod_cluster 1.3.x, Apache HTTP Server 2.4.x
- 如上配置后可通过http://192.168.96.102:7777/mod_cluster-manager 访问管理界面。
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代理发现
mod_cluster提供两种代理发现方法:
1. 通过proxyList参数手动配置代理服务器列表 2. 通过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>
服务端配置
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。
摘自:
http://masikkk.com/article/JBoss-mod_cluster/