`

Tomcat集群Session共享解决方案Memcached

 
阅读更多

Session是什么

用户访问服务器资源主要分成两类,一类是无状态访问,例如请求一张图片。另一类是有状态访问,这种情况下,服务器需要记录追踪用户状态,并根据用户所处状态做出不同响应,典型的例子是购物车。Session的作用就是在Web服务器上保持用户的状态信息。

Tomcat集群为什么需要Session共享

当客户端访问Tomcat集群时,所有的请求将被Nginx拦截,由Nginx做负载均衡后转发给后台真实Tomcat。按照这个流程就可能出现一个问题,当用户进行页面刷新或跳转时,每次请求将被转发给不同的Tomcat处理,这样就会造成Session的不同步。举个简单的栗子,例如当用户往购物车添加商品时,兴高采烈地准备买单了,当他跳转到付款页面却发现购物车被清空了,这就是Session丢失的典型栗子。因此,我们需要为集群环境做Session同步。

Session共享方案讨论

在服务器集群的环境下,共享Session的方案主要分为4类:
1.用户端本地保存Cookie
在这种方式下,Web应用会将用户状态写到Cookie并保存到用户本地。但是,如果用户使用的浏览器不支持Cookie或者禁用Cookie,该方案将会失效。并且Cookie能保存的数据是有大小限制的,而且数据暴露给用户本地浏览器,存在安全性问题。


2.采用数据库方式保存Session
相对本地Cookie方式,将用户信息保存到服务端数据库解决了数据安全性问题。然而,这么做是有代价的,应用中所有对Session的访问都必须经过数据库,加大数据库负担,导致系统整体性能降低。


3.代理服务器
通过代理服务器实现Session共享的思路非常简单,就是Session数据在哪台Tomcat,之后的请求都转发到这台Tomcat。例如Nginx,具体实现只需要修改转发规则为ip_hash即可。但这时候可能存在某一时间段大量用户始终访问某台Tomcat的负载很大,也就失去了负载均衡的意义。


4.搭建缓存服务器
这种方案也是应用最普遍的方案,通过搭建缓存服务器,并使用第三方工具接管Tomcat对Session的管理。
本文例子采用方案4进行Session管理,使用的缓存服务器是Memcached,并使用memcached-session-manager管理Session。memcached-session-manager(以下简称msm)的使用方法很简单,只需要根据Tomcat版本和序列化方式下载相应jar包,拷贝至Tomcat的lib目录下,最后修改Tomcat配置文件,更换Session管理模块即可。

原型环境

1.1XX.XX.XX.181
运行Nginx、Tomcat和Tomcat1
2.1XX.XX.XX.182 
运行Memcached
其中1XX.XX.XX.181主机搭建Tomcat集群环境,1XX.XX.XX.182主机搭建缓存服务器。
服务器环境:

# cat /etc/redhat-release 
CentOS release 6.5 (Final)
# uname -a
Linux chenllcentos.localdomain 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 03:15:09 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux

安装Memcached

Memcached是一个高性能的分布式缓存系统,进入下载页面下载最新稳定版本。或者,可以通过wget下载:

# wget http://memcached.org/latest

安装Memcached之前,需要安装libevent-devel依赖:

# yum -y install libevent-devel

解压并安装:

# tar -zxvf memcached-1.x.x.tar.gz
# cd memcached-1.x.x
# ./configure && make && make test && sudo make install

启动memcached运行命令:

# /usr/local/memcached-1.4.21/bin/memcached -d -uroot -m 1024 -P /usr/local/memcached-1.4.21/memcached.pid

这里-d参数表示开启守护线程,-u参数指定用户,-m参数指定分配给memcached的内存大小。更多启动参数如下:

-d 选项是启动一个守护进程
-m 是分配给Memcache使用的内存数量,单位是MB,这里是1024MB,默认是64MB
-u 是运行Memcache的用户,这里是root
-l 是监听的服务器IP地址,默认应该是本机
-p 是设置Memcache监听的端口,默认是11211,最好是1024以上的端口
-c 选项是最大运行的并发连接数,默认是1024,这里设置了10240,按照你服务器的负载量来设定
-P 是设置保存Memcache的pid文件位置
-h 打印帮助信息
-v 输出警告和错误信息
-vv 打印客户端的请求和返回信息

查看端口状态:

[root@chenllcentos bin]# netstat -ntlp | grep memcached
tcp        0      0 0.0.0.0:11211               0.0.0.0:*                   LISTEN      2222/memcached      
tcp        0      0 :::11211                    :::*                        LISTEN      2222/memcached      

在集群环境中,Tomcat需要访问缓存服务器读取并更新Session信息,因此缓存服务器需要对11211端口放行:

# vi /etc/sysconfig/iptables

添加如下内容:

# 放行Memcached端口
-A INPUT -m state --state NEW -m tcp -p tcp --dport 11211 -j ACCEPT

重启iptables

# service iptables restart

停止memcached通过kill命令:

# kill `cat /usr/local/memcached-1.4.21/memcached.pid`

Tomcat配置msm

msm是托管在GoogleCode的一个开源项目,项目详细介绍可以查阅Tomcat high-availability clusters with memcached

拷贝jar包

使用msm之前,需要拷贝一下jars到$TOMCAT_HOME/lib目录:
memcached-session-manager-${version}.jar
memcached-session-manager-tc8-${version}.jar

该jar包需要和Tomcat版本一致。

spymemcached-2.11.1.jar
这里选择kryo-serializer作为序列化策略,因此还需要添加如下用于实现对象序列化的jar包: 
msm-kryo-serializer
kryo-serializers-0.11
kryo
minlog
reflectasm
asm-3.2
最后,还需要添加javolution-serializer所需jar包:
msm-javolution-serializer
javolution-5.4.3.1

修改Tomcat配置文件

修改$TOMCAT_HOME/conf/context.xml配置文件,新增如下信息:

<Context>
    ...
    <!-- Memcached管理集群session  -->
    <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
          memcachedNodes="n1:1XX.XX.XX.182:11211"
          sticky="false"
          lockingMode="auto"
          sessionBackupAsync="false"
          sessionBackupTimeout="1000"
          transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"  />
    ...
</Context>

几点说明:
1.其中memcachedNodes表示memcached节点信息,多个节点以空隔分开;
2.sticky指定Session共享模式;
3.sessionBackupTimeout的单位为分钟。

分别启动主机1XX.XX.XX.181的Nginx、Tomcat和Tomcat1,启动主机1XX.XX.XX.182的Memcached服务器。

Session共享测试

为了测试Nginx集群是否实现session共享,让index.jsp打印Session信息:

SessionID:<%=session.getId()%>

打开浏览器访问,如果配置正确可得到如下以-n1为结尾的Session串:

SessionID:2F712A985872A8688138D293F59E493A-n1.tomcat 

刷新浏览器,可以发现Session并不会发生变化,说明通过Memcached实现Session共享有效。如果我们关闭主机1XX.XX.XX.182的缓存服务器呢?

# kill `cat /usr/local/memcached-1.4.21/memcached.pid`

再刷新浏览器看看,将出现类似如下格式的Session串:

SessionID:E914205336C4FE5A386702F2B6D65063.tomcat 

注意: 如果刷新后仍然出现以以-n1为结尾的Session串,等待几秒后再试试。这是因为关闭缓存服务器需要时间,如果马上刷新Tomcat集群还是能从缓存服务器取到Session。

可以发现-n1结尾消失了,说明Session共享已经失效,并且反复刷新浏览器,Session的值在不断变化。

原文链接: http://runnerfish.github.io//blog/2014/11/19/session-shared-based-on-memcached/

 

分享到:
评论

相关推荐

    tomcat集群session共享解决方案

    本篇文章将深入探讨Tomcat集群中session共享的解决方案,以及相关的应用知识。 1. **Session复制**:这是最基础的session共享方法。通过配置Tomcat的`cluster`模块,可以设置session复制策略。每当一个session在...

    Windows + Nginx + Memcached + Tomcat 集群 session共享

    总之,Windows + Nginx + Memcached + Tomcat 集群session共享方案是一个高效且可靠的架构,它能提高系统的可用性,保证用户会话的连续性,是大规模Web应用常见的部署模式。然而,实际部署时,还需要考虑安全性、...

    tomcat7集群session共享memcache依赖包1.8.3

    "tomcat7集群session共享memcache依赖包1.8.3"这个标题正揭示了这样一个解决方案。 首先,让我们深入了解Tomcat7集群。Tomcat7是Apache Tomcat服务器的一个版本,它支持Servlet 3.0和JSP 2.2规范。通过复制应用和...

    Nginx+Tomcat+Memcached实现tomcat集群和session共享 nginx配置

    Nginx+Tomcat+Memcached实现tomcat集群和session共享 nginx配置

    nginx tomcat memcached 集群 session共享

    这里我们讨论的主题是如何通过Nginx、Tomcat和Memcached来实现集群环境下的session共享。Nginx作为反向代理服务器,负责负载均衡,Tomcat作为应用服务器运行Java Web应用程序,而Memcached则作为分布式内存缓存系统...

    tomcat集群session共享jar(三个)

    总的来说,实现Tomcat集群session共享是提高系统可用性和一致性的重要手段,而基于Redis的解决方案因其高效、灵活而被广泛采用。正确配置和使用`tomcat-redis-session-manager`可以帮助开发者构建稳定、高效的分布式...

    Nginx+Tomcat+Memcached实现tomcat集群和session共享

    下面我们将详细探讨如何实现Nginx+Tomcat+Memcached的集群和Session共享。 **Nginx** Nginx是一款轻量级的Web服务器/反向代理服务器,以其高效的性能和低内存占用著称。在本场景中,Nginx主要负责以下任务: 1. **...

    memcached-session-manager(MSM) Tomcat集群session共享示例

    memcached-session-manager(MSM) Tomcat集群session共享示例

    tomcat集群session共享

    为了提高效率,可以考虑使用更高级的session管理解决方案,如使用共享存储或分布式缓存服务(如Redis、Memcached)来存储session数据。 总之,实现Tomcat集群session共享是一个涉及多个组件配置的过程,需要细心...

    Windows7 + Nginx + Memcached + Tomcat 集群 session 共享

    集群session共享原理** 当用户访问应用时,Nginx将请求分发到一个Tomcat实例。该实例将session数据保存在Memcached中,并将session ID返回给用户。之后,无论用户请求哪个Tomcat实例,只要session ID相同,其他实例...

    memcached+tomcat7共享session所需要的jar包

    标题中的“memcached+tomcat7共享session所需要的jar包”是指使用Memcached作为分布式缓存系统,实现Tomcat7服务器间的Session共享。这通常是为了在集群环境中解决Session复制或粘滞会话的问题,提高Web应用的可扩展...

    Nginx+Tomcat+Memcached-Session-Manager集群Session共享

    通过本篇文档,读者应该能够获得构建基于Nginx+Tomcat+MSM的集群Session共享环境的知识,并能应用这些知识进行实际操作和测试。需要注意的是,在实际操作中,环境配置细节会根据具体需求和软件版本有所不同,因此在...

    memcached+tomcat的session共享

    在Tomcat集群中,如果不同实例间不能共享session,用户在一台服务器上登录后可能在另一台服务器上失去登录状态,这显然不是我们希望看到的。 实现"memcached+tomcat的session共享"的基本思路是:将Tomcat的session...

    tomcat8集群实现session共享,内含session共享包

    在这个场景中,我们关注的是如何在Tomcat集群环境中实现Session共享,以便提高应用程序的可扩展性和可用性。标题和描述提到的“session共享包”是解决这一问题的关键。 **什么是Session?** 在Web应用中,Session是...

    Tomcat集群Session共享所有文件.zip

    标题中的"Tomcat集群Session共享所有文件.zip"表明这是一个关于如何在三台服务器的Tomcat集群中实现Session共享的教程和代码集合。 Session共享的目的是确保用户在集群中的任何一台服务器上操作时,其状态都能被...

    tomcat中Nginx+memcached实现session共享

    但这仅限于服务器故障恢复或负载均衡,如果需要在不同服务器间主动共享Session,就需要引入额外的Session存储解决方案,这就是memcached的作用。 Memcached是一个高性能、分布式的内存对象缓存系统,用于存储临时...

    tomcat8集群session共享(redis处理)

    "Tomcat8集群session共享(redis处理)"的主题正是针对这一问题,通过集成Redis作为分布式缓存来解决。下面我们将详细探讨这个过程。 首先,我们需要理解Session的概念。Session是在Web应用中用于跟踪用户状态的一...

    Memcached-Session-Manager多tomcat实现session共享配置

    总结,Memcached-Session-Manager通过将Session数据存储在Memcached中,为Tomcat集群提供了高效、可靠的Session共享方案。通过灵活配置,可以根据系统的规模、性能需求以及容错要求来定制适合的Session管理策略。...

    tomcat7集群实现session共享

    4. **基于缓存的解决方案**,如**Memcached**或**Redis**:这些分布式缓存系统可以存储session,为所有Tomcat实例提供中心化的session存储。它们通常具有高性能和可扩展性,但需要额外的配置和维护。 在实施session...

    Nginx+Tomcat+Memcached实现tomcat集群和session共享 tomcat部分

    Nginx+Tomcat+Memcached实现tomcat集群和session共享 tomcat部分

Global site tag (gtag.js) - Google Analytics