1.mod_cluster简介
mod_cluster 和mod_jk,mod_proxy类似,是一个基于httpd的负载平衡项目能够代理请求给基于Tomcat 网络服务器集群(支持任何独立的Tomcat,独立的JBoss Web或者JBoss AS的嵌入JBoss Web)。mod_cluster与 mod_jk和mod_proxy的区别是,mod_cluster为web服务器和httpd服务器之间提供后台通道。web服务器使用后台通道给 httpd端提供当前状态信息。
2.mod_cluster优点
1.能够动态配置httpd 工作任务:无需在httpd端配置各个server的IP和端口,有自动发现机制。
2.提供服务器端负载权重因子计算:根据服务器节点的CPU、内存、jvm堆栈、数据库连接池、线程池使用率等,由web服务器端自动进行计算负载权重,可降低httpd服务器端的压力
3.更优粒度web应用管理(事件通知机制):web-app部署/卸载都会通知到httpd服务器,这样httpd服务器就不会将请求转发至已解部署该应用的Server,减少时间开支。并可对所有检测到的server下的应用进行Disable和Enable操作。
4.支持AJP、HTTP、HTTPS协议
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.下载
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上升级安装的,则配置有所不同,详情参考官方文档。):
#for mod_cluster
#加载必要的.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和端口
Listen 192.168.11.24:6666
#配置虚拟主机
<VirtualHost 192.168.11.24:6666>
<Directory />
Order deny,allow
Deny from all
#Allow from 127.0.0.1
Allow from all
</Directory>
KeepAliveTimeout 60
MaxKeepAliveRequests 0
#声明一个负载均衡器
ManagerBalancerName mycluster
AdvertiseFrequency 5
ServerAdvertise On
AllowDisplay On
</VirtualHost>
#设置代理转发,这里为将所有请求都转发至mycluster负载均衡器
ProxyPass / balancer://mycluster/
#配置mod_cluster-manager,这样才可以访问到mod_cluster-manager管理页面
<Location /mod_cluster-manager>
SetHandler mod_cluster-manager
Order Deny,Allow
Deny from all
Allow from all
</Location>
5.3安装server-side components
http://www.jboss.org/mod_cluster/downloads/1-1-0.html下载最新java mod_cluster 1.1.0.Final,解压后将JBossWeb-Tomcat下所有jar包拷贝至tomcat_home/lib下。
5.4配置server-side
修改tomcat_home/conf/server.xml:
<Listener className="org.jboss.modcluster.catalina.ModClusterListener" advertise="true"/> //添加此行配置
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1"> //在此行配置中添加jvmRoute属性
5.5访问mod_cluster-manager查看配置结果
按照5.3、5.4说明,在多个tomcat下安装配置server-side components,注意jvmRoute须配置成不同标识。启动所有Tomcat Server及httpd,访问apache的mod_cluster-manager页面:http://ip:port/mod_cluster- manager ,<!--@import url(scrollbar.css); -->页面将显示mod_cluster一些状态信息,并且显示所有监测到的web服务器,以及各服务器下存在的应用,并可以对这些应用进行 Disable和Enable操作,并且web服务器的启停和web-app部署/卸载都能在该页面动态更新。如下图所示:
注:如果页面没有显示mod_cluster的状态信息,请检查一下是否在<VirtualHost></VirtualHost>中设置了AllowDisplay On
5.6 load-demo.war测试
http://www.jboss.org/mod_cluster/downloads/1-0-3-GA下载java mod_cluster 1.0.3.GA后解压出,将解压出的demo目录下的demo/server/load-demo.war部署至各个Tomcat Server,执行demo\client\run-demo.bat,会弹出一个类似于LoadRunner的图形界面小工具(具体使用参见官方文档 http://docs.jboss.org/mod_cluster/1.1.0/html/demo.html),从测试结果看,apache将模拟 的请求均匀的转发至各个Tomcat Server了。如下图:
特别注意:这里不要使用java mod_cluster 1.1.0.Final下的load-demo.war,这个版本的load-demo.war有bug,用不了,花了我不少时间,建议使用java mod_cluster 1.0.3.GA版本的demo。
6.某app-server与mod_cluster集成需要做的工作
1.配置一个Listerner组件
mod_cluster为web服务器和httpd服务器之间提供后台通道,该后台通道需要在web server服务器端安插一个Listerner组件(如tomcat server需要一个ModClusterListener组件)。该组件负责与httpd服务器进行交互:比如将计算出的负载权重因子、web-app 生命周期状态等信息推送至http服务器。现在tomcat和jboss都提供在server.xml中配置这个Listener:
<Listener className="org.jboss.modcluster.catalina.ModClusterListener" advertise="true"/>
现在TongWeb配置文件和管理控制台没有提供配置这个Listener的地方,但是com.tongweb.web.core.core.StandardServer中提供了addLifecycleListener()方法可以添加生命周期Listener。
2. 改造mod_cluster提供的server-side components
简单查看了一下mod_cluster提供的server-side components 的jar包源码,里面部分源码依赖于tomcat或jboss的一些源码,比如说ModClusterListener就具有一些依赖关系:
java 代码
mport org.apache.catalina.Lifecycle;
import org.apache.catalina.LifecycleEvent;
import org.apache.catalina.LifecycleListener;
import org.apache.catalina.Server;
import org.apache.tomcat.util.IntrospectionUtils;
import org.apache.tomcat.util.modeler.Registry;