Tomcat+memcached+Nginx实现session共享

1.文档简要说明

2.文档相关内容地址:

2.1相关软件包及下载地址

官方网址:

MSM

Memcached

最新稳定包下载地址:

2.2相关配置文件模板及地址

相关依赖的jar包可从此配置文件模板中的链接下载

2.3相关文档地址

Memcached安装:\hdmusic\trunk\docs\系统部署\Memcached\Memcached安装.doc

Tomcat安装:\hdmusic\trunk\docs\系统部署\Tomcat\Tomcat+Jdk安装.doc

Nginx安装:\hdmusic\trunk\docs\系统部署\Nginx\nignx安装.doc

Nginx+tomcat整合:\hdmusic\trunk\docs\系统部署\Nginx\Nginx+Tomcat实现负载均衡动静分离.doc

3.文档内容:

3.1原理介绍:

MSM(memcached-session-manager)支持tomcat6tomcat7,利用ValueTomcat阀)对Request进行跟踪。Request请求到来时,从memcached加载sessionRequest请求结束时,将tomcat session更新至memcached,以达到session共享之目的,支持stickynon-sticky模式。

Sticky 模式:tomcat session sessionmemcached 为备sessionRequest请求到来时,从memcached加载备session tomcat (仅当tomcat jvmroute发生变化时,否则直接取tomcat session)Request请求结束时,将tomcat session更新至memcached,以达到主备同步之目的。

Non-Sticky模式:tomcat session为中转sessionmemcached1为主sessionmemcached 2 为备sessionRequest请求到来时,从memcached 2加载备session tomcat,(当容器中还是没有session 则从memcached1加载主session tomcat这种情况是只有一个memcached节点,或者有memcached1出错时),Request请求结束时,将tomcat session更新至主memcached1和备memcached2,并且清除tomcat session 。以达到主备同步之目的。

3.2下载msm的jar包,并将其放置tomcat的lib目录下

tc6和tc7分别对应tomcat6和tomcat7,若需添加一个jar便可。

必须jar:

根据序列化选择jar:kryo效率在高可用时效率最高,但并发量不大时比较一般。

kryo-serializer: , , , , ,

javolution-serializer: ,

xstream-serializer: , , ,

flexjson-serializer: ,

3.3流程图

1.sticky

spacer.gif

2.non-sticky

spacer.gif

3.4修改tomcat/conf/context.xml文件,在<Context>添加如下内容:

配置内容及官方截图如下:

sticky

#nano /usr/local/tomcatA/conf/context.xml

在< Context>< /Context>中加入以下内容

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

memcachedNodes="n1:192.168.1.123:11211,n2:192.168.1.129:11211"

failoverNodes="n1"

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

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

spacer.gif

non-sticky

<ManagerclassName="de.javakaffee.web.msm.MemcachedBackupSessionManager"

memcachedNodes="n1:192.168.1.146:11211,n2:192.168.1.1145:11211,n3:192.168.1.146:11212"

sticky="false"
sessionBackupAsync="false"
lockingMode="uriPattern:/path1|/path2"
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"/>

官方截图:

spacer.gif

3.5配置解释:

t1(m1): 192.168.1.145 t2(m2):192.168.1.146
t1配置n1:192.168.1.145:11211 n2:192.168.1.146:11211
t2配置n1:192.168.1.146:11211 n2:192.168.1.145:11211
. \ / . . X . . / \ .

sticky:采用Sticky配置时,tomcat默认维持向n2的session访问(建议不要把n2放在本机上,以防t1的机子宕机时tomcat等全部被关闭),当n2宕掉时,会转而访问n1的session。

non-sticky采用Non-sticky时,tomcat会分发请求,并不维持对同一个tomcat的访问,而是通过轮询的方式随机访问。即tomcat随机对n1、n2的访问,建议搭载成三个memcached,三台机的session互为备份,当其中一个memcached失效时一台转为主要memcached,另外一台依旧可以备份。

3.6测试(此处的jsp仅列出body内容,测试服务器145、146)

n1:192.168.1.146:11211,n2:192.168.1.145:11211,n3:192.168.1.146:11212

输入内容:save.jsp

<body>

<FORM METHOD=POST ACTION="index.jsp">

What's your name? <INPUT TYPE=TEXT NAME=username SIZE=20>

<P><INPUT TYPE=SUBMIT>

</FORM>

</body>

获得sessionid:index.jsp

<body>

<%

String name = request.getParameter( "username" );

session.setAttribute( "theName", name );

%>

This is my JSP page. <br>

<%=session.getId()%>

<A HREF="next.jsp">Continue</A>

</body>

得到sessionid及session值: next.jsp

<body>

<%=session.getId()%><br>

Hello, <%= session.getAttribute("theName")%>

</body>

查看memcached是否启动。

#ps –A|grep memcached

spacer.gifspacer.gif

Memcached未宕机时:

spacer.gif

spacer.gif

spacer.gif

可知145访问的是n2的session,宕掉145的memcached,再次访问next.jsp,访问结果如下:

spacer.gif

spacer.gif

如上图所示,宕掉n2后,转而访问n3的session,得到session值依旧是123,再次宕掉n3,访问截图如下:

spacer.gif

宕掉n1:

spacer.gif

至此,所以session均被清空,重启三台memcached后,session值为null。

3.7Memcached对web项目的要求

要求web项目需要序列化,否则,类似于后台登陆系统会报未必序列化错误。

3.8Nginx+memcached+tomcat实现session共享

剩余步骤中,只需实现nginx+tomcat的负载均衡和动静分离便可,详细请打开,此处不做详细实现。

\hdmusic\trunk\docs\系统部署\Nginx\Nginx+Tomcat实现负载均衡动静分离.doc

3.9待续

配置内容及相关命令在表格