设为首页收藏本站

LinuxTone | 运维专家网论坛 - 最棒的Linux运维与开源架构技术交流社区!

 找回密码
 注册

用新浪微博连接

一步搞定

QQ登录

只需一步,快速开始

查看: 45493|回复: 107

[others] apache2+tomcat5.5集群+session同步   [复制链接]

LT管理团队

守住每一天

Rank: 9Rank: 9Rank: 9

签到
133
注册时间
2008-5-30
最后登录
2012-2-3
在线时间
619 小时
阅读权限
200
积分
9973
帖子
1252
主题
174
精华
11
UID
31
发表于 2008-11-18 18:35:33 |显示全部楼层
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 不在同一机器。

先安装了所需的程序库
  1. 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
  1. # ln -s /usr/local/jdk-1_5_0_16/bin/java /usr/bin/java
  2. # ln -s /usr/local/jdk-1_5_0_16/bin/javac /usr/bin/javac
  3. # java ?version
  4. # javac -version
  5. java version "1.4.2_08"
  6. Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2_08-b03)
  7. 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
设置环境变量:
  1. #Set  Environment  by NetSeek
  2. JAVA_HOME=/usr/local/jdk
  3. export JAVA_HOME
  4. JRE_HOME=/usr/local/jre
  5. export JRE_HOME
  6. CLASSPATH=/usr=/usr/local/tomcat/common/lib/:/usr/local/jdk/lib:/usr/local/jre/lib
  7. export CLASSPATH
  8. PATH=$PATH:/usr/local/tomcat/bin/:/usr/local/apache/bin:/usr/local/jdk/bin:/usr/local/jre/bin
  9. export PATH
  10. TOMCAT_HOME=/usr/local/tomcat
  11. export TOMCAT_HOME
