tomcat采用msm往memcached保存sessoin

本文详细介绍了如何在Windows环境下使用Memcached与自定义插件 msm 实现 Tomcat 集群下的 Session 和缓存共享,通过配置 Memcached 作为分布式缓存,结合 msm 插件改变 session 存储机制,同时利用 nginx 实现负载均衡,最终解决 Tomcat 集群环境下的 session 共享、缓存共享与负载均衡问题。
说明
所有的配置以及软件都是在windows环境下进行的,都是用自己的电脑做服务器。
要解决的问题
在tomcat集群环境下的session共享 、缓存共享、 负载均衡。
解决方案的选择
多个tomcat要一起协同工作有几种办法,可以考虑的方案有以下几个:
1. 使用tomcat自带的cluster方式,多个tomcat间自动实时复制session信息,配置起来很简单。但这个方案的效率比较低,在大并发下表现并不好。
2. 利用nginx的基于访问ip的hash路由策略,保证访问的ip始终被路由到同一个tomcat上,这个配置更简单。但是我们的应用很可能是某一个局域网大量用户同时登录,这样负载均衡就没什么作用了。
3. 利用memcached把多个tomcat的session集中管理,这是最直接的解决方案,但是操作起来也最为复杂。
我们的系统既要求性能,又要比较好的利用上负载均衡,所以第3个方案是首选(我采取的第三种方案)。接下来就是安装搭建之路了。

参考资料:http://hi.baidu.com/dqgdeng/blog/item/32e3d53af100eae9b311c745.html
采取的方案

