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

apache+jk+tomcat集群+session同步的更多相关文章

  1. 在Nginx里指定ip_hash的方式解决Tomcat集群session的问题

    据称,Tomcat集群session同步方案有以下几种方式: 1)使用tomcat自带的cluster方式,多个tomcat间自动实时复制session信息,配置起来很简单.但这个方案的效率比较低,在 ...

  2. window xp Apache与Tomcat集群配置--转载

    转载地址:http://www.cnblogs.com/obullxl/archive/2011/06/09/apache-tomcat-cluster-config.html 一. 环境说明 Win ...

  3. Nginx+Tomcat集群+session共享

    Nginx+Tomcat集群+session共享 1)安装Nginx 2)配置多个Tomcat,在server.xml中修改端口(端口不出现冲突即可) 3)在nginx.conf文件中配置负载均衡池, ...

  4. Tomcat集群如何同步会话

    Tocmat集群中最重要的交换信息就是会话消息,对某个tomcat实例某会话做的更改要同步到集群其他tomcat实例的该会话对象,这样才能保证集群所有实例的会话数据一致.在tribes组件的基础上完成 ...

  5. apache搭建Tomcat集群(Cluster)

    搭建集群: apache:特点处理静态资源(html  图片  js等) apache的请求操作,Cluster工具 tomcat:特点处理动态资源 apache+tomcat(apache是web服 ...

  6. tomcat集群session共享

    Tomcat集群配置其实很简单,在Tomcat自带的文档中有详细的说明( /docs/cluster-howto.html ),只不过是英语的,对我这样的人来说很难懂   .   下面根据说下怎么配置 ...

  7. Shiro+Redis实现tomcat集群session共享

      一.背景 当我们使用了nginx做项目集群以后,就会出现一个很严重的问题亟待解决,那就是:tomcat集群之间如何实现session共享的问题,如果这个问题不解决,就会出现登陆过后再次请求资源依旧 ...

  8. Apache配置tomcat集群

     APACHE 2.2.9+TOMCAT6.0配置负载均衡 目标: 使用 apache 和 tomcat 配置一个可以应用的 web 网站,要达到以下要求: 1. Apache 做为 HttpSe ...

  9. 使用apache搭建tomcat集群

    1.安装apache 1.1 下载ApacheX64.rar,并解压 1.2 修改Apache24\conf\httpd.conf文件 配置根目录: 配置ip和端口 1.2 安装apache服务器 以 ...

  10. Tomcat集群session复制与Oracle的坑。。

    问题描述 公司某个系统使用了tomcat自带的集群session复制功能,然后后报了一个oracle驱动包里面的连接不能被序列化的异常. 01-Nov-2017 16:45:26.653 SEVERE ...

随机推荐

  1. 3d格式介绍之OBJ格式

    OBJ格式是一种用于3D模型的文件格式,全称为Wavefront OBJ.它由Wavefront Technologies公司开发,最初用于其高级视觉动画软件,但后来广泛应用于各种3D图形软件中. 本 ...

  2. JVM笔记九-GC收集器日志信息学习

    在上一篇文章中,我们通过代码运行结果,查看到JVM的堆内存逻辑上分区是三部分,物理上分区是2部分,以及是新生代分区三部分,占比分布是8/1/1.而且我们还通过代码和堆JVM参数配置,制造出了OOM异常 ...

  3. 原生JavaScript实现可旋转立方体效果基础示例

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. 【合合TextIn】深度解析智能文档处理技术与应用

    一.智能文档处理介绍 智能文档处理(Intelligent Document Processing, IDP)是利用人工智能(AI).机器学习(ML).计算机视觉(CV).自然语言处理(NLP)等技术 ...

  5. java_day1_认识计算机,java环境,Java关键字、标识符、注释

    一.认识计算机 1.组成: 硬件:cpu,内存,显卡,... 软件: 系统软件:WPS, wegame, steam, IDEA,..... 应用软件:WPS, wegame, steam, IDEA ...

  6. CSP2024-S 游记

    9-21 今天考完了初赛,明显感觉数学门槛变高了一些,有高中数学知识才能保证看得懂题意,只是苦了小学和初中同学,看数据参加人数还涨了50%,权当拉低分数线了吧.用小图灵估分70.应该是稳过.

  7. Nuxt.js 应用中的 app:redirected 钩子详解

    title: Nuxt.js 应用中的 app:redirected 钩子详解 date: 2024/10/3 updated: 2024/10/3 author: cmdragon excerpt: ...

  8. 完美转发(模板)--T&&

    在C++模板编程中,完美转发(Perfect Forwarding)是一种技术,旨在保留函数参数的值类别,即在将参数传递到另一个函数时,无论参数是左值还是右值,都能够保持它的原始性质,而不会因为转发丢 ...

  9. C#/.NET/.NET Core技术前沿周刊 | 第 8 期(2024年10.01-10.06)

    前言 C#/.NET/.NET Core技术前沿周刊,你的每周技术指南针!记录.追踪C#/.NET/.NET Core领域.生态的每周最新.最实用.最有价值的技术文章.社区动态.优质项目和学习资源等. ...

  10. 进程切换分析(2):TLB处理

    一.前言 进程切换是一个复杂的过程,本文不准备详细描述整个进程切换的方方面面,而是关注进程切换中一个小小的知识点:TLB的处理.为了能够讲清楚这个问题,我们在第二章描述在单CPU场景下一些和TLB相关 ...