apache2+tomcat5.5集群+session同步

来源:本站原创 Linux 超过1,382 views围观 0条评论

作者:刘宇 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.

3. JkWorkersFile /usr/local/tomcat/conf/jk/workers.properties   JK配置文件 负载的配置

4. JkShmFile logs/mod_jk.shm

5. JkLogFile /usr/local/tomcat/logs/mod_jk.log  相关日志的设置

6. JkLogLevel info

7. 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.

6. #========tomcat1======== 第一台tomcat的配置

7. worker.tomcat1.port=8009

8. worker.tomcat1.host=localhost   #这里也可以写IP

9. worker.tomcat1.type=ajp13     

10. worker.tomcat1.lbfactor=1       #权量 数值越大,分配的机率就最小

11.

12. #========tomcat2===========

13. worker.tomcat2.port=8009

14. worker.tomcat2.host=192.168.19.81 (tomcat2的IP)

15. worker.tomcat2.type=ajp13

16. worker.tomcat2.lbfactor=1

17.

18. #========controller,负载均衡器=======

19. worker.controller.type=lb

20. worker.controller.balance_workers=tomcat1,tomcat2  # server.xml配置文件里的jvmRoute="tomcat1"指定的名字

21. 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.

7. mcastBindAddress="192.168.19.199"              

8. mcastAddr="224.0.0.1"              

9. mcastPort="45564"  

10. mcastFrequency="500"              

11. mcastDropTime="3000"/>

12.       <Receiver         

13. className="org.apache.catalina.cluster.tcp.ReplicationListener"              

14.

15. tcpListenAddress="192.168.19.199"              

16. tcpListenPort="4001"              

17. tcpSelectorTimeout="100"              

18. 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.

2. A、修改Engine节点信息: <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">

3. B、去掉<Cluster>  <\Cluster> 的注释符

4. C、修改Cluster 节点信息

5. <Membership          

6. className="org.apache.catalina.cluster.mcast.McastService"

7. mcastBindAddress="192.168.19.199"              

8. mcastAddr="224.0.0.1"              

9. mcastPort="45564"              

10. mcastFrequency="500"

11. mcastDropTime="3000"/>

12. <Receiver         

13. className="org.apache.catalina.cluster.tcp.ReplicationListener"

14. tcpListenAddress="192.168.19.199"              

15. tcpListenPort="4001"              

16. tcpSelectorTimeout="100"              

17. 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.

13. tcpListenAddress="192.168.19.81"              

14. tcpListenPort="4001"              

15. tcpSelectorTimeout="100"              

16. 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 配置不当

文章出自:CCIE那点事 http://www.jdccie.com/ 版权所有。本站文章除注明出处外,皆为作者原创文章,可自由引用,但请注明来源。 禁止全文转载。
本文链接:http://www.jdccie.com/?p=1512转载请注明转自CCIE那点事
如果喜欢:点此订阅本站
  • 相关文章
  • 为您推荐
  • 各种观点

暂时还木有人评论,坐等沙发!
发表评论

您必须 [ 登录 ] 才能发表留言!