构建apache+tomcat集群

来源:互联网 发布:疯狂淘宝李涛 编辑:程序博客网 时间:2024/03/29 09:24

         今年一直在公司开发一个app项目,做了半年就上线了,开始的用户访问量不大, 后来访问量越来越大,客户反映经常出现连接服务器失败。为了改善这个,我从程序上进行优化,修改tomcat配置,把数据库换成阿里云数据库,但感觉这些都不是最好的解决办法,其根本原因是单台tomcat服务器无法处理高并发的请求,有性能瓶颈,后来想到负载均衡、tomcat集群,就在网上找了一些资料,采用1个apache+多个tomcat集群方式,慢慢研究就搭建起来了,集群模式架构如下:


         首先想到要解决两个问题:

1、如何实现多台应用服务器之间的session共享(比如A用户登录,处理这个请求的是tomcat1,session在tomcat1上,如果不做session共享,A用户再次做操作,例如查询列表数据,这个请求可能由tomcat2来处理,发现找不到session,会提示登录,所以必须解决此问题)

2、如何使用多台应用服务器实现压力分解。

        其实集群可以多台物理服务器,每台物理机上部署一个tomcat,这种方式是横向集群。还有一种是在一台物理机上部署多台应用服务器tomcat,这种方式是纵向集群,本文讲解的是纵向集群。

1、先准备好要使用的软件:apache2.4 ,tomcat8,mod_jk(apache和tomcat的连接器,我采用的是1.2版本,需要与apache版本对应)

apache2.4官网下载:http://httpd.apache.org/download.cgi

tomcat8官网下载:http://tomcat.apache.org/download-80.cgi

mod_jk下载地址:http://archive.apache.org/dist/tomcat/tomcat-connectors/jk/binaries/windows/   我下载的是

下载好之后放到一个文件夹,如下

2、将你下载的tomcat复制一份,我们做两个tomcat集群,修改tomcat的配置文件server.xml。在一台机器上部署多个tomcat需要修改端口,保持两个tomcat端口不一致才行。

以我的为例,

apache-tomcat-1  server.xml修改3个地方:




apache-tomcat-2 server.xml修改3个地方:




在tomcat/bin/startup.bat文件开头第一行加上

SET JAVA_HOME=C:\Program Files\Java\jdk1.8.0_91
SET CATALINA_HOME=E:\software\fzjh\apache-tomcat-2

这两行代码,以保证tomcat能正常启动,不配置这个tomcat启动会一闪而过。

两个tomcat的server.xml文件加上如下这段:


可以在文件中搜索"cluster"然后将它覆盖,为了方便复制,我讲代码贴出来:

<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"    
                   channelSendOptions="6">    
        
            <Manager className="org.apache.catalina.ha.session.BackupManager"    
                     expireSessionsOnShutdown="false"    
                     notifyListenersOnReplication="true"    
                     mapSendOptions="6"/>     
            <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"    
                          bind="127.0.0.1"    
                          address="228.0.0.4"    
                          port="45564"    
                          frequency="500"    
                          dropTime="3000"/>    
              <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"    
                        address="127.0.0.1"    
                        port="4001"    
                        selectorTimeout="100"    
                        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"/>    
              <Interceptor className="org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor"/>    
            </Channel>    
        
            <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"    
                   filter=".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;"/>    
        
            <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>    
      </Cluster> 

至此,tomcat的配置就完成了,可以启动一下两个tomcat,看能不能正常启动。

3、开始配置apache服务器了,打开文件:httpd-2.4.23-x64-vc14-r3\Apache24\conf\httpd.conf

1)修改根路径SRVROOT,在文件中搜索这个单词"SRVROOT",修改成你的apache所在实际路径,比如我的


2)在文件最后加上一句话: include conf/mod_jk.conf

3) http.conf 同目录下新建mod_jk.conf文件,内容如下:

#加载mod_jk Module     
LoadModule jk_module modules/mod_jk.so
    
#指定 workers.properties文件路径     
JkWorkersFile conf/workers.properties     
    
#指定那些请求交给tomcat处理,"controller"为在workers.propertise里指定的负载分配控制器     
#JkMount /*.jsp controller
JkMount /* controller

4)  在http.conf同目录下新建workers.properties,内容如下:

worker.list = controller,tomcat1,tomcat2  #server 列表      
#========tomcat1========      
worker.tomcat1.port=8010       #ajp13 端口号,在tomcat下server.xml配置,默认8009      
worker.tomcat1.host=localhost  #tomcat的主机地址,如不为本机,请填写ip地址      
worker.tomcat1.type=ajp13      
worker.tomcat1.lbfactor = 1    #server的加权比重,值越高,分得的请求越多      
     
#========tomcat2========      
worker.tomcat2.port=8011       #ajp13 端口号,在tomcat下server.xml配置,默认8009      
worker.tomcat2.host=localhost  #tomcat的主机地址,如不为本机,请填写ip地址      
worker.tomcat2.type=ajp13      
worker.tomcat2.lbfactor = 1    #server的加权比重,值越高,分得的请求越多      
     
#========controller,负载均衡控制器========      
worker.controller.type=lb      
worker.controller.balanced_workers=tomcat1,tomcat2   #指定分担请求的tomcat      
worker.controller.sticky_session=1  


要注意的是,worker.tomcat1.port 这个端口一定要写正确,这就是apache连接的多个tomcat,就是这个


5) 将刚开始下载好的mod_jk.so文件拷贝到httpd-2.4.23-x64-vc14-r3\Apache24\modules目录下,以便apache加载连接器。



至此所有的负载均衡配置就配置好了,下面进行测试, 先启动apache服务器,

在cmd窗口中进入apache24/bin目录,输入net start apache2.4命令进行启动。

把应用放到apache-tomcat-1,apache-tomcat-2的webapps目录下并启动(你的应用的web.xml文件需要加上一个标签<distrbutable/>,加在</web-app>标签上面一行,这说明你的应用要支持集群模式),如果两个tomcat都出现过如下日志,说明负载均衡配置成功:


apache的默认端口是80,我在浏览器中输入http://localhost/school回车,登录到我的项目中,点击各种功能,发现两个tomcat已经在协同工作,并交互分担请求,这说明已经成功了。

      这样,你的应用就是负载均衡模式了,对于访问量大、高并发情况是很有效的, 停掉一个tomat后,另一个tomcat依然对外提供服务,对于用户来说完全没有影响使用,这就可以实现不停服务的情况下升级应用程序。

        好啦,赶快按照这个步骤搭建你的负载均衡、服务器集群应用吧,有不明白的可以留言。


1 0
原创粉丝点击