memcached-session-manager 教程实现session共享

1简介

1.1决定用什么序列化策略。

1.2配置tomcat

1.2.1添加 memcached-session-manager jar 包到tomcat中。

1.2.2添加序列化相关的jar到你项目(可选的)。

1.2.3配置 memcached-session-manager 作为tomcat <Context>的管理。

1.2.4memcached-session-manager 配置选项参数介绍。

1.2.5系统参数配置(都是 可选的)

1.3配置日志

1简介

最简单的安装方式你需要一个tomcat(6,7,或者8) 和一个 memcached (或者其他支持memcached 协议的),在实际的产品环境中你可能在一些不同的PC上有多个tomcat 和多个memcached。memcached-session-manager(msm) 支持两种工作模式。sticky sessions(粘性session) 跟 no-sticky sessions(非粘性session);

下面给出一个 sticky sessions 的安装的例子。用到了两个tomcat,两个memcached;

Tomcat-1(t1) 把他的session主要存储在 memcached-2(m2),Tomcat-2则主要存储在 memcached-1(m1),   如果m2如果不能正常工作,t1 将session存储在 memcached-1 (m1 ,m1是t1的 failoverNod).在这个配置下,当两台服务器中的一台(machine1 上运行着 t1,m1)宕机的时候,session不会丢失, 下面的非常漂亮的ASCII展示了这个设置;

<t1>     <t2>

. \  / .

.  X  .

. /   \   .

<m1>  <m2>

所以 ,应该怎么做呢? ...

1.1决定用什么序列化策略.

在序列化策略章节,有几种序列化的策略可以选择.默认的方式是java serialization 这种方式已经在memcached-session-manager jar包中提供支持.其它的方式在不同的jar包中,在本节中你将看到不同的方式需要哪些jar包.

1.2配置tomcat

配置tomcat需要做两件事 1添加一些jar到你的 $CATALINA_HOME/lib/ 目录下,和WEB-/lib/ 目录下.2配置你的memcached-session-manager 在<Content> (一般在tomcat安装目录的 conf/context.xml)

添加jar包到tomcat

1.2.1根据你选择的序列化策略你需要添加 memcached-session-manager-${version}.jar  还有如果tomcat6 需要memcached-session-manager-tc6-${version}.jar ,tomcat7(tomcat 7 7.0.23+)需要memcached-session-manager-tc7-${version}.jar  ,tomcat8需要memcached-session-manager-tc8-${version}.jar

http://repo1.maven.org/maven2/de/javakaffee/msm/memcached-session-manager/

http://repo1.maven.org/maven2/de/javakaffee/msm/memcached-session-manager-tc6/

http://repo1.maven.org/maven2/de/javakaffee/msm/memcached-session-manager-tc7/

http://repo1.maven.org/maven2/de/javakaffee/msm/memcached-session-manager-tc8/

如果你用的是memcached 你还需要spymemcached-2.10.2.jar  http://repo1.maven.org/maven2/net/spy/spymemcached/2.10.2/spymemcached-2.10.2.jar

如果你使用 couchbase,你需要增加  couchbase-client-1.2.2.jar  jettison-1.1.jar, commons-codec-1.5.jar, httpcore-4.1.1.jar, httpcore-nio-4.1.1.jar, netty-3.5.5.Final.jar.

http://central.maven.org/maven2/com/couchbase/client/couchbase-client/1.2.2/couchbase-client-1.2.2.jar

http://repo1.maven.org/maven2/org/codehaus/jettison/jettison/1.1/jettison-1.1.jar

http://repo1.maven.org/maven2/commons-codec/commons-codec/1.5/commons-codec-1.5.jar

http://repo1.maven.org/maven2/org/apache/httpcomponents/httpcore/4.1.1/httpcore-4.1.1.jar

http://repo1.maven.org/maven2/org/apache/httpcomponents/httpcore-nio/4.1.1/httpcore-nio-4.1.1.jar

http://repo1.maven.org/maven2/io/netty/netty/3.5.5.Final/netty-3.5.5.Final.jar

请下载合适的jar包放在 $CATALINA_HOME/lib/ 目录下.

给你的项目增加风格化的序列化方式(可选的)

如果你想使用java自建的序列化方式就什么都不用做啦,如果想使用不同的序列化方式(可以获得更好一些的性能),需要往你的项目中/WEB-INF/lib 增加一些jar包.

