最近看集群的资料,利用工作比较空闲的时间,查看网上的资料。搭了一个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",
apache2.2+tomcat7.0+jk2 实现负载均衡 配置过程_代理服务器 


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 

apache2.2+tomcat7.0+jk2 实现负载均衡 配置过程_资料_02

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

apache2.2+tomcat7.0+jk2 实现负载均衡 配置过程_资料_03

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

apache2.2+tomcat7.0+jk2 实现负载均衡 配置过程_代理服务器_04


至此负载均衡的配置完成。直接将手上的项目拷贝到两个tomcat目录下。即可进行负载均衡测试。打开多个ie窗口,观察两个tomcat后面的输出。

apache2.2+tomcat7.0+jk2 实现负载均衡 配置过程_资料_05

如何不行的话,很有可能是jk版本不匹配,换一个试试
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,初学这个,问题还是挺多的,敬请各位 指教。