解决缓存共享:
Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。可以使用Memcached。
解决Session共享:
主要是利用memcached-session-manager(http://code.google.com/p/memcached-session-manager/ 下面简称msm)开源tomcat插件改变tomcat原始的session存储机制,将session的存储放到分布式缓存memcache中,从而实现对session的共享。

解决负载均衡:
利用nginx+tomcat+memcached组建web服务器负载均衡。

实现的整体步骤
一:安装memcached,测试其是否好用。
二:安装两个tomcat
三:配置msm。
四:安装nginx,实现负载均衡。


一下是我走的弯路:希望大家不要和我走一样的路
我开始弄这个的时候,思路是下面这样的:
一:安装memcached,测试其是否好用。
二:两个tomcat集群。(配置tomcat集群,找了一些资料)
三:配置msm。
四:安装nginx,实现负载均衡。

按照这个思路配置完成后,发现session、缓存都共享了,也实现了负载均衡,以为问题解决了。我写了配置过程的一个文档。
之后一位架构师看了我写的文档,发现有问题,这我才知道我之前的思路有点问题。因为我既使用了tomcat集群实时的复制session,又使用了msm来存储session。我之前之所以能session共享,是因为我配置的tomcat集群起得作用,而我配置的msm有问题,但我没发现。

弄清楚这点就可以:使用tomcat集群实现session共享和使用msm将session存储放到分布式缓存memcache中实现session 是两种不同的解决方案。后者更有优势。

第一步:安装memcached
1. 下载memcached服务端memcached-1.2.6-win32-bin.zip,地址:http://code.jellycan.com/memcached/
2. 下载java版客户端 java_memcached-release_2.6.1.zip
3. 解压缩memcached-1.2.6-win32-bin.zip到指定目录,例如:D:\memcached-1.2.6-win32 ,
在终端(即cmd命令行界面),执行'D:\memcached-1.2.6-win32\memcached.exe -d install'
安装,再执行:'D:\memcached\memcached.exe -d start'启劢,这样memcache就会作为windows系统服务在每 次开机时启劢memcache服务。
4. 将客户端jar包放到web的lib下面,测试其是否好用。
5. 测试类如下:
public class TestMemCached {

protected static MemCachedClient mcc = new MemCachedClient();

static {
String[] servers = { "localhost:11211" };

Integer[] weights = { 3 };

// 创建一个实例对象SockIOPool
SockIOPool pool = SockIOPool.getInstance();

// set the servers and the weights
// 设置Memcached Server
pool.setServers(servers);
pool.setWeights(weights);

// set some basic pool settings
// 5 initial, 5 min, and 250 max conns
// and set the max idle time for a conn
// to 6 hours
pool.setInitConn(5);
pool.setMinConn(5);
pool.setMaxConn(250);
pool.setMaxIdle(1000 * 60 * 60 * 6);

// set the sleep for the maint thread
// it will wake up every x seconds and
// maintain the pool size
pool.setMaintSleep(30);

// Tcp的规则就是在发送一个包之前,本地机器会等待远程主机
// 对上一次发送的包的确认信息到来;这个方法就可以关闭套接字的缓存,
// 以至这个包准备好了就发;
pool.setNagle(false);
// 连接建立后对超时的控制
pool.setSocketTO(3000);
// 连接建立时对超时的控制
pool.setSocketConnectTO(0);

// initialize the connection pool
// 初始化一些值并与MemcachedServer段建立连接
pool.initialize();

// lets set some compression on for the client
// compress anything larger than 64k
// mcc.setCompressEnable(true);
// mcc.setCompressThreshold(64 * 1024);
}

public static void bulidCache() {
// set(key,value,Date) ,Date是一个过期时间,如果想让这个过期时间生效的话,这里传递的new Date(long
// date) 中参数date,需要是个大于或等于1000的值。
// 因为java client的实现源码里是这样实现的 expiry.getTime() / 1000 ,也就是说,如果
// 小于1000的值,除以1000以后都是0,即永不过期
TMember t = new TMember();
t.setId("123456789");
t.setName("yangliang");
mcc.set("test", t, new Date(100000)); // 十秒后过期

}

public static void output() {
// 从cache里取值
TMember value = (TMember) mcc.get("test");
System.out.println(value.getId());
System.out.println(value.getName());
// String value = (String) mcc.get("test");
// System.out.println(value);
}

public static void main(String[] args) {
bulidCache();
output();
}

}

输出结果为:123456789
yangliang

第二步:安装tomcat
1. 安装两个tomcat6,如果不在myEclipse等集成环境下,需要先安装JDK.注意修改两个tomcat的端口号(server.xml中要修改三个端口:8005,8080,8009,把这三个改成没有在用的端口就可以了)。
2. 启动两个tomcat看是否能成功启动。如果不能同时启动,很可能就是端口冲突。

第三步:配置msm
1. 准备jar包
msm要用的包有:
javolution-5.4.3.1.jar
memcached-2.5.jar
memcached-session-manager-1.3.0.jar
msm-javolution-serializer-1.3.0.jar
msm-javolution-serializer-cglib-1.3.0.jar
msm-javolution-serializer-jodatime-1.3.0.jar
将这些包考到tomcat的lib下即可
• javolution-5.4.3.1.jar (442.1 KB)
• memcached-2.5.jar (260.9 KB)
• memcached-session-manager-1.3.0.jar (79.1 KB)
• msm-javolution-serializer-1.3.0.jar (61 KB)
• msm-javolution-serializer-cglib-1.3.0.jar (3.7 KB)
• msm-javolution-serializer-jodatime-1.3.0.jar (5 KB)
参考资料:http://cprime.iteye.com/blog/729544
官方下载:http://code.google.com/p/memcached-session-manager/downloads/list

2. 修改配置文件context.xml

Xml代码
加入
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:localhost:11211"
requestUriIgnorePattern=".*/.(png|gif|jpg|css|js)$"
sessionBackupAsync="false"
sessionBackupTimeout="100"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory"
copyCollectionsForSerialization="false"
/>

这里的memcachedNodes是填写memcached节点,多个节点时可以以空隔分开,如:
n1:localhost:11211 n2:localhost:11212

sessionBackupTimeout的单位为分钟

参考资料:http://blog.csdn.net/small_love/article/details/6662686


Ok! 修改后重启两个TOMCAT即可,这个时候已经解决SESSION的共享问题.
3. 可以测试一下session是否共享了,测试缓存是否可以共享了。
我的思路是这样的:登录后将sessionId作为key,value就是要保存的值,存放到session中,做一个过滤器,只要登录了就可以通过当前session的id获得到保存的值。

关于缓存的测试可以这样:修改部署在两个tomcat的web工程中缓存相关的信息,在一个工程中往memcached服务器中保存信息,在另外一个工程中看能否取到。


第四步:安装nginx,实现负载均衡

1 下载nginx的jar包。地址:http://nginx.org/en/download.html
2 解压 nginx-1.0.6.zip 包到你喜欢的根目录,并将目录名改为nginx。
然后,执行下列操作:
cd nginx

start nginx
这样,nginx 服务就启动了(也可以直接双击打开)。打开任务管理器,查看 nginx.exe 进程,有二个进程会显示,占用系统资源,那是相当的少。然后再打开浏览器,输入 http://127.0.0.1/ 就可以看到nginx的欢迎页面了,非常友好
nginx -s stop // 停止nginx
nginx -s reload // 重新加载配置文件
nginx -s quit // 退出nginx
3 修改配置文件nginx\conf\nginx.conf
1)、找到内容server {
在它的上面加入如下内容:
upstream 192.168.2.182 {
ip_hash; ----#ip_hash策略将同一IP的所有请求都转发到同一应用服务器
server 192.168.2.182:8087;---------我的tomcat端口号
server 192.168.2.182:8012;
}
(这是负载切换使用的服务器网站IP)
2)、找到location / {
root html;
index index.html index.htm;
}
把内容更改如下:
location / {
proxy_pass http://192.168.2.182;
proxy_redirect default;
proxy_connect_timeout 10; added by me(跟代理服务器连接的超时时间,必须留意这个time out时间不能超过75秒.当一台服务器当掉时,过10秒转发到另外一台服务器)
}
3)、找到server {
listen 80;
server_name localhost;
把内容改成如下:
server {
listen 80;
server_name 192.168.2.182;
(这是监听访问域名绑定那台服务器80端口的请求)
好,在这里就这么简单配置好了,下面看下以上3步配置的图:


4 参考资料:http://wenku.baidu.com/view/53b4640003d8ce2f0066233a.html
关于nginx的配置说明参考资料:http://wiki.nginx.org/NginxChs
5 测试负载均衡是否好用。启动两个tomcat,之后断掉一个tomcat,看能否成功访问。

参考资料:http://www.iteye.com/topic/676347 访问量很高

------------------------以上是我的配置过程,希望大家多提提宝贵意见,一起进步,谢谢。
1,在tomcat中找到文件apache-tomcat-6.0.37\conf\context.xml 加入内部 <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager" memcachedNodes="n1:192.168.1.65:11211" requestUriIgnorePattern=".*\.(png|gif|jpg|css|js)$" sessionBackupAsync="false" sessionBackupTimeout="100" transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory" copyCollectionsForSerialization="false" /> 加入之后的content.xml的内容为 <?xml version='1.0' encoding='utf-8'?> <!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. --> <!-- The contents of this file will be loaded for each web application --> <Context> <!-- Default set of monitored resources --> <WatchedResource>WEB-INF/web.xml</WatchedResource> <!-- Uncomment this to disable session persistence across Tomcat restarts --> <!-- <Manager pathname="" /> --> <!-- Uncomment this to enable Comet connection tacking (provides events on session expiration as well as webapp lifecycle) --> <!-- <Valve className="org.apache.catalina.valves.CometConnectionManagerValve" /> <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager" memcachedNodes="n1:192.16
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值