msm (在groupId de.javakaffee.msm)在maven仓库中可以获得.你仅仅需要增依赖管理这在你的项目中,使用maven你可以使用 依赖定义kryo-serializer:

<dependency>

<groupId>de.javakaffee.msm</groupId>

<artifactId>msm-kryo-serializer</artifactId>

<version>1.8.0</version>

<scope>runtime</scope>

</dependency>

javolution 的 artifactId是 msm-javolution-serializer, xstream 是msm-xstream-serializer , flexjson 是msm-flexjson-serializer.自行选择..

如果你没有使用maven,不同的的序列化策略需要不同的jar包

serializers:

kryo-serializer: msm-kryo-serializer, kryo-serializers-0.11 (0.11 is needed, as 0.20+ is for kryo2), kryo, minlog, reflectasm, asm-3.2

http://repo1.maven.org/maven2/com/googlecode/kryo/

http://repo1.maven.org/maven2/de/javakaffee/kryo-serializers/0.11/

http://repo1.maven.org/maven2/com/googlecode/kryo/

http://repo1.maven.org/maven2/com/googlecode/minlog/

http://repo1.maven.org/maven2/com/googlecode/reflectasm/

http://repo1.maven.org/maven2/asm/asm/3.2/

javolution-serializer: msm-javolution-serializer, javolution-5.4.3.1

http://repo1.maven.org/maven2/de/javakaffee/msm/msm-javolution-serializer/

http://memcached-session-manager.googlecode.com/svn/maven/javolution/javolution/5.4.3.1/

xstream-serializer: msm-xstream-serializer, xstream, xmlpull, xpp3_min

http://repo1.maven.org/maven2/de/javakaffee/msm/msm-xstream-serializer/

http://repo1.maven.org/maven2/com/thoughtworks/xstream/xstream/

http://repo1.maven.org/maven2/xmlpull/xmlpull/

http://repo1.maven.org/maven2/xpp3/xpp3_min/

flexjson-serializer: msm-flexjson-serializer, flexjson

http://repo1.maven.org/maven2/de/javakaffee/msm/msm-flexjson-serializer/

http://repo1.maven.org/maven2/net/sf/flexjson/flexjson/

1.2.3配置 memcached-session-manager 作为<Context> 管理者

更新 <Context>(一般在tomcat 安装目录/conf/context.xml 如果你修改过配置文件的位置,自行修改)使Manager 包含memcached-session-manager ,下面给出实例.

下面的配置的例子是sticky sessions ,memcached的non-sticky sessions还有membase的non-sticky sessions;

这个配置假设你有两个memcached分别安装在两台机器上,1个在host1,另一个在host2。所有的例子都使用 sticky sessions + kryo(序列化)。

sticky sessions + kryo 的例子

下面是tomcat1的配置,假设这个tomcat运行在tomcat1,这台机器同时还运行了 memcached "n1". 属性 failoverNodes="n1" 告诉msm 把session主要存储在memcached "n2",当没有其他 memcached node(这里主要指n2) 可以使用的时候才存储在"n1"(如果host1 很不幸运的挂掉了,session 将会继续存储在 memcached "n2" tomcat2 也将继续服务)。第二个tomcat(在host2上)你仅仅需要把failover
node 改为“n2” ,所以他叫喜欢“n2”,其他的东西不用改。

<Context>

...

<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"

memcachedNodes="n1:host1.yourdomain.com:11211,n2:host2.yourdomain.com:11211"

failoverNodes="n1"

requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"

transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"

/>

</Context>

non-sticky sessions + kryo 例子

non-sticky sessions例子的配置. 在这个例子不需要配置 ,session将会在tomcat之间循环,不会仅仅使用一个tomcat。下面是non-sticky sessions 配置 (所有的tomcat都这样) ;

<Context>

...

<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"

memcachedNodes="n1:host1.yourdomain.com:11211,n2:host2.yourdomain.com:11211"

sticky="false"

sessionBackupAsync="false"

lockingMode="uriPattern:/path1|/path2"

requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"

transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"

/>

</Context>

non-sticky sessions with couchbase + kryo 的例子

如果使用的是 membase 名字叫"bucket1"配置如下;

<Context>

...

<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"

memcachedNodes="http://host1.yourdomain.com:8091/pools"

username="bucket1"

password="topsecret"

memcachedProtocol="binary"

sticky="false"

sessionBackupAsync="false"

requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"

transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"

/>

</Context>

