最近看集群的资料,利用工作比较空闲的时间,查看网上的资料。搭了一个Apache+JK2+Tomcat的集群环境,经过自己的系统测试,实现了集群的负载均衡和失败托管。简单的说一下这种集群:
反向代理负载均衡 (Apache+JK2+Tomcat)
使用代理服务器可以将请求转发给内部的Web服务器,让代理服务器将请求均匀地转发给多台内部Web服务器之一上,从而达到负载均衡的目的。这种代理方式与普通的代理方式有所不同,标准代理方式是客户使用代理访问多个外部Web服务器,而这种代理方式是多个客户使用它访问内部Web服务器,因此也被称为反向代理模式。
软件列表如下:
Apache 服务器 下载地址:http://httpd.apache.org/download.cgi 版本2.2
Tomcat 下载地址:http://tomcat.apache.org/download-60.cgi 版本6.0
mod_jk-1.2.30-httpd-2.2.3.so 下载地址:http://tomcat.apache.org/dev/dist/tomcat-connectors/jk/binaries/win32/jk-1.2.30/
1: 首先实现负载均衡。
1.1.安装完后,apache,tomcat服务器后,在我的电脑目录结构如下:
D:\apache,D:\ tomcat-6.0.26-1, D:\ tomcat-6.0.26-1.
1.2 .将下载过来的mod_jk-1.2.30-httpd-2.2.3.so,复制放到Apache服务器里面的D:\apache\modules目录下。
1.3.然后在D:\apache\conf\目录下面找到httpd.conf文件。修改文件的最后一行在最后面加上一句.
include "D:\apache\conf\mod_jk.conf",
1.4.在D:\apache\conf目录下面新建mod_jk.conf文件。文件内容如下:
#加载mod_jk Module
LoadModule jk_module modules/mod_jk-1.2.30-httpd-2.2.3.so
#指定 workers.properties文件路径
JkWorkersFile conf/workers.properties
#指定那些请求交给tomcat处理,"controller"为在workers.propertise里指定的负载分配控制器
JkMount /*.* controller
1.5.在http.conf同目录下新建 workers.properties文件,内容如下:
worker.list = controller,tomcat-6.0.26-1,tomcat-6.0.26-2 #server 列表
#======== tomcat-6.0.26-1========
worker.tomcat-6.0.26-1.port=8009 #ajp13 端口号,在tomcat下server.xml配置,默认8009
worker.tomcat-6.0.26-1.host=localhost #tomcat的主机地址,如不为本机,请填写ip地址
worker.tomcat-6.0.26-1.type=ajp13
worker.tomcat-6.0.26-1.lbfactor = 1 #server的加权比重,值越高,分得的请求越多
#======== tomcat-6.0.26-2========
worker.tomcat-6.0.26-2.port=9009 #ajp13 端口号,在tomcat下server.xml配置,默认8009
worker.tomcat-6.0.26-2.host=localhost #tomcat的主机地址,如不为本机,请填写ip地址
worker.tomcat-6.0.26-2.type=ajp13
worker.tomcat-6.0.26-2.lbfactor = 1 #server的加权比重,值越高,分得的请求越多
#========controller,负载均衡控制器========
worker.controller.type=lb
worker.controller.balanced_workers=tomcat-6.0.26-1,tomcat-6.0.26-2 #指定分担请求的tomcat
worker.controller.sticky_session=1
1.6.因为我是一台电脑上配置,所以最后还要修改第二个tomcat服务器的配置端口。如果在两台电脑上就不用修改端口了。
<Server port="9005" shutdown="SHUTDOWN">将关闭端口改为9005。
<Connector port="9080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />将连接端口改为9080。
<!-- Define an AJP 1.3 Connector on port 8009 -->
<Connector port="9009" protocol="AJP/1.3" redirectPort="8443" />将ajp1.3端口改为9009
至此负载均衡的配置完成。直接将手上的项目拷贝到两个tomcat目录下。即可进行负载均衡测试。打开多个ie窗口,观察两个tomcat后面的输出。
2:实现失败托管,也就是session复制。
2.1.在tomcat1里面的server.xml 增加
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat-6.0.26-1">
tomcat2里面增加:
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat-6.0.26-2">
这些元素在tomcat里面被注释掉了,找到注释的部分位置,加在那个位置即可。
2.2.对于Cluster元素的配置。我直接从tomcat里面拷贝了完整的代码,在tomcat5.tomcat6里面都是可以的。将它粘贴到两个tomcat的sever.xml
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
channelSendOptions="8">
<Manager className="org.apache.catalina.ha.session.DeltaManager"
expireSessionsOnShutdown="false"
notifyListenersOnReplication="true"/>
<Channel className="org.apache.catalina.tribes.group.GroupChannel">
<Membership className="org.apache.catalina.tribes.membership.McastService"
address="228.0.0.4"
port="45564"
frequency="500"
dropTime="3000"/>
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
address="auto"
port="4000"
autoBind="100"
selectorTimeout="5000"
maxThreads="6"/>
<Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
<Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
</Sender>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
</Channel>
<Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
filter=""/>
<Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
<Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
tempDir="/tmp/war-temp/"
deployDir="/tmp/war-deploy/"
watchDir="/tmp/war-listen/"
watchEnabled="false"/>
<ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>
<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
</Cluster>
因为是在同一台电脑上,所以在粘贴第二个时。微做修改将tomcat将端口改为4002;
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
address="auto"
port="4002"
autoBind="100"
selectorTimeout="5000"
maxThreads="6"/>
2.3.最后要tomcat支持session复制,必须在web.xml里面加上一个标签。<distributable/>
在你工程的web.xml最后面加上这一句即可。最后运行你的tomcat,。用户登陆进系统后,查看tomcat运行的日志。看它运行在那个tomcat下,然后此时关闭这个tomcat。然后会发现另外一个tomcat此时会将关闭的那个tomcat的session复制过来,实现了失败托管。你再继续运行系统,发现不用退出系统,也能够继续运行该系统,此时跳转到另外一个tomcat上了。这样虽然在服务器端down机了,但是对客户来说却是透明的。当然这只是一个demo,实际运行可能比这复制多了。学习中………..
最后强调一点,我的系统原来权限引擎这块实体没有实现序列化接口。以前系统没有考虑到集群环境。(小系统)。这在session复制中肯定会报错。所有实体必须实现序列化接口,现在系统基本实现了集群,但是某些模块还是有些序列化没实现的小问题。有些bug,初学这个,问题还是挺多的,敬请各位指教。