最近一段时间一直在研究实现apache + jk_mod + tomcat实现负载均衡,起初负载均衡算是配置蛮顺利的,但是到了配置tomcat集群时所有配置都没有问题,但是tomcat日志中一直提示没有集群成员加入,为此搞了很久也没有解决,官方的文档也看了不少遍。最后突然想到tomcat集群是通过组播通讯,而组播通讯是通过udp协议实现通讯的,那么集群启动都正常,就是没有集群成员加入,会不会是因为iptables,设置问题,因此查看了45564端口发现是以tcp进行通讯,而实际上应该是以udp进行通讯。修改iptables规则后,集群终于成功。同时要特别注意,网上很多配置文章要么配置错误,要么配置不全,不可完全参考。

     负载均衡配置

  • 负载均衡实现的两种方式

1、mod_jk

2、mod_proxy

本篇文章是基于mod_jk进行配置的

  • mod_jk安装配置

1、下载mod_jk并安装mod_jk
                         下载地址:http://tomcat.apache.org/download-connectors.cgi

       wget http://mirrors.cnnic.cn/apache/tomcat/tomcat-connectors/jk/tomcat-connectors-1.2.40-src.tar.gz
tar -xzvf tomcat-connectors-1.2.40-src.tar.gz
cd /tomcat-connectors-1.2.40-src/native/
./configure --with-apxs=/usr/local/apache2/bin/apxs
make && make install
make clean

mod_jk.so会安装在/usr/local/apache2/modules/mod_jk.so

2、如果在安装apr环境变量,则需要配置apr环境变量

