使用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

 

 

  1. 处理来自 Web 容器的事件的 ContainerEventHandler

  2. 对 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>

 

posted @ 2022-08-19 14:13  fengjian1585  阅读(237)  评论(0编辑  收藏  举报