使用mod_cluster 与 mod_proxy 区别
1.mod_cluster简介
mod_cluster是基于 httpd 的负载均衡器。与mod_jk和mod_proxy一样,mod_cluster使用通信通道将请求从 httpd 转发到一组应用程序服务器节点之一。与mod_jk和mod_proxy不同,mod_cluster利用应用程序服务器节点和 httpd 之间的附加连接。应用程序服务器节点使用此连接通过一组自定义的 HTTP 方法(亲切地称为 Mod-Cluster 管理协议 (MCMP))将服务器端负载平衡因子和生命周期事件传输回 httpd。这个额外的反馈通道允许mod_cluster提供其他负载平衡解决方案所没有的智能和粒度级别。
在 httpd 中,mod_cluster作为一组启用了 mod_proxy 的 httpd 模块来实现。大部分逻辑来自mod_proxy,例如,mod_proxy_ajp提供了mod_cluster所需的所有AJP逻辑。
2.mod_cluster优点
与其他基于 httpd 的负载均衡器相比,mod_cluster具有以下优势:
-
httpd worker 的动态配置
传统的基于 httpd 的负载均衡器需要显式配置可用于代理的工作线程。在mod_cluster中,代理的大部分配置驻留在应用程序服务器上。应用程序服务器将与之通信的代理集由静态列表确定,或者通过通告机制使用动态发现来确定。应用程序服务器将生命周期事件(例如服务器启动/关闭)中继到代理,允许它们有效地自动配置自己。值得注意的是,服务器的正常关闭不会导致代理的故障转移响应,就像传统的基于 httpd 的负载平衡器一样。
-
服务器端负载平衡因子计算
与传统的基于 httpd 的负载均衡器相比,mod_cluster使用由应用程序服务器计算和提供的负载均衡因子,而不是在代理中计算这些因子。因此,mod_cluster提供了一组比代理提供的更强大、更准确的负载指标集(有关详细信息,请参阅负载指标)。
-
细粒度的 Web 应用生命周期控制
传统的基于 httpd 的负载均衡器不能很好地处理 Web 应用程序取消部署。从代理的角度来看,对未部署的 Web 应用程序的请求与对不存在的资源的请求没有区别,并且将导致 404 错误。在mod_cluster中,每个服务器将任何Web应用程序上下文生命周期事件(例如Web应用程序部署/取消部署)转发到代理,通知它启动/停止将给定上下文的请求路由到该服务器。
-
AJP 是可选的
与mod_jk不同,mod_cluster不需要 AJP。与应用程序服务器节点的 httpd 连接可以使用 HTTP、HTTPS 或 AJP。原始概念在wiki中描述。
3.mod_cluster使用的必要条件
* httpd-2.2.8+
* JBoss AS 5.0.0+ or JBossWeb 2.1.1+
* 其它服务器不能直接使用,需要进行改造
4.mod_cluster工作原理
5.mod_cluster与Tomcat配置负载均衡示例
这里只简单说明mod_cluster+tomcat+ajp协议+session非亲和+load-demo.war场景,其它详细安装和配置 参考官方文档:http://docs.jboss.org/mod_cluster/1.1.0/html_single /#Quick_Start_Guide。
5.1安装httpd服务器(windows下安装一份全新的httpd,也可以在已有httpd上升级,这里是安装一份全新的httpd)
5.1.1.下载
https://github.com/modcluster/mod_cluster/releases
http://www.jboss.org/mod_cluster/downloads/1-1-0.html下载最新mod_cluster 1.1.0.Final zip bundles
5.1.2.解压安装
解压mod_cluster-1.1.0.Final-windows-x86-ssl.zip,解压后会有一个httpd-2.2目录,执行其下bin目录下安装配置脚本installconf.bat
5.2配置httpd服务器
这个版本的httpd是完全绑定了mod_cluster组件了,所以只要往httpd_home/conf/httpd.conf添加一些 mod_cluster负载均衡配置了,内容和简单说明如下(如果是在已有httpd上升级安装的,则配置有所不同,详情参考官方文档。):
LoadModule proxy_module /opt/jboss/httpd/lib/httpd/modules/mod_proxy.so LoadModule proxy_ajp_module /opt/jboss/httpd/lib/httpd/modules/mod_proxy_ajp.so LoadModule cluster_slotmem_module /opt/jboss/httpd/lib/httpd/modules/mod_cluster_slotmem.so LoadModule manager_module /opt/jboss/httpd/lib/httpd/modules/mod_manager.so LoadModule proxy_cluster_module /opt/jboss/httpd/lib/httpd/modules/mod_proxy_cluster.so LoadModule advertise_module /opt/jboss/httpd/lib/httpd/modules/mod_advertise.so <IfModule manager_module> Listen 127.0.0.1:6666 ManagerBalancerName mycluster <VirtualHost 127.0.0.1:6666> <Location /> Require ip 127.0.0 </Location> KeepAliveTimeout 5 MaxKeepAliveRequests 0 #ServerAdvertise on http://@IP@:6666 AdvertiseFrequency 5 #AdvertiseSecurityKey secret #AdvertiseGroup @ADVIP@:23364 EnableMCPMReceive <Location /mod_cluster-manager> SetHandler mod_cluster-manager Require ip 127.0.0 </Location> </VirtualHost> </IfModule>
5.3 安装工作端二进制文件
使用 maven 构建 jar 文件
mvn install
Installing in Tomcat
cp container/tomcat/target/* $CATALINA_HOME/lib/ cp container/tomcat[100,85,8]/target/* $CATALINA_HOME/lib/ cp container/spi/target/* $CATALINA_HOME/lib/ cp load-spi/target/* $CATALINA_HOME/lib/ cp core/target/* $CATALINA_HOME/lib/ cp dist/target/dependency/jboss-logging* $CATALINA_HOME/lib/
使用独立的 JBoss Web 或 Tomcat 配置mod_cluster
编辑文件,在其他元素旁边添加以下内容:$CATALINA_HOME/conf/server.xml
<Listener/>
<Listener className="org.jboss.modcluster.container.catalina.standalone.ModClusterListener" advertise="true"/>
JBoss AS配置
在 JBoss AS 6 及更早版本中,mod_cluster的配置位于以下文件中
$JBOSS_HOME/server/$PROFILE/deploy/mod_cluster.sar/META-INF/mod_cluster-jboss-beans.xml
-
处理来自 Web 容器的事件的
ContainerEventHandler
-
对 JBoss mbean 服务器的引用。
<bean name="ModClusterListener" class="org.jboss.modcluster.container.jbossweb.JBossWebEventHandlerAdapter"> <constructor> <parameter class="org.jboss.modcluster.container.ContainerEventHandler"> <inject bean="ModClusterService"/> </parameter> <parameter class="javax.management.MBeanServer"> <inject bean="JMXKernel" property="mbeanServer"/> </parameter> </constructor> </bean>