多个contexts共享session的 运行多个webapps/contexts 共享session (例如 已经设置 sessionCookiePath="/" -or emptySessionPath="true" in tomcat6),当你使用memcached存储session,你必须告诉 memcached session manager 添加一个session前缀,这是你可以使用 storageKeyPrefix属性来设置(详细的设置如下):

如果你

<Context sessionCookiePath="/">

...

<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"

memcachedNodes="n1:host1.yourdomain.com:11211,n2:host2.yourdomain.com:11211"

failoverNodes="n1"

storageKeyPrefix="context"

requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"

transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"

/>

</Context>

下面的章节是更加详细的配置。

当我们在 Context/Manager 属性中配置了msm ,我们程序的session将会存储在memcached或者membase中,现在你可以做一些测试,关掉tomcat中的一个或者几个,或者重启其中的一个 memcached etc, have fun :-) !

1.2.4memcached-session-manager 配置属性概览;

className (必须的)

这个设置是让 de.javakaffee.web.msm.MemcachedBackupSessionManager 去管理memcached中session的存储。然而,在1.3.6 版本以后在开发的过程中还有一个de.javakaffee.web.msm.DummyMemcachedBackupSessionManager 可以使用:他只是简单的把session序列化在内存Map中。当下一次请求到达的时候在反序列化这些数据,仅仅是查看反序列化的作用。这种情况下我们的程序还是使用的session,memcached-session-manager(或者
DummyMemcachedBackupSessionManager)将不会有作用。session 的序列化个反序列化将会是同步的,这时的memcachedNodes和failoverNode不会创建一个memcached 端,所以序列化的数据不会存储在memcached,这个时候Memcaches 也不是必须的。

memcachedNodes (必须的)

这个属性必须包含所有的 memcached nodes或者membase bucket uri(s) ,所有的tomcat都必须配置好。每个节点用","分割例如对于一个节点来说<id>是可选的(e.g. memcachedNodes="n1:app01:11211,n2:app02:11211"),所以还可以使用<host>:<port>来定义 (e.g. memcachedNodes="localhost:11211"),这样sessionId就不会改变(没有添加node id),这个选项在配置 membase+moxi是非常有用的,所有的tomcat仅仅认识一个"memcached"(实际上是moxi)

memcached nodes:每一个memcached node 定义方式为<id>:<host>:<port>.

membase bucket uris (since 1.6.0): 使用membase 必须配置一个或者多个membase bucket uris, 例如 http://host1:8091/pools,http://host2:8091/pools. Bucket用户名和密码必须通过 username跟password 配置(下面还会讲到)。 连接到 membase 需要一些支持memcached 协议的jar包. 需要把 jettison.jar 跟 netty.jar 放到 CATALINA_HOME/lib/.

failoverNodes (可选的, 在 non-sticky sessions 是必须的)

当有其他可以使用的memcache 节点的时候使用,因此你应该列出那些跟你的tomcat在同一台机器上的memcached node例如,host1上安装了tomcat1(t1) memcached1(m1),host2上安装了tomcat1(t2) memcached1(m2),你应该设置n1作为tomcat1的failover node.因此当memcached2(tomcat2 failoverNodes 设置为 n2)不能使用的时候tomcat1 的session 仅仅存储在memcached1.
这种设置当host1宕机的时候tomcat1的session 还是可以继续工作的。

对于非粘性会话的会话是不依赖于一个单一的tomcat failoverNodes不得指定。对于membase buckets 这个属性可以省略。

多个memcached node 必须用空格“  ”或者逗号“,”分隔。

username (1.6.0以后, 可选的)

membase bucket或者SASL 使用的username,如果memcachedNodes 包含一个(或多个)membase bucket uri,这就是bucket的名称。如果memcachedNodes 使用了username 给SASL授权。还需要一个memcached 协议的包。

password (1.6.0以后, 可选的)

membase bucket 或者 SASL 授权密码(如果没有密码默认为空就好)。

memcachedProtocol (1.3以后, 可选的, 默认值 text)

使用的memcached的协议, text或者binary.

sticky (1.4.0以后, 可选的, 默认值 true)

设置 sticky Session 或者 non-sticky Session.

其它可选的配置选项,自己去查吧。

原文https://code.google.com/p/memcached-session-manager/wiki/SetupAndConfiguration

如果发现错误可以联系我 [email protected]

memcached-session-manager 教程实现session共享,布布扣,bubuko.com

时间: 2024-11-08 17:31:15

memcached-session-manager 教程实现session共享的相关文章

tomcat + memcached session manager共享session

