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(负载均衡控制器)

 

修改DoucmentRoottomcat的目录一致。

本文修改为/usr/local/tomcat/webapps/

 

二、调度器JK的配置

建立JK配置文件

#vi /usr/local/tomcat/conf/jk/workers.properties

workers.tomcat_home=/usr/local/tomcat    #指定tomcat的目录――如果2tomcat在同一台机器该选项去掉

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 (tomcat2IP)

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就无法正常使用。

 

注意事项1mcastAddr="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">

   &#251;&#179;?<input type=text size=20 name="dataName">

    <br>

   ?:<input type=text size=20 name="dataValue">

    <br>

   <input type=submit>

  </form>

</body>

</html>

 

重启所有的服务。

 

访问 [url]http://192.168.19.199/test/print.jsp[/url]

如图可以看出tomcat 集群配置完成

 

Session 复制的查看

在同一窗口输入名称和值

在日志可以看到如下结果. 这种结果表明成功了
tomcat1


tomcat 2




 

 

错误总汇

skipping state transfer. No members active in cluster group."

mcastBindAddress 没有添加或添加得不对

 

?Unknown default host: ajp13 

JK 配置不当

 

其它的不记得了。。。

安庆英语培训机构 安顺英语培训机构 安阳英语培训机构 鞍山英语培训机构 阿拉善英语培训机构 安康英语培训机构 阿坝英语培训机构 阿里英语培训机构 阿克苏英语培训机构 阿勒泰英语培训机构 北京英语培训机构 蚌埠英语培训机构 亳州英语培训机构 白银英语培训机构 北海英语培训机构 百色英语培训机构 毕节英语培训机构 保定英语培训机构 白山英语培训机构 白城英语培训机构 本溪英语培训机构 包头英语培训机构 巴彦淖尔英语培训机构 滨州英语培训机构 宝鸡英语培训机构 巴中英语培训机构 巴音郭楞英语培训机构 博尔塔拉英语培训机构 保山英语培训机构 重庆英语培训机构 潮州英语培训机构 滁州英语培训机构 巢湖英语培训机构 池州英语培训机构 崇左英语培训机构 沧州英语培训机构 承德英语培训机构 长沙英语培训机构 常德英语培训机构 郴州英语培训机构 长春英语培训机构 常州英语培训机构 朝阳英语培训机构 赤峰英语培训机构 长治英语培训机构 成都英语培训机构 昌都英语培训机构 昌吉英语培训机构 楚雄英语培训机构 东莞英语培训机构 定西英语培训机构 大庆英语培训机构 大兴安岭英语培训机构 大连英语培训机构 丹东英语培训机构 东营英语培训机构 德州英语培训机构 大同英语培训机构 德阳英语培训机构 达州英语培训机构 大理英语培训机构 德宏英语培训机构 迪庆英语培训机构 鄂州英语培训机构 恩施英语培训机构 鄂尔多斯英语培训机构 佛山英语培训机构 阜阳英语培训机构 福州英语培训机构 防城港英语培训机构 抚州英语培训机构 抚顺英语培训机构 阜新英语培训机构 广州英语培训机构 甘南英语培训机构 桂林英语培训机构 贵港英语培训机构 贵阳英语培训机构 赣州英语培训机构 固原英语培训机构 果洛英语培训机构 广安英语培训机构 广元英语培训机构 甘孜英语培训机构 惠州英语培训机构 河源英语培训机构 杭州英语培训机构 湖州英语培训机构 合肥英语培训机构 淮南英语培训机构 鹤壁英语培训机构 黄山英语培训机构 河池英语培训机构 贺州英语培训机构 海口英语培训机构 邯郸英语培训机构 衡水英语培训机构 哈尔滨英语培训机构 鹤岗英语培训机构 黑河英语培训机构 黄石英语培训机构 黄冈英语培训机构 衡阳英语培训机构 怀化英语培训机构 淮安英语培训机构 葫芦岛英语培训机构 呼和浩特英语培训机构 呼伦贝尔英语培训机构 海东英语培训机构 海北英语培训机构 黄南英语培训机构 海西英语培训机构 菏泽英语培训机构 汉中英语培训机构 哈密英语培训机构 和田英语培训机构 红河英语培训机构 荆门英语培训机构 揭阳英语培训机构 嘉兴英语培训机构 金华英语培训机构 嘉峪关英语培训机构 金昌英语培训机构 酒泉英语培训机构 焦作英语培训机构 鸡西英语培训机构 佳木斯英语培训机构 荆州英语培训机构 吉林英语培训机构 景德镇英语培训机构 九江英语培训机构 吉安英语培训机构 锦州英语培训机构 济南英语培训机构 济宁英语培训机构 晋城英语培训机构 晋中英语培训机构 开封英语培训机构 克拉玛依英语培训机构 喀什英语培训机构 昆明英语培训机构 丽水英语培训机构 六安英语培训机构 洛阳英语培训机构 兰州英语培训机构 陇南英语培训机构 临夏英语培训机构 柳州英语培训机构 来宾英语培训机构 六盘水英语培训机构 廊坊英语培训机构 漯河英语培训机构 娄底英语培训机构 辽源英语培训机构 连云港英语培训机构 辽阳英语培训机构 莱芜英语培训机构 临沂英语培训机构 聊城英语培训机构 临汾英语培训机构 吕梁英语培训机构 泸州英语培训机构 乐山英语培训机构 凉山英语培训机构 拉萨英语培训机构 林芝英语培训机构 丽江英语培训机构 临沧英语培训机构 茂名英语培训机构 梅州英语培训机构 马鞍山英语培训机构 牡丹江英语培训机构 绵阳英语培训机构 眉山英语培训机构 宁波英语培训机构 南平英语培训机构 宁德英语培训机构 南宁英语培训机构 南阳英语培训机构 南京英语培训机构 南通英语培训机构 南昌英语培训机构 南充英语培训机构 内江英语培训机构 那曲英语培训机构 怒江英语培训机构 莆田英语培训机构 平凉英语培训机构 濮阳英语培训机构 平顶山英语培训机构 萍乡英语培训机构 盘锦英语培训机构 攀枝花英语培训机构 清远英语培训机构 钦州英语培训机构 庆阳英语培训机构 黔南英语培训机构 黔东南英语培训机构 黔西南英语培训机构 迁安英语培训机构 秦皇岛英语培训机构 齐齐哈尔英语培训机构 七台河英语培训机构 青岛英语培训机构 曲靖英语培训机构 日照英语培训机构 日喀则英语培训机构 上海英语培训机构 深圳英语培训机构 汕头英语培训机构 韶关英语培训机构 汕尾英语培训机构 绍兴英语培训机构 宿州英语培训机构 三明英语培训机构 三亚英语培训机构 石家庄英语培训机构 三门峡英语培训机构 商丘英语培训机构 双鸭山英语培训机构 绥化英语培训机构 十堰英语培训机构 随州英语培训机构 邵阳英语培训机构 四平英语培训机构 松原英语培训机构 苏州英语培训机构 宿迁英语培训机构 上饶英语培训机构 沈阳英语培训机构 石嘴山英语培训机构 朔州英语培训机构 商洛英语培训机构 遂宁英语培训机构 山南英语培训机构 石河子英语培训机构 天津英语培训机构 台州英语培训机构 铜陵英语培训机构 天水英语培训机构 铜仁英语培训机构 唐山英语培训机构 通化英语培训机构 泰州英语培训机构 铁岭英语培训机构 通辽英语培训机构 泰安英语培训机构 太原英语培训机构 铜川英语培训机构 吐鲁番英语培训机构 塔城英语培训机构 温州英语培训机构 芜湖英语培训机构 武威英语培训机构 梧州英语培训机构 武汉英语培训机构 无锡英语培训机构 乌海英语培训机构 乌兰察布英语培训机构 吴忠英语培训机构 潍坊英语培训机构 威海英语培训机构 渭南英语培训机构 乌鲁木齐英语培训机构 文山英语培训机构 宣城英语培训机构 厦门英语培训机构 邢台英语培训机构 信阳英语培训机构 新乡英语培训机构 许昌英语培训机构 襄樊英语培训机构 咸宁英语培训机构 孝感英语培训机构 湘潭英语培训机构 湘西英语培训机构 徐州英语培训机构 新余英语培训机构 兴安盟英语培训机构 锡林郭勒英语培训机构 西宁英语培训机构 忻州英语培训机构 西安英语培训机构 咸阳英语培训机构 西双版纳英语培训机构 阳江英语培训机构 云浮英语培训机构 义乌英语培训机构 玉林英语培训机构 伊春英语培训机构 宜昌英语培训机构 岳阳英语培训机构 益阳英语培训机构 永州英语培训机构 延边英语培训机构 扬州英语培训机构 盐城英语培训机构 鹰潭英语培训机构 宜春英语培训机构 营口英语培训机构 银川英语培训机构 玉树英语培训机构 烟台英语培训机构 阳泉英语培训机构 运城英语培训机构 延安英语培训机构 榆林英语培训机构 宜宾英语培训机构 雅安英语培训机构 伊犁英语培训机构 玉溪英语培训机构 珠海英语培训机构 湛江英语培训机构 肇庆英语培训机构 中山英语培训机构 舟山英语培训机构 漳州英语培训机构 张掖英语培训机构 资阳英语培训机构 张家口英语培训机构 郑州英语培训机构 驻马店英语培训机构 周口英语培训机构 株洲英语培训机构 张家界英语培训机构 镇江英语培训机构 中卫英语培训机构 淄博英语培训机构 枣庄英语培训机构 自贡英语培训机构 昭通英语培训机构 英语培训机构