zoukankan      html  css  js  c++  java
  • apache+jk+tomcat集群+session同步

    apache2+tomcat5.5集群+session同步
    作者:刘宇 liuyu.blog.51cto.com
    msn群:mgroup49073@hotmail.com (linuxtone)
     
    说明:借前人之鉴,写一篇关于tomcat集群及session同步的问题,首先介绍tomcat集成及做集群的原因和必要性,session同步的作用。然后包括各软件的安装配置。
     
    原理:tomcat 做个WEB服务器有它的局限性,处理能力低,效率低。承受并发小(1000左右)。但目前有不少网站或者页面是JSP的。并采用了tomcat做为WEB,因此只能在此基础上调优。
    目前采取的办法是Apache + Mod_JK + tomcat 来解决一部分请求,用户访问的是apache,但有jsp页面的时候才会去请求tomcat。如果量一大,那么tomcat无法承受,那么只能做tomat集群,Apache + Mod_JK 就是负载均衡器了。
    Mod_JK2负载均衡 可以把不同的jsp请求转发到不同的tomcat服务器,还可以侦测服务器存活。如果有条件可以给Mod_JK2做一个HA因为做完集群后压力就在JK上了。
          
    简单拓仆图:
    鎷撲粏鍥�
     
    一、测试环境及软件安装:-----如果已经安装过的可以省略这步
    linux 2.6 内核  centos 5.2
    本例二台tomcat 不在同一机器。
     
    先安装了所需的程序库
    yum -y install gcc gcc-c++ autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurses ncurses-devel curl curl-devel
     
    下载源码包:(本文不安装PHP)
    apache2 和tomcat5都可以在 apache.org 下载
    tomcat5需要JDK1.5的版本。
    JK本文用的源码包tomcat-connectors
     
    Apache 安装:
    # tar zxvf httpd-2.2.8.tar.gz
    #cd httpd-2.2.8
    # ./configure --prefix=/usr/local/apache2 --enable-modules=so --enable-so
    # make && make install
     
    /usr/local/apache2/bin/apachectrl start
    看到apache就配置成功了。
     
     
    JDK的安装
    #chmod 755 jdk-1_5_0_16-linux-i586.bin
    #./jdk-1_5_0_16-linux-i586.bin
    # mv jdk-1_5_0_16 /usr/local/
    到此JDK已经安装完成
     
    到/usr/bin目录下,把原用的java,javac文件删除:
    #rm -rf java
    #rm –rf javac
    在/usr/bin 下建立 软连接 java
    # ln -s /usr/local/jdk-1_5_0_16/bin/java /usr/bin/java
    # ln -s /usr/local/jdk-1_5_0_16/bin/javac /usr/bin/javac
    # java –version
    # javac -version
    java version "1.4.2_08"
    Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2_08-b03)
    Java HotSpot(TM) Client VM (build 1.4.2_08-b03, mixed mode)
     
     
    为了方便下在的工作建立两个软链接:
    ln -s /usr/local/jdk-1_5_0_16  /usr/local/jdk
    ln -s /usr/local/jdk-1_5_0_16/jre /usr/local/jre
     
     
    Tomcat的安装
    #tar -zxvf apache-tomcat-5.5.27.tar.gz
    # mv apache-tomcat-5.5.27 /usr/local/tomcat
    设置环境变量:
    #Set  Environment  by NetSeek
    JAVA_HOME=/usr/local/jdk
    export JAVA_HOME
    JRE_HOME=/usr/local/jre
    export JRE_HOME
    CLASSPATH=/usr=/usr/local/tomcat/common/lib/:/usr/local/jdk/lib:/usr/local/jre/lib
    export CLASSPATH
    PATH=$PATH:/usr/local/tomcat/bin/:/usr/local/apache/bin:/usr/local/jdk/bin:/usr/local/jre/bin
    export PATH
    TOMCAT_HOME=/usr/local/tomcat
    export TOMCAT_HOME
     
    启动tomcat以检查是否存在错误:
    #cd /usr/local/tomcat/bin
    #./startup.sh
    [url]http://IP[/url]地址:8080 可以看到猫头:)成功了。
     
    在另一台机器上也安装tomcat 并配置好。
     
    JK 安装 (整合apache tomcat)
    # tar zxvf tomcat-connectors-1.2.27-src.tar.gz
    #cd tomcat-connectors-1.2.27-src/native
    # ./configure --with-apxs=/usr/local/apache2/bin/apxs --with-java-home=/usr/local/jdk
    # make && make install
     
    在/usr/local/apache2/modules/ 下会产生mod_jk.so
    修改apache配置文件:
    LoadModule jk_module modules/mod_jk.so
     
    JkWorkersFile /usr/local/tomcat/conf/jk/workers.properties   JK配置文件 负载的配置
    JkShmFile logs/mod_jk.shm
    JkLogFile /usr/local/tomcat/logs/mod_jk.log  相关日志的设置
    JkLogLevel info
    JkMount /*.jsp controller  将jsp的请求转发给 controller(负载均衡控制器)
     
    修改DoucmentRoot 与tomcat的目录一致。
    本文修改为:/usr/local/tomcat/webapps/
     
    二、调度器JK的配置
    建立JK配置文件:
    #vi /usr/local/tomcat/conf/jk/workers.properties
    workers.tomcat_home=/usr/local/tomcat    #指定tomcat的目录――如果2个tomcat在同一台机器该选项去掉
    workers.java_home=/usr/local/jdk         #指定jdk的目录
    ps=/                                    
    worker.list=controller                   #指定负载名,这个可以随便起,与下面的 worker.controller.type=lb要对应
     
    #========tomcat1======== 第一台tomcat的配置
    worker.tomcat1.port=8009
    worker.tomcat1.host=localhost   #这里也可以写IP
    worker.tomcat1.type=ajp13      
    worker.tomcat1.lbfactor=1       #权量 数值越大,分配的机率就最小
     
    #========tomcat2===========
    worker.tomcat2.port=8009
    worker.tomcat2.host=192.168.19.81 (tomcat2的IP)
    worker.tomcat2.type=ajp13
    worker.tomcat2.lbfactor=1
     
    #========controller,负载均衡器=======
    worker.controller.type=lb
    worker.controller.balance_workers=tomcat1,tomcat2  # server.xml配置文件里的jvmRoute="tomcat1"指定的名字
    worker.controller.sticky_session=1
     
    三、tomcat集群配置,session 同步配置:
    1、tomca1 tomcat 2 在同一台机器
    Tomcat 1  (IP: 192.168.19.199)    
    A、修改Engine节点信息: <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">
    B、去掉<Cluster>  <Cluster> 的注释符
    C、修改Cluster 节点信息
    <Membership               
    className="org.apache.catalina.cluster.mcast.McastService"                

    mcastBindAddress="192.168.19.199"                
    mcastAddr="224.0.0.1"                
    mcastPort="45564"    
    mcastFrequency="500"                
    mcastDropTime="3000"/>
          <Receiver           
    className="org.apache.catalina.cluster.tcp.ReplicationListener"                

    tcpListenAddress="192.168.19.199"                
    tcpListenPort="4001"                
    tcpSelectorTimeout="100"                
    tcpThreadCount="6"/>
        
    Tomcat 2  (IP: 192.168.19.81)
    A、修改Engine节点信息: <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat2">
    B、去掉<Cluster>  <Cluster> 的注释符
    C、修改Cluster 节点信息
    <Membership       
    className="org.apache.catalina.cluster.mcast.McastService"
    mcastBindAddress="192.168.19.199"
    mcastAddr="224.0.0.1"
    mcastPort="45564"
    mcastFrequency="500"
    mcastDropTime="3000"/>
    <Receiver          
    className="org.apache.catalina.cluster.tcp.ReplicationListener"          
    tcpListenAddress="192.168.19.199"
    tcpListenPort="4002" 一定要改
    tcpSelectorTimeout="100"
    tcpThreadCount="6"/>
    D、将8080 8009 8082三个节点的端口改为
       9080 9009 9082 避免 与tomcat1端口冲突
    注:这里的IP也可以不改 


    2、tomca1 tomcat 2 在不同机器上
    Tomcat 1  (IP: 192.168.19.199)    
    A、修改Engine节点信息: <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">
    B、去掉<Cluster>  <Cluster> 的注释符
    C、修改Cluster 节点信息
     <Membership            
    className="org.apache.catalina.cluster.mcast.McastService"
    mcastBindAddress="192.168.19.199"                
    mcastAddr="224.0.0.1"                
    mcastPort="45564"                
    mcastFrequency="500"
    mcastDropTime="3000"/>
    <Receiver           
    className="org.apache.catalina.cluster.tcp.ReplicationListener"
    tcpListenAddress="192.168.19.199"                
    tcpListenPort="4001"                
    tcpSelectorTimeout="100"                
    tcpThreadCount="6"/>    

    Tomcat 2  (IP: 192.168.19.81)
    A、修改Engine节点信息: <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">
    B、去掉<Cluster>  <Cluster> 的注释符
    C、修改Cluster 节点信息
    <Membership
    className="org.apache.catalina.cluster.mcast.McastService"                
    mcastBindAddress="192.168.19.81"                
    mcastAddr="224.0.0.1"                
    mcastPort="45564"     mcastFrequency="500"                
    mcastDropTime="3000"/>
    <Receiver           
    className="org.apache.catalina.cluster.tcp.ReplicationListener"            

    tcpListenAddress="192.168.19.81"                
    tcpListenPort="4001"                
    tcpSelectorTimeout="100"                
    tcpThreadCount="6"/>

    修改web应用里面WEB-INF目录下的web.xml文件,加入标签
    <distributable/>
    直接加在</web-app>之前就可以了
    做tomcat集群必须需要这一步,否则用户的session就无法正常使用。
     
    注意事项:1、mcastAddr="224.0.0.1"  这主广播地址因此需要开启网卡组播功能
    route add -net 224.0.0.0 netmask 240.0.0.0 dev eth0
    分别在各机器上运行
    2、查看端口情况:
    Netstat –antl |grep 4001 同步监听的端口
    tomcat1

    tomcat2

    3、测试广播:
    java -cp tomcat-replication.jar MCaster 224.0.0.1 45564 Terminal1
    java -cp tomcat-replication.jar MCaster 224.0.0.1 45564 Terminal2
    如果不报错则能正常广播
    tomcat-replication.jar 下载:[url]http://cvs.apache.org/~fhanik/tomcat-replication.jar[/url]
    如果是二台机器,可以用tcpdump 抓取包
     
     
    五、测试 集群及session同步
    在webapps 下新建test 目录
    目录下建WEB-INF目录下的web.xml文件
    <web-app xmlns="http://java.sun.com/xml/ns/j2ee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee [url]http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd[/url]"
        version="2.4">
           <display-name>TomcatDemo</display-name>
           <distributable/>
    </web-app>
    再在webapps 下 建立print.jsp   test.jsp
    Print.jsp :
     <%
       System.out.println("www.linuxtone.org   liuyu.blog.51cto.com");
    %>
     
    test.jsp
    <%@ page contentType="text/html; charset=GBK" %>
    <%@ page import="java.util.*" %>
    <html><head><title>Cluster App Test</title></head>
    <body>
    Server Info:
    <%
    out.println(request.getLocalAddr() + " : " + request.getLocalPort()+"<br>");%>
    <%
      out.println("<br> ID " + session.getId()+"<br>");
      String dataName = request.getParameter("dataName");
      session.setAttribute("myname","session?");
      if (dataName != null && dataName.length() > 0) {
         String dataValue = request.getParameter("dataValue");
         session.setAttribute(dataName, dataValue);
      }
      out.print("<b>Session P±?b>");
      Enumeration e = session.getAttributeNames();
      while (e.hasMoreElements()) {
         String name = (String)e.nextElement();
         String value = session.getAttribute(name).toString();
         out.println( name + " = " + value+"<br>");
             System.out.println( name + " = " + value);
       }
    %>
      <form action="index.jsp" method="POST">
        û³?<input type=text size=20 name="dataName">
         <br>
        ?:<input type=text size=20 name="dataValue">
         <br>
        <input type=submit>
       </form>
    </body>
    </html>
     
    重启所有的服务。
     
    如图可以看出tomcat 集群配置完成
     
    Session 复制的查看
    在同一窗口,输入名称和值,
    在日志可以看到如下结果. 这种结果表明成功了
    tomcat1


    tomcat 2



     
     错误总汇:
    skipping state transfer. No members active in cluster group."
    mcastBindAddress 没有添加或添加得不对
     
    ?Unknown default host: ajp13 
    JK 配置不当
     
    其它的不记得了。。。

    本文出自 “seven” 博客,请务必保留此出处http://liuyu.blog.51cto.com/183345/113544

  • 相关阅读:
    linux上安装vsftpd
    springboot集成mybatisplus
    springboot集成swagger2
    ssm+maven多模块项目整合
    追梦强人工智能(一)
    Linux环境kafka安装
    Linux环境安装jdk10
    东芝笔记本Satellite M40-A
    Maven简介
    postgresql PL/pgSQL—存储过程结构和变量声明
  • 原文地址:https://www.cnblogs.com/daichangya/p/12958570.html
Copyright © 2011-2022 走看看