环境说明
操作系统:Windows7 64bit
web服务器:apache-tomcat-7.0.35两台,由于部署在同一台机器上,所以端口分别设置为8080,8081
反向代理服务器:nginx-1.3.14
缓存系统:memcached-1.4.4
安装
ngixn和memcached的安装我就不说了,网上的文章很多。
同一台电脑上安装两个tomcat也不说了,端口分别设置成8080,8081
配置
重点说一下集群配置
1.修改nginx.conf分发至已经搭建好的两台服务器
upstreamlocalhost {
#根据ip计算将请求分配各那个后端tomcat,许多人误认为可以解决session问题,其实并不能。
#同一机器在多网情况下,路由切换,ip可能不同
#ip_hash;
server localhost:8080;
server localhost:8081;
}
2.修改两个tomcat的 content.xml文件,新增以下内容。
<ManagerclassName="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:127.0.0.1:11211"
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
sticky="false"
lockingMode="uriPattern:/path1|/path2"
sessionBackupAsync="false"
sessionBackupTimeout="1000"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>
使用non-sticky session模式
3.拷贝jar包到两台tomcat服务器的lib目录中。
asm-3.2.jar
reflectasm-0.9.jar
kryo-1.03.jar
kryo-serializers-0.10.jar
msm-kryo-serializer-1.6.3.jar
memcached-session-manager-1.6.3.jar
memcached-session-manager-tc7-1.6.3.jar
minlog-1.2.jar
spymemcached-2.8.4.jar
注意msm-kryo-serializer版本要求与msm版本基本一致
4.编写一个测试页面session.jsp,将其放入两个tomcat的webapps中ROOT目录下,待会儿我们需要访问这个页面。
<%@page language="java" import="java.util.*"pageEncoding="UTF-8"%>
<%
Stringpath = request.getContextPath();
StringbasePath =request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPEHTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<basehref="<%=basePath%>">
<title>My JSP 'session.jsp' startingpage</title>
<metahttp-equiv="pragma" content="no-cache">
<metahttp-equiv="cache-control" content="no-cache">
<metahttp-equiv="expires" content="0">
<metahttp-equiv="keywords"content="keyword1,keyword2,keyword3">
<metahttp-equiv="description" content="This is my page">
<!--
<linkrel="stylesheet" type="text/css"href="styles.css">
-->
</head>
<body>
<%
System.out.println(session.getId());
out.println("<br> This is(TOMCAT1|TOMCAT2), SESSION ID:" + session.getId()+"<br>");
%>
</body>
</html>
ok,准备工作都完成了。
分别启动memcached,nginx,两台tomcat
在浏览器中分别输入http://localhost:8080/session.jsp,http://localhost:8081/session.jsp,http://localhost/session.jsp
页面显示的内容都是
Thisis (TOMCAT1|TOMCAT2), SESSION ID:6FBC43AD7EDC882751EE202945BE16EA-n1.tomcat1
由于我首先访问的是tomcat1,8080端口的那个,所以后面两个地址打印的内容与8080端口响应的内容一致
总结
其实配一个session集群环境还是挺麻烦的,中间也出了很多问题,都是在网上找帖子才慢慢解决的。
http://www.iteye.com/topic/1125301
http://passover.blog.51cto.com/2431658/648182
http://www.oschina.net/question/658145_68953
http://blog.csdn.net/love_ubuntu/article/details/8464983
http://blog.sina.com.cn/s/blog_414664cc01012hfh.html
这是我参考过的文章,非常感谢他们的文章。
第一个问题
kryo-serializers-0.10.jar
最初在网上下的jar报是0.8的版本,启动tomcat一直报错,分析日志发现缺少一个DateSerializer的类。于是在网上找到0.9的jar包,可还是不行。无赖之下找到0.10版本,这个问题终于算解决了,tomcat可以正常启动
第二个问题
spymemcached-2.8.4.jar
第一个问题解决后,我还以为这样就ok了,谁知道一访问session.jsp时又报了一个找不到对应方法的错
ava.lang.NoSuchMethodError:net.spy.memcached.MemcachedClient.set(Ljava/lang/String;ILjava/lang/Object;)Lnet/spy/memcached/internal/OperationFuture;
后来在oschina上看到一个帖子说是不能用memcached-2.5.jar,要用spymemcached-2.8.4.jar
替换之后果然好使
再贴一次所使用的jar包。我用的是kryo序列化,网上都说这种方式效率最高,我们有实际测试比较过。所以一共9个jar
asm-3.2.jar
reflectasm-0.9.jar
kryo-1.03.jar
kryo-serializers-0.10.jar
msm-kryo-serializer-1.6.3.jar
memcached-session-manager-1.6.3.jar
memcached-session-manager-tc7-1.6.3.jar
minlog-1.2.jar
spymemcached-2.8.4.jar
这是我在google code上找到的,序列化方式分为4中,每种都列出了相关的依赖包
For javolution the artifactId is msm-javolution-serializer, for xstream msm-xstream-serializer and for flexjson it's msm-flexjson-serializer.
If you're not using a dependency management based on mavenrepositories these are the jars you need for the different serializers:
- kryo-serializer: msm-kryo-serializer, kryo-serializers-0.10 (0.10 is needed, as 0.20+ is for kryo2), kryo, minlog, reflectasm, asm-3.2
- javolution-serializer: msm-javolution-serializer, javolution-5.4.3.1
- xstream-serializer: msm-xstream-serializer, xstream, xmlpull, xpp3_min
- flexjson-serializer: msm-flexjson-serializer, flexjson
链接 <https://code.google.com/p/memcached-session-manager/wiki/SetupAndConfiguration>
这是我整理的所有jar包,这是我放在百度网盘的地址,需要的朋友可以去下载http://pan.baidu.com/s/1DwIw0