网上有很多关于通过MSM(memcached session manager)实现memcached共享session的文章,但是很多都是东拼西凑,误导别人.正巧最近有一个地方用到,特此总结一下. MSM支持tomcat6,tomcat7,tomcat8,MSM支持两种模式:sticky sessions(粘性session)和non-sticky sessions(非粘性session).我用到的是sticky session,所以以下都按照sticky session 来介绍.集群结构是2个

搭建memcached session manager

搭建环境: Memcached-1:192.168.0.210 Memcached-2:192.168.0.211 Nginx+tomcat:192.168.0.212 Nginx+tomcat:192.168.0.227 一.下载libevent-2.0.21-stable.tar.gz和memcached-1.4.20.tar.gz 1.安装libevent 1 #wget https://github.com/downloads/libevent/libevent/libevent-2.0

Nginx+Tomcat7+Memcached负载均衡集群+session共享

Nginx+Tomcat7+Memcached负载均衡集群服务搭建 操作系统:CentOS6.5     本文档主要讲解,如何在CentOS6.5下搭建Nginx+Tomcat7+Memcached负载均衡集群服务器,Nginx负责负载均衡,Tomcat7负责实际服务,Memcached负责同步Tomcat7的Session,达到Session共享的目的.1.安装NginxNginx官网:http://nginx.org/下载最新稳定版本.在安装Nginx之前,需要先安装gcc. openssl

使用msm(memcached session manager)实现会话服务器

很多场景下,用户的访问网站的会话信息都需要保存,实现会话保存的方式有三种: 1.session绑定 2.session复制,在多个集群的节点间复制会话信息到各个节点 3.session服务器,使用单独的服务器专门用于保存会话信息.实验过程要实现的是第三种方式,使用session服务器的方式来保存用户的会话信息. 实验用机: 两台前端tomcat集群,使用httpd做反向代理,请用户请求转发至后端的tomcat集群,同时有两台memcached服务器用于保存用户的会话信息,其中有一个节点作为备用会

windows使用nginx+memcached实现负载均衡和session或者缓存共享

windows使用nginx+memcached实现负载均衡和session或者缓存共享 两台服务器 服务器1:115.29.186.215 windows2008 64位操作系统 服务器2:114.215.193.64 windows2008 32位操作系统 其中服务器1同时做nginx负载均衡服务器 使用概要:由于两台服务器:所以数据库连接可以使用一台服务器: 由于本人使用的ibatis框架:所以在数据库层使用ibatis Cache 这样就可以使用一台sql服务器:两台服务器访问都是缓存数

16_构建memcached服务、LNMP+memcached、PHP的本地Session信息、PHP实现session共享

proxy   10.10.11.10client  10.10.11.11web1    10.10.11.12web2    10.10.11.13 proxy:1.构建memcached服务]# yum -y install memcached]# cat /etc/sysconfig/memcachedPORT="11211"USER="memcached"MAXCONN="1024"CACHESIZE="64"OPT

Python+Django+SAE系列教程16-----cookie&amp;session

本章我们来讲解cookie和session ,这两个东西相信大家一定不陌生,概念就不多讲了,我们直接来看其用法,首先是cookie,我们在view中添加三个视图,一个是显示cookie的,一个是设置cookie的,如下: def show_cookie(request): if "MyTestCookie" in request.COOKIES: return HttpResponse("Cookie[MyTestCookie]的内容是: %s" % request

centos6.5用memcached 来作PHP 的session.save_handler

php有两个memcache模块,一个是php-memcache,一个是php-memcached,php-memcached是最新的,也是比较稳定的,网上的太多的资料都是关于php-memcache的,太少提到php-memcached,而php-memcached的配置跟php-memcache是有所不同的.我的环境是多台webServer,全安装了nginx+php,3台memcached 服务器. webserver_IP:192.168.10.9----22 memcachedserv

Spring Session + Redis实现分布式Session共享

通常情况下,Tomcat.Jetty等Servlet容器,会默认将Session保存在内存中.如果是单个服务器实例的应用,将Session保存在服务器内存中是一个非常好的方案.但是这种方案有一个缺点,就是不利于扩展. 目前越来越多的应用采用分布式部署,用于实现高可用性和负载均衡等.那么问题来了,如果将同一个应用部署在多个服务器上通过负载均衡对外提供访问,如何实现Session共享? 实际上实现Session共享的方案很多,其中一种常用的就是使用Tomcat.Jetty等服务器提供的Session