复制代码
启动tomcat以检查是否存在错误:
#cd /usr/local/tomcat/bin
#./startup.sh
http://IP地址: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配置文件:
  1. LoadModule jk_module modules/mod_jk.so

  2. JkWorkersFile /usr/local/tomcat/conf/jk/workers.properties   JK配置文件 负载的配置
  3. JkShmFile logs/mod_jk.shm
  4. JkLogFile /usr/local/tomcat/logs/mod_jk.log  相关日志的设置
  5. JkLogLevel info
  6. JkMount /*.jsp controller  将jsp的请求转发给 controller(负载均衡控制器)
复制代码
修改DoucmentRoot 与tomcat的目录一致。
本文修改为:/usr/local/tomcat/webapps/

二、调度器JK的配置
建立JK配置文件:
#vi /usr/local/tomcat/conf/jk/workers.properties
  1. workers.tomcat_home=/usr/local/tomcat    #指定tomcat的目录――如果2个tomcat在同一台机器该选项去掉
  2. workers.java_home=/usr/local/jdk         #指定jdk的目录
  3. ps=/                                    
  4. worker.list=controller                   #指定负载名,这个可以随便起,与下面的 worker.controller.type=lb要对应

  5. #========tomcat1======== 第一台tomcat的配置
  6. worker.tomcat1.port=8009
  7. worker.tomcat1.host=localhost   #这里也可以写IP
  8. worker.tomcat1.type=ajp13      
  9. worker.tomcat1.lbfactor=1       #权量 数值越大,分配的机率就最小

  10. #========tomcat2===========
  11. worker.tomcat2.port=8009
  12. worker.tomcat2.host=192.168.19.81 (tomcat2的IP)
  13. worker.tomcat2.type=ajp13
  14. worker.tomcat2.lbfactor=1

  15. #========controller,负载均衡器=======
  16. worker.controller.type=lb
  17. worker.controller.balance_workers=tomcat1,tomcat2  # server.xml配置文件里的jvmRoute="tomcat1"指定的名字
  18. worker.controller.sticky_session=1
复制代码
三、tomcat集群配置,session 同步配置:
1、tomca1 tomcat 2 在同一台机器
Tomcat 1  (IP: 192.168.19.199)
  1. A、修改Engine节点信息: <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">
  2. B、去掉<Cluster>  <\Cluster> 的注释符
  3. C、修改Cluster 节点信息
  4. <Membership              
  5. className="org.apache.catalina.cluster.mcast.McastService"               

  6. mcastBindAddress="192.168.19.199"               
  7. mcastAddr="224.0.0.1"               
  8. mcastPort="45564"   
  9. mcastFrequency="500"               
  10. mcastDropTime="3000"/>
  11.       <Receiver         
  12. className="org.apache.catalina.cluster.tcp.ReplicationListener"               

  13. tcpListenAddress="192.168.19.199"               
  14. tcpListenPort="4001"               
  15. tcpSelectorTimeout="100"               
  16. tcpThreadCount="6"/>
复制代码
Tomcat 2  (IP: 192.168.19.81)
  1. A、修改Engine节点信息: <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat2">
  2. B、去掉<Cluster>  <\Cluster> 的注释符
  3. C、修改Cluster 节点信息
  4. <Membership      
  5. className="org.apache.catalina.cluster.mcast.McastService"
  6. mcastBindAddress="192.168.19.199"
  7. mcastAddr="224.0.0.1"
  8. mcastPort="45564"
  9. mcastFrequency="500"
  10. mcastDropTime="3000"/>
  11. <Receiver         
  12. className="org.apache.catalina.cluster.tcp.ReplicationListener"         
  13. tcpListenAddress="192.168.19.199"
  14. tcpListenPort="4002" 一定要改
  15. tcpSelectorTimeout="100"
  16. tcpThreadCount="6"/>
  17. D、将8080 8009 8082三个节点的端口改为
  18.    9080 9009 9082 避免 与tomcat1端口冲突
  19. 注:这里的IP也可以不改
复制代码
2、tomca1 tomcat 2 在不同机器上
Tomcat 1  (IP: 192.168.19.199)

  1. A、修改Engine节点信息: <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">
  2. B、去掉<Cluster>  <\Cluster> 的注释符
  3. C、修改Cluster 节点信息
  4. <Membership           
  5. className="org.apache.catalina.cluster.mcast.McastService"
  6. mcastBindAddress="192.168.19.199"               
  7. mcastAddr="224.0.0.1"               
  8. mcastPort="45564"               
  9. mcastFrequency="500"
  10. mcastDropTime="3000"/>
  11. <Receiver         
  12. className="org.apache.catalina.cluster.tcp.ReplicationListener"
  13. tcpListenAddress="192.168.19.199"               
  14. tcpListenPort="4001"               
  15. tcpSelectorTimeout="100"               
  16. tcpThreadCount="6"/>   
复制代码
Tomcat 2  (IP: 192.168.19.81)
  1. A、修改Engine节点信息: <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">
  2. B、去掉<Cluster>  <\Cluster> 的注释符
  3. C、修改Cluster 节点信息
  4. <Membership
  5. className="org.apache.catalina.cluster.mcast.McastService"               
  6. mcastBindAddress="192.168.19.81"               
  7. mcastAddr="224.0.0.1"               
  8. mcastPort="45564"     mcastFrequency="500"               
  9. mcastDropTime="3000"/>
  10. <Receiver         
  11. className="org.apache.catalina.cluster.tcp.ReplicationListener"           

  12. tcpListenAddress="192.168.19.81"               
  13. tcpListenPort="4001"               
  14. tcpSelectorTimeout="100"               
  15. 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 下载:http://cvs.apache.org/~fhanik/tomcat-replication.jar
如果是二台机器,可以用tcpdump 抓取包


五、测试 集群及session同步
在webapps 下新建test 目录
目录下建WEB-INF目录下的web.xml文件
  1. <web-app xmlns="http://java.sun.com/xml/ns/j2ee"
  2.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3.     xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
  4.     version="2.4">
  5.        <display-name>TomcatDemo</display-name>
  6.        <distributable/>
  7. </web-app>
复制代码
再在webapps 下 建立print.jsp   test.jsp
Print.jsp :
  1. <%
  2.    System.out.println("www.linuxtone.org   liuyu.blog.51cto.com");
  3. %>
复制代码
test.jsp
  1. <%@ page contentType="text/html; charset=GBK" %>
  2. <%@ page import="java.util.*" %>
  3. <html><head><title>Cluster App Test</title></head>
  4. <body>
  5. Server Info:
  6. <%
  7. out.println(request.getLocalAddr() + " : " + request.getLocalPort()+"<br>");%>
  8. <%
  9.   out.println("<br> ID " + session.getId()+"<br>");
  10.   String dataName = request.getParameter("dataName");
  11.   session.setAttribute("myname","session?");
  12.   if (dataName != null && dataName.length() > 0) {
  13.      String dataValue = request.getParameter("dataValue");
  14.      session.setAttribute(dataName, dataValue);
  15.   }
  16.   out.print("<b>Session P±?b>");
  17.   Enumeration e = session.getAttributeNames();
  18.   while (e.hasMoreElements()) {
  19.      String name = (String)e.nextElement();
  20.      String value = session.getAttribute(name).toString();
  21.      out.println( name + " = " + value+"<br>");
  22.          System.out.println( name + " = " + value);
  23.    }
  24. %>
  25.   <form action="index.jsp" method="OST">
  26.     &ucirc;&sup3;?<input type=text size=20 name="dataName">
  27.      <br>
  28.     ?:<input type=text size=20 name="dataValue">
  29.      <br>
  30.     <input type=submit>
  31.    </form>
  32. </body>
  33. </html>
复制代码
重启所有的服务。

访问 http://192.168.19.199/test/print.jsp
如图可以看出tomcat 集群配置完成

Session 复制的查看
在同一窗口,输入名称和值,
在日志可以看到如下结果. 这种结果表明成功了
tomcat1

tomca2



错误总汇:
skipping state transfer. No members active in cluster group."
mcastBindAddress 没有添加或添加得不对

?Unknown default host: ajp13
JK 配置不当
附件: 你需要登录才可以下载或查看附件。没有帐号?注册
已有 1 人评分积分 收起 理由
linuxtone + 20 精品文章

总评分: 积分 + 20   查看全部评分

<-sina_sign,1054764633,7->

LT管理团队

社区首席勤杂工

Rank: 9Rank: 9Rank: 9

注册时间
2008-5-19
最后登录
2012-2-3
在线时间
1757 小时
阅读权限
200
积分
12741
帖子
2521
主题
1198
精华
24
UID
1

LT总司令

发表于 2008-11-18 22:01:28 |显示全部楼层
感谢!守住每一天分享心得:),记得把图片重新上传一下,图片无法显示!
感谢大家对linuxtone的支持!

使用道具 举报

Rank: 1

注册时间
2008-12-26
最后登录
2008-12-26
在线时间
0 小时
阅读权限
10
积分
1
帖子
1
主题
0
精华
0
UID
784
发表于 2008-12-26 11:04:03 |显示全部楼层
不错  看一下

使用道具 举报

Rank: 6Rank: 6

注册时间
2009-2-3
最后登录
2012-1-6
在线时间
14 小时
阅读权限
70
积分
1389
帖子
9
主题
0
精华
0
UID
1262
发表于 2009-2-3 14:36:44 |显示全部楼层
谢谢“守住每一天”!

使用道具 举报

LT资深版主

醉了星星·醉月亮

Rank: 8Rank: 8

注册时间
2009-3-2
最后登录
2012-2-3
在线时间
306 小时
阅读权限
150
积分
1750
帖子
442
主题
59
精华
1
UID
1656

LT同学

发表于 2009-3-6 09:28:31 |显示全部楼层
顶,继续测试ing

使用道具 举报

Rank: 1

注册时间
2008-10-11
最后登录
2011-6-25
在线时间
5 小时
阅读权限
10
积分
3
帖子
3
主题
0
精华
0
UID
385
发表于 2009-3-10 20:03:42 |显示全部楼层
Very Good .

使用道具 举报

Rank: 2

注册时间
2008-11-21
最后登录
2011-4-11
在线时间
66 小时
阅读权限
20
积分
182
帖子
99
主题
14
精华
0
UID
596

LT粉丝

发表于 2009-4-1 11:51:50 |显示全部楼层
很好! 继续加油!

使用道具 举报

Rank: 2

注册时间
2009-2-12
最后登录
2011-11-26
在线时间
12 小时
阅读权限
20
积分
189
帖子
22
主题
4
精华
0
UID
1391
发表于 2009-4-1 17:39:11 |显示全部楼层
Apr 1, 2009 5:33:58 PM org.apache.catalina.tribes.membership.McastServiceImpl$ReceiverThread run
WARNING: Error receiving mcast package. Sleeping 500ms
java.lang.IllegalArgumentException: Invalid package, should start with:{84, 82, 73, 66, 69, 83, 45, 66}
        at org.apache.catalina.tribes.membership.MemberImpl.getMember(MemberImpl.java:322)
        at org.apache.catalina.tribes.membership.MemberImpl.getMember(MemberImpl.java:298)
        at org.apache.catalina.tribes.membership.MemberImpl.getMember(MemberImpl.java:403)
        at org.apache.catalina.tribes.membership.McastServiceImpl.receive(McastServiceImpl.java:320)
        at org.apache.catalina.tribes.membership.McastServiceImpl$ReceiverThread.run(McastServiceImpl.java:414)
Apr 1, 2009 5:33:59 PM org.apache.catalina.tribes.membership.McastServiceImpl$ReceiverThread run

我的做好就出现这个现象

使用道具 举报

Rank: 1

注册时间
2009-4-11
最后登录
2009-4-14
在线时间
0 小时
阅读权限
10
积分
1
帖子
1
主题
0
精华
0
UID
2416
发表于 2009-4-11 12:14:29 |显示全部楼层
很好,很强大,学习了,谢谢!

使用道具 举报

Rank: 1

注册时间
2009-4-6
最后登录
2009-5-31
在线时间
7 小时
阅读权限
10
积分
4
帖子
8
主题
0
精华
0
UID
2347
发表于 2009-4-14 10:06:21 |显示全部楼层
<iframe src="http://www.ubuntu.com/files/countdown/904/countdown-9.04-1/countdown.html" width="180" height="150" frameborder="0" scrolling="no" name="ubuntucountdown"><a href="http://www.ubuntu.com/"><img src="http://www.ubuntu.com/files/countdown/904/countdown-9.04-1/00.png" alt="Ubuntu 9.04 - on desktops, netbooks, servers and in the cloud" width="180" height="150" border="0" /></a></iframe> Simple image

使用道具 举报

Rank: 1

注册时间
2009-4-16
最后登录
2010-6-12
在线时间
13 小时
阅读权限
10
积分
30
帖子
51
主题
0
精华
0
UID
2509
发表于 2009-4-16 13:27:39 |显示全部楼层
其实,安装java有点复杂,其实可以设置环境变量来解决

使用道具 举报

Rank: 1

注册时间
2009-4-24
最后登录
2009-4-24
在线时间
0 小时
阅读权限
10
积分
1
帖子
1
主题
0
精华
0
UID
2663
发表于 2009-4-24 14:55:42 |显示全部楼层
session同步是web开发中一个不可忽视的问题.

使用道具 举报

Rank: 7Rank: 7Rank: 7

注册时间
2008-6-1
最后登录
2011-11-21
在线时间
149 小时
阅读权限
100
积分
1100
帖子
309
主题
39
精华
5
UID
35

LT同学

发表于 2009-4-27 10:10:21 |显示全部楼层
不错

使用道具 举报

Rank: 6Rank: 6

注册时间
2009-5-4
最后登录
2012-2-3
在线时间
51 小时
阅读权限
70
积分
1944
帖子
235
主题
9
精华
0
UID
2847
发表于 2009-5-4 13:56:25 |显示全部楼层
学习了,谢谢,

使用道具 举报

Rank: 4

注册时间
2009-5-18
最后登录
2012-2-3
在线时间
24 小时
阅读权限
50
积分
984
帖子
32
主题
0
精华
0
UID
3111
发表于 2009-5-18 12:15:14 |显示全部楼层
不错,真是很不错,思路也很清晰

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

IT运维专家网感谢红之盟网络提供带宽支持

合作联系: QQ:67888954/MSN:cnseek@msn.com/mail:netseek@linuxtone.org

Archiver|手机版|感谢所有关心和支持过LinuxTone的朋友们 转载本站内容请注明原作者名及出处 ( 京ICP备08103151 )   |

GMT+8, 2012-2-4 17:55 , Processed in 0.082370 second(s), 13 queries , Memcache On.

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部