在安装完毕后会提示以下内容

        If you ever happen to want to link against installed libraries
        in a given directory, LIBDIR, you must either use libtool, and
        specify the full pathname of the library, or use the `-LLIBDIR'
        flag during linking and do at least one of the following:
           - add LIBDIR to the `LD_LIBRARY_PATH' environment variable
             during execution
           - add LIBDIR to the `LD_RUN_PATH' environment variable
             during linking
           - use the `-Wl,-rpath -Wl,LIBDIR' linker flag
           - have your system administrator add LIBDIR to `/etc/ld.so.conf'

根据提示,设置mod_jk环境变量

        export LD_LIBRARY_PATH=/usr/local/lib
        export LD_RUN_PATH=/usr/local/bin
        export PATH=$PATH:$LD_RUN_PATH
        export CLASSPATH=$CLASSPATH:$LD_LIBRARY_PATH
  • httpd.conf配置
    #加载http_jk.conf

    #引用http_jk的配置文件
include conf/extra/http_jk.conf # 加载 mod_jk 模块
LoadModule jk_module modules/mod_jk.so
  • 配置httpd-vhost.conf文件
        # Virtual Hosts
        #
        # Required modules: mod_log_config         # If you want to maintain multiple domains/hostnames on your
        # machine you can setup VirtualHost containers for them. Most configurations
        # use only name-based virtual hosts so the server doesn't need to worry about
        # IP addresses. This is indicated by the asterisks in the directives below.
        #
        # Please see the documentation at
        # <URL:http://httpd.apache.org/docs/2.4/vhosts/>
        # for further details before you try to setup virtual hosts.
        #
        # You may use the command line option '-S' to verify your virtual host
        # configuration.         #
        # VirtualHost example:
        # Almost any Apache directive may go into a VirtualHost container.
        # The first VirtualHost section is used for all requests that do not
        # match a ServerName or ServerAlias in any <VirtualHost> block.         <VirtualHost IP:80>
            ServerAdmin service@域名.com
            ServerName 域名
            DocumentRoot "/home/webapps/应用程序目录"
            DirectoryIndex index.do login.do index.jsp login.jsp
            ErrorLog "/home/logs/apache2/域名.com-error_log"
            CustomLog "/home/logs/apache2/域名-access_log" common             JkMount /*.jsp jk_controller
            JkMount /*.do jk_controller
            JkMount /*Servlet jk_controller
            JkMount /Servlet/* jk_controller
            JkMount /servlet/* jk_controller
            JkMount /kaptcha.jpg* jk_controller
            JkMount /j_spring_security_check jk_controller
            JkMount /jkStatus jk_watcher             <Directory "/home/webapps/应用程序目录">
              Options MultiViews
              AllowOverride None
              Allow from all
            </Directory>
        </VirtualHost>
  • httpd_jk.conf 配置

httpd_jk.conf主要定义 mod_jk 模块的位置、哪些访问地址需要转交给tomcat应用服务器处理、及 mod_jk 模块的连接日志设置,还有定义 worker.properties 文件的位置。在/usr/local/apache2/conf/extra/目录下创建httpd_jk.conf配置文件,并写入如下内容:

        # 指定  workers.properties 文件路径
        JkWorkersFile conf/workers.properties         # 指定那些请求交给 tomcat 处理 ,"jk_controller" 为在 workers.propertise 里指定的负载分配控制器
        JkMount /*.jsp jk_controller
        JkMount /*.do jk_controller
        JkMount /*.action jk_controller
        JkMount /*Servlet jk_controller
        JkMount /Servlet/* jk_controller
        JkMount /servlet/* jk_controller
        #JkMount /j_spring_security_check jk_controller         # 指定 log 目录 
        JkLogFile /home/logs/apache2/mod_jk/mod_jk2.log         JkShmFile /home/logs/apache2/mod_jk/mod_jk.shm         # Set the jk log level [debug/error/info]
        JkLogLevel info         # Select the log format
        JkLogStampFormat "[%a %b %d %H:%M:%S %Y]"         # JkOptions indicate to send SSL KEY SIZE,
        JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories         # JkRequestLogFormat set the request format
        JkRequestLogFormat "%w %V %T"

需要配置JkShmFile路径,否则会提示以下错误

       No JkShmFile defined in httpd.conf. Using default /usr/local/apache2/logs/jk-runtime-status

apache不会过滤配置中的命令行的空格,因此我们必须保证命令与参数之间是真正的空格隔开,另外在配置文件尾部不能有多余的空行,否则在启动apache时,会出现类似以下这样的错误提示,另外也要注意apache无法识别中文字符。否则提示类似下面的错误

       AH00526: Syntax error on line 12 of /usr/local/apache2/conf/extra/http_jk.conf:
Invalid command 'JkMount\xc2\xa0/*\xc2\xa0controller\xc2\xa0', perhaps misspelled or defined by a module not included in the server configuration AH00526: Syntax error on line 12 of /usr/local/apache2/conf/extra/mod_jk.conf:
JkMount needs a path when not defined in a location
  • workers.properties配置

1、worker常见属性

        ajp13                    :此类型表示当前worker为一个运行着的Tomcat实例。
        lb         :lb即load balancing,专用于负载均衡场景中的woker;此worker并不真正负责处理用户请求,而是将用户请求调度给其它类型为ajp13的worker。
        status         :用户显示分布式环境中各实际worker工作状态的特殊worker,它不处理任何请求,也不关联到任何实际工作的worker实例。具体示例如请参见后文中的配置。       
host             :Tomcat 7的worker实例所在的主机
        port             :Tomcat 7实例上AJP1.3连接器的端口
        connection_pool_minsize  :最少要保存在连接池中的连接的个数;默认为pool_size/2
        connection_pool_timeout  :连接池中连接的超时时长
        mount             :由当前worker提供的context路径,如果有多个则使用空格格开;此属性可以由JkMount指令替代
        retries             :错误发生时的重试次数
        socket_timeout         :mod_jk等待worker响应的时长,默认为0,即无限等待
        socket_keepalive     :是否启用keep alive的功能,1表示启用,0表示禁用
        lbfactor         :worker的权重,可以在负载均衡的应用场景中为worker定义此属性        ajp13        :此类型表示当前worker为一个运行着的Tomcat实例。
        lb         :lb即load balancing,专用于负载均衡场景中的woker;此worker并不真正负责处理用户请求,而是将用户请求调度给其它类型为ajp13的worker。
        status         :用户显示分布式环境中各实际worker工作状态的特殊worker,它不处理任何请求,也不关联到任何实际工作的worker实例。具体示例如请参见后文中的配置。         balance_workers         :用于负载均衡模式中的各worker的名称列表,需要注意的是,出现在此处的worker名称一定不能在任何worker.list属性列表中定义过,并且worker.list属性中定义的worker名字必须包含负载均衡worker。具体示例请参见后文中的定义。
        method             :可以设定为R、T或B;默认为R,即根据请求的个数进行调度;T表示根据已经发送给worker的实际流量大小进行调度;B表示根据实际负载情况进行调度。
        sticky_session         :在将某请求调度至某worker后,源于此址的所有后续请求都将直接调度至此worker,实现将用户session与某worker绑定。默认为值为1,即启用此功能。如果后端的各worker之间支持session复制,则可以将此属性值设为0。

2、worker配置

mod_jk安装包tomcat-connectors-1.2.32-src中已经自带了workers.properties包含默认配置和最小配置两种,也可以自行创建workers.properties,然后将workers.properties上传到/usr/local/apache2/conf目录下,以下是workers.properties的配置内容

        #JVMRoute-pj001, JVMRoute-pj002对应tomcat的engine的jvmRoute的名称
        worker.list=jk_controller,jk_watcher,JVMRoute-pj001,JVMRoute-pj002         #JVMRoute-pj001的tomcat节点配置
        #JK模块实现负载均衡采用的是AJP协议1.3版本,负载均衡服务器的类型配置为ajp13
        worker.JVMRoute-pj001.type=ajp13
        #负载均衡服务器的主机名、域名或者IP地址
        worker.JVMRoute-pj001.host=192.168.1.100
        #负载均衡服务器AJP协议连接器的连接端口
        worker.JVMRoute-pj001.port=8009 #8009 + 0
        #负载均衡服务器在整个负载均衡系统中所占的权重
        worker.JVMRoute-pj001.lbfactor=1
        #apache服务器是多线程的,tomcat能够利用这一优势来维持一定数量的连接作为缓存。
worker.JVMRoute-pj001.socket_keepalive=1
worker.JVMRoute-pj001.socket_timeout=300
        # 指定 JVMRoute-pj001 无法提供服务后由 JVMRoute-pj002 继续提供服务
        worker.JVMRoute-pj001.redirect=JVMRoute-pj002         #JVMRoute-pj002的tomcat节点配置,端口号+1000,保证唯一
        worker.JVMRoute-pj002.type=ajp13
        worker.JVMRoute-pj002.host=192.168.1.101
        worker.JVMRoute-pj002.port=8109 #8009 + 100
        worker.JVMRoute-pj002.lbfactor=10
        #apache服务器是多线程的,tomcat能够利用这一优势来维持一定数量的连接作为缓存。
worker.JVMRoute-pj002.socket_keepalive=1
worker.JVMRoute-pj002.socket_timeout=300
        # 指定 JVMRoute-pj002 无法提供服务后由 JVMRoute-pj001 继续提供服务
        worker.JVMRoute-pj002.redirect=JVMRoute-pj001         #========jk_controller,负载均衡控制器========
        #这里配置为lb,也就是Load Balance负载均衡
        worker.jk_controller.type=lb
        #拥有哪些负责负载均衡的服务器实例
        worker.jk_controller.balance_workers=JVMRoute-pj001, JVMRoute-pj002
        #设置负载均衡是否采用粘性会话。如果该属性设置为true,假设一个请求被s1处理了,下次来源于同一个客户端的请求也将被s1处理。
        worker.jk_controller.sticky_session=true         #========jk_watcher,负载均衡监视器========
        worker.jk_watcher.type=status
        worker.jk_watcher.read_only=false
        #设置名称为jk_watcher的负载均衡服务器实例监视器的挂载路径,通过http://218.5.76.101/jkStatus访问
        worker.jk_watcher.mount=/jkStatus
        #worker全局的重试次数。在apache服务器启动后,会最多尝试若干次去连接这些负载均衡服务器,若连接不上就认为是down掉了,这里配置为3
        worker.retries=3

负载均衡监控平台访问地址:http://ip地址/jkStatus

tomcat集群配置

  • iptables设置

1、开启防火墙端口

防火墙端口开放参考上面的设置。tomcat集群开放的根据tomcat的配置文件server.xml进行开放,一般需要开放的端口有

8005,8080,8009,8443,45564,4000:4100

2、验证服务器是否启用组播

执行ifconfig查看网卡信息,若ifconfig命令显示的内容中含有红线部分的内容表示支持组播通讯

3、端口通讯协议验证

45564端口以udp进行通讯,如果设定成tcp通讯,将会导致集群配置无法成功

4000-4100以tcp进行通讯

4、添加集群路由

          route add -net 224.0.0.0 netmask 240.0.0.0 dev eth2
  • 修改tomcat配置文件

1、修改链接器端口号

若是同一台服务部署多个tomcat,则链接器的端口号必须保证唯一,若是不同台服务器,由于ip不一样可以不修改

          <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

2、定义Engine节点的jvmRoute名称

         <Engine name="Catalina" defaultHost="localhost">

改为

         <Engine name="Catalina"    defaultHost="localhost" jvmRoute="JVMRoute-pj001">  

其中JVMRoute-pj001必须与workers.properties中的定义的保持一致

3、启用tomcat集群,实现session共享

配置集群有两种方式,一种是节点对节点的全拷贝,就是all to all,以下第一种就是,配置起来比较简单。另外一种是根据需要进行配置。tomcat7默认是采用DeltaManager模式,它通过将改变了会话数据同步给集群中的其它节点实现会话复制。

1、若是拷贝所有的session,则直接启用即可

              <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>

这种方式经过测试只能实现粘性session模式,无粘性模式测试不成功,sessionid测试一直变化,无法保证唯一,而且根据官方说明也只能采用无粘性模式。在这边绕了很久,花了很长时间才搞清楚。

2、完整配置

      <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="8">
        <Manager
            className="org.apache.catalina.ha.session.BackupManager"
            expireSessionsOnShutdown="false"
            notifyListenersOnReplication="true"
            mapSendOptions="6"
        />         <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="172.20.206.146"
                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"/>
        <ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>
        <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
      </Cluster>
  • 域名绑定访问

1、apache:修改/usr/local/apache2/conf/extra/httpd-vhosts.conf,假设站点目录为/home/webapps/site

		<VirtualHost ip地址:80>
ServerAdmin zouqf@ps007.com ServerName 域名
ServerAlias 域名 DocumentRoot "/home/webapps/site"
ErrorLog "/home/logs/apache2/域名-error_log"
CustomLog "/home/logs/apache2/域名-access_log" common JkMount /*.jsp JVMRoute-pj001
JkMount /*.do JVMRoute-pj001
JkMount /*Servlet JVMRoute-pj001
JkMount /Servlet/* JVMRoute-pj001
JkMount /servlet/* JVMRoute-pj001
JkMount /j_spring_security_check JVMRoute-pj001
JkMount /jkStatus jk_watcher <Directory "/home/webapps/site">
Options MultiViews
AllowOverride None
Allow from all
</Directory>
</VirtualHost>

2、修改/usr/local/tomcat/conf/server.xml

	    <Host name="www.站点域名.com" debug="0" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<alias>www.站点域名.com</alias>
<Context path="" docBase="/home/webapps/site" debug="0" reloadable="true"/>
</Host>
  • Session序列化

tomcat集群中,站点中的javabean必须能够序列化,这样才能实现共享和持久化和共享,而java自带的序列化机制效率不高,因此可以使用自定义的序列化包,有多种自定义的序列化包,以下为比较常用的序列化包

1、kryo-serializer: msm-kryo-serializer, kryo-serializers, kryo, minlog, reflectasm, asm-3.2
            2、javolution-serializer: msm-javolution-serializer, javolution-5.4.3.1
            3、xstream-serializer: msm-xstream-serializer, xstream, xmlpull, xpp3_min
            4、flexjson-serializer: msm-flexjson-serializer, flexjson

  • 参考资料:

说明网上实现tomcat集群配置内容不一,有的内容错误,有的内容残缺不全,需要花费一点时间研究

http://m.oschina.net/blog/87469
             http://www.cnblogs.com/itech/archive/2009/08/18/1548723.html
             http://tomcat.apache.org/connectors-doc/webserver_howto/apache.html
             http://blog.csdn.net/bluishglc/article/details/6867358
             http://blog.csdn.net/maxracer/article/details/7207279
             http://blog.csdn.net/chaijunkun/article/details/6987443
             http://blog.sina.com.cn/s/blog_5f53615f0100p4fj.html
             http://www.ibm.com/developerworks/cn/opensource/os-lo-apache-tomcat/
             http://tomcat.apache.org/tomcat-7.0-doc/cluster-howto.html
             http://www.verydemo.com/demo_c199_i25182.html
             http://blog.csdn.net/kobe_lzq/article/details/7047834
             http://blog.csdn.net/lifetragedy/article/details/7712691

http://blog.csdn.net/lifetragedy/article/details/7707455

http://www.it165.net/admin/html/201409/3804.html
             http://www.linuxidc.com/Linux/2014-09/107336.htm
             http://blog.i5a6.com/901.html
             http://www.ibm.com/developerworks/cn/opensource/os-lo-apache-tomcat/index.html

linux+apache+mod_Jk+tomcat实现tomcat集群的更多相关文章

  1. Linux平台上搭建apache+tomcat负载均衡集群

    传统的Java Web项目是通过tomcat来运行和发布的.但在实际的企业应用环境中,采用单一的tomcat来维持项目的运行是不现实的.tomcat 处理能力低,效率低,承受并发小(1000左右).当 ...

  2. Tomcat多实例集群架构 安全优化和性能优化

    Tomcat多实例 复制tomcat目录 /usr/local/tomcat1 /usr/local/tomcat2 修改多实例配置文件 #创建多实例的网页根目录 mkdir -p /data/www ...

  3. nginx+tomcat+redis的集群+session共享

    nginx+tomcat+redis的集群+session共享 环境准备 1.tomcat版本:tomcat7 tomcat下载及安装,目前很多好的资源和步骤,此处省略. 2.jdk版本:jdk1.7 ...

  4. tomcat+nginx+redis集群试验

    Nginx负载平衡 + Tomcat + 会话存储Redis配置要点   使用Nginx作为Tomcat的负载平衡器,Tomcat的会话Session数据存储在Redis,能够实现0当机的7x24 运 ...

  5. Nginx+Tomcat+Memcached 实现集群部署时Session共享

    Nginx+Tomcat+Memcached 实现集群部署时Session共享 一.简介 我们系统经常要保存用户登录信息,有Cookie和Session机制,Cookie客户端保存用户信息,Sessi ...

  6. Java应用服务器之tomcat会话复制集群配置

    会话是识别用户,跟踪用户访问行为的一个手段,通过cookie(存在客户端)或session(存在服务端)来判断本次请求是那个客户端发送过来:常用的会话保持有绑定会话,就是前边我们聊的在代理上通过算法或 ...

  7. Apache和Nginx负载均衡集群及测试分析

    一.应用场景介绍 本文主要是介绍Apache和Tomcat在Linux环境下的安装讲解以及AJP协议动静分离负载均衡的实现,以及与Nginx负载性能比较.联网安装较为简单,故此处只说脱机的Linux环 ...

  8. Linux上搭建Hadoop2.6.3集群以及WIN7通过Eclipse开发MapReduce的demo

    近期为了分析国内航空旅游业常见安全漏洞,想到了用大数据来分析,其实数据也不大,只是生产项目没有使用Hadoop,因此这里实际使用一次. 先看一下通过hadoop分析后的结果吧,最终通过hadoop分析 ...

  9. 在Linux上使用Nginx为Solr集群做负载均衡

    在Linux上使用Nginx为Solr集群做负载均衡 在Linux上搭建solr集群时需要用到负载均衡,但测试环境下没有F5 Big-IP负载均衡交换机可以用,于是先后试了weblogic的proxy ...

  10. 全是干货---Linux 高可用(HA)集群基本概念详解

    http://www.linuxidc.com/Linux/2013-08/88522.htm 高可用集群的衡量标准    HA(High Available), 高可用性群集是通过系统的可靠性(re ...

随机推荐

  1. 【Python Network】使用DOM生成XML

    单纯的为DOM树添加结点. #!/usr/bin/env python # Generating XML with DOM - Chapter 8 - domgensample.py from xml ...

  2. hud1520Anniversary party(树形DP)

    链接 第一道树形DP 根据左儿子 右兄弟 将多叉树转化成二叉树 结构体里保存取这个节点和不取这个节点的最大值 #include <iostream> #include<cstdio& ...

  3. 【转】你应该知道的十个VirtualBox技巧与高级特性

    原文网址:http://www.searchvirtual.com.cn/showcontent_76463.htm VirtualBox集成的许多功能你可能从来没有使用过,即使你经常用它来运行虚拟机 ...

  4. APMServ5.2.6 升级PHP版本 到高版本 5.3,5.4

    首先下载:http://windows.php.net/downloads/releases/php-5.3.28-Win32-VC9-x86.zip  Thursday, December 12, ...

  5. 理解wait notify的好例子

    import java.util.concurrent.TimeUnit; public class Example2 { /** * @param args */ public static voi ...

  6. QT5.1在Windows下 出现QApplication: No such file or directory 问题的解决办法

    QT5.0.1在Windows下 出现QApplication: No such file or directory 问题的解决办法 分类: 编程语言学习 软件使用 QT编程学习2013-03-07 ...

  7. Java项目中基于Hibernate分页总结

    1,First of all,  we should have a wrapper class for page,this class can calculate the startRow by th ...

  8. 各种jee服务器的比较,tomcat, jboss, glassfish, websphere, weblogic

    tomcat, 开源,只是一个 servlet jsp 容器. jboss, 开源,是一个j2ee 应用服务器,容器支持 servlet, jsp, ejb,jms等. 稳定且实现了全部j2ee ap ...

  9. 【转】git - 简明指南

    git - 简明指南 助你入门 git 的简明指南,木有高深内容 ;) 作者:罗杰·杜德勒 感谢:@tfnico, @fhd 和 Namics其他语言 english, deutsch, españo ...

  10. myEclipse和eclipse修改或复制项目名称后-更新部署名称

    一.myEclipse 复制后修改名称,访问不到项目 这是因为,你只是改了项目的名称,而没有改 下面是解决方法: 方法 1.右击你的项目,选择“properties”,在“type filter te ...