apache2+tomcat5.5
集群+session
同步
作者:刘宇
liuyu.blog.51cto.com
说明:借前人之鉴,写一篇关于
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 �Crf 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 �Cversion
# 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
的目录�D�D如果
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 �Cantl |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>
重启所有的服务。
访问
[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
配置不当
其它的不记得了。。。