`
chenkangxian
  • 浏览: 87982 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

分布式环境下session的存储的几个解决方案

阅读更多

企业级应用系统很少是部署在单台服务器上的,这样就带来了跨服务器如何进行session共享的问题,笔者提供了两种方案,分别适用于两种不同场合,持久化session适合于高可靠性的环境,性能上可能有所损坏,而基于memcache的解决方案相对来说性能较好,但一旦memcache重启,数据丢失。

 

分布式session之持久化

mysql举例

 

1.建立数据库

 

create database session_persistence;

use session_persistence;

create table session(
   session_id varchar(100) NOT NULL,
   valid_session char(1) NOT NULL,
   max_inactive int(11) NOT NULL,
   last_access bigint(20) NOT NULL,
   app_name varchar(255) DEFAULT NULL,
   session_data mediumblob,
   primary key (session_id),
   KEY kapp_name (app_name)
 ) engine=InnoDB default charset=utf8;

 :表的字段必须和下面的配置对应 

 

2.配置tomcatcontext.xml

 

<Manager className="org.apache.catalina.session.PersistentManager"
		distributable="true" duplicates="-1" saveOnRestart="true"
		maxActive="-1" maxActiveSessions="0" minIdleSwap="-1" maxIdleSwap="-1"
		maxIdleBackup="-1" maxInactiveInterval="-1" sessionCounter="-1">

		<Store className="org.apache.catalina.session.JDBCStore"
			checkInterval="1"
connectionURL="jdbc:mysql://server_address:port/session_persistence?user=username&amp;password=password"
			driverName="com.mysql.jdbc.Driver" sessionAppCol="app_name"
			sessionDataCol="session_data" sessionIdCol="session_id"
			sessionLastAccessedCol="last_access" sessionMaxInactiveCol="max_inactive"
			sessionTable="session" sessionValidCol="valid_session" />
	</Manager>

 参数与数据库字段对应 

 

3.tomcatlib目录下导入mysql 驱动jar

 

 

分布式缓存session

memcache举例

 

笔者使用google code下面的memcached-session-manager来实现分布式环境下session的缓存,经笔者测试性能还不错。当然,读者可以按照类似思路自己实现。

 

memcached-session-manager项目地址:http://code.google.com/p/memcached-session-manager/

 

笔者使用kryo来做对象序列化。

 

1.WEB-INF下面需要引入

kryo-1.04-all.jar

kryo-serializers-0.9.jar

msm-kryo-serializer.1.5.0.jar

 

2.tomcatlib下面引入

memcached-2.5.jar

memcached-session-manager-1.5.0.jar

memcached-session-manager-tc6-1.5.0.jar

 

3.context.xmlcontext标签下面加入:

 

<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:127.0.0.1:11211" sticky="false" lockingMode="auto"
requestUriIgnorePattern=".*\.(png|gif|jpg|css|js)$"
sessionBackupAsync="false" sessionBackupTimeout="0"
memcachedProtocol="binary" copyCollectionsForSerialization="true"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
 />

 

其中memcachedNodes表示memcache节点,如需配置多个中间空格分开(n1:192.168.0.11.1:11211 n2:192.168.0.10:11211)

 

分享到:
评论
9 楼 chinalwb 2015-12-09  
陈老师您好!
在读《大型分布式网站架构设计与实现》的第2.1章节,分布式session的时候也读到了这个话题。
有一个疑问:
  memcachedNodes="n1:127.0.0.1:11211"
这个是指定了 存储session的主机,对吧?

那么对于分布式缓存集群来存储分布式session的时候
是否需要考虑session在各个Cache Server中的同步问题呢?

如果需要考虑,那有没有什么推荐的方式来同步Cache Server(比如memcache)之间的数据?用memcache的同步机制?

如果不需要考虑的话,那是不是通过hash的算法或其他方式来保证某一个sessionId所对应的的session一定存储在某台Cache Server上?

希望您能指点下,多谢!
8 楼 ibella 2015-09-21  
为什么不选择适用redis做分布式缓存呢?redis不是更好些吗?可以持久化。
7 楼 singleTon 2012-06-14  
chenkangxian 写道
singleTon 写道
分布式session管理不是有apache这种集群服务器管理吗?
不是很明白,望指教!

回答:不知道楼上说的是否为tomcat,tomcat的session会在每台机器上复制一份,如果集群规模过大,是不具有扩展性的

恩,明白了,3ks
6 楼 singleTon 2012-06-14  
现分布式环境下session的缓存,经笔者测试性能还不错。当然,读者可以按照类似思路自己实现。
chenkangxian 写道
singleTon 写道
另外在程序员杂志上看到你的文章咯你说到url定义如下形式:
http://api.domain.com/service/rest?sign=ABCD
EFG&timestamp=2011-10-10 22:28:10&app_
key=12345&method=servicecenter.item.
get&format=json&id=100。
我正在为cs客户端定义http接口,请问这个timestamp这个参数的具体意义是什么呢?先谢了!

回答:这个表示时间戳,每次调用均会产生


这个参数有必要吗?不明白这个参数的实际作用.可以用来记录客户端调用次数?
5 楼 chenkangxian 2012-04-07  
singleTon 写道
分布式session管理不是有apache这种集群服务器管理吗?
不是很明白,望指教!

回答:不知道楼上说的是否为tomcat,tomcat的session会在每台机器上复制一份,如果集群规模过大,是不具有扩展性的
4 楼 chenkangxian 2012-04-07  
singleTon 写道
另外在程序员杂志上看到你的文章咯你说到url定义如下形式:
http://api.domain.com/service/rest?sign=ABCD
EFG&timestamp=2011-10-10 22:28:10&app_
key=12345&method=servicecenter.item.
get&format=json&id=100。
我正在为cs客户端定义http接口,请问这个timestamp这个参数的具体意义是什么呢?先谢了!

回答:这个表示时间戳,每次调用均会产生
3 楼 singleTon 2011-12-29  
另外在程序员杂志上看到你的文章咯你说到url定义如下形式:
http://api.domain.com/service/rest?sign=ABCD
EFG&timestamp=2011-10-10 22:28:10&app_
key=12345&method=servicecenter.item.
get&format=json&id=100。
我正在为cs客户端定义http接口,请问这个timestamp这个参数的具体意义是什么呢?先谢了!
2 楼 singleTon 2011-12-29  
分布式session管理不是有apache这种集群服务器管理吗?
不是很明白,望指教!
1 楼 zhanjun 2011-10-17  
学习了,用来试试

相关推荐

    分布式Session的几种解决方案,你中意哪种.docx

    以下是对几种分布式Session解决方案的详细解析: 1. 客户端存储: 这种方法将Session信息直接存储在客户端的Cookie中,确保每次请求都能携带完整的Session信息。然而,这种方法的安全性较低,因为Cookie中的数据...

    分布式session 解决方案

    分布式Session解决方案是为了在分布式系统环境下实现用户会话的共享,以克服HTTP协议无状态的特性。在传统的Web应用中,Session通常存储在单个Web服务器的内存中,但在分布式环境中,用户请求可能会被负载均衡器分配...

    分布式服务集群下实现session共享解决方案.docx

    本文主要探讨了几种在分布式系统中实现session共享的解决方案。 首先,我们需要理解session的基本概念。session是在服务器端创建的一种存储用户会话状态的机制。每当新的客户端发起HTTP请求时,服务器会创建一个...

    分布式Session一致性解决方案.docx

    ### 分布式Session一致性解决方案 在现代互联网应用中,随着业务规模的增长和技术的发展,传统的单体应用模式已逐渐被分布式架构或微服务架构所取代。在这种架构下,系统的可扩展性和高可用性得到了显著提升,但...

    基于ZooKeeper的分布式Session实现

    实现基于ZooKeeper的分布式Session,主要涉及以下几个步骤: 1. **Session创建与注册**:当用户首次访问应用时,服务器会在ZooKeeper上创建一个与该Session关联的节点,并存储Session数据。这个节点通常包含用户的...

    分布式集群架构中场景化解决方案课程笔记1

    分布式Session管理需要解决以下几个问题: 1. 如何在多个服务器之间共享Session信息? 2. 如何确保Session信息的安全性? 3. 如何快速地检索和存储Session信息? 解决方案之一是使用Hash算法来存储Session信息,并...

    43_说说你们的分布式session方案是啥?怎么做的?.zip

    本资料将深入探讨分布式Session的解决方案。 首先,我们需要理解什么是分布式会话。分布式会话是指在分布式系统中,用户的会话状态能够在集群中的所有节点间共享和同步。这样,无论用户请求发送到哪台服务器,都能...

    Session丢失原因和解决方案

    针对这些问题,有以下几种解决方案: **1. 使用StateServer模式** 将`&lt;sessionState&gt;`配置中的`mode`属性设置为`StateServer`,这会将Session数据存储在一个单独的ASP.NET State Service进程中。确保启动该服务,并...

    基于spring-cloud分布式session共享文档

    分布式Session共享是指在分布式环境下,多个节点之间能够共享用户的Session信息,确保用户无论访问哪个节点都能保持登录状态。这样即使用户在不同的服务器间跳转,也能维持一致的用户体验,避免重复登录等问题。 ##...

    聊聊分布式下的WebSocket解决方案.docx

    在分布式集群环境下,为了实现WebSocket的有效通信,我们需要考虑以下几个方面: 1. **会话保持(Session Stickiness)**:确保同一客户端始终连接到同一服务器节点。 2. **状态共享(State Sharing)**:实现客户端...

    38. Spring Boot分布式Session状态保存Redis【从零开始学Spring Boot】

    要实现Spring Boot分布式Session与Redis的整合,我们需要以下几个步骤: 1. **添加依赖**: 首先在`pom.xml`或`build.gradle`文件中添加Spring Session和Redis的依赖。对于Maven,可以添加如下依赖: ```xml ...

    集群环境下memcache解决session共享

    总结来说,"集群环境下memcache解决session共享"是一个针对分布式系统中session管理的有效解决方案。通过使用memcache作为session的中央存储,可以在Tomcat8集群中实现用户状态的无缝切换,提升应用的稳定性和用户...

    TP3.2的Session的Redis分布式驱动

    "表明这个压缩包提供了一个解决方案,弥补了TP3.2.3框架在Session管理方面的不足。开发者可以下载并集成这个驱动,以便在他们的项目中利用Redis作为Session存储。 标签"tpsession"进一步强调了这个话题与ThinkPHP...

    处理session跨域几种方案

    2. **统一Session存储**: - **数据库存储**:文中提供的`Session`类示例展示了如何将Session数据存储在MySQL数据库中。这种方法适用于多台服务器或跨域情况,因为数据存储在集中式位置。但需要注意,频繁的Session...

    集群中几种session同步解决方案的比较共1页.pdf

    6. **分布式Session存储**: 如Google的OpenID Connect或OAuth 2.0等协议,允许用户在多个服务间共享身份验证信息,无需在每个服务上独立管理session。这种方法适用于大型分布式系统,但实现起来较为复杂。 在选择...

    zookeeper分布session式实现

    ZooKeeper作为一种强大的分布式协调工具,为分布式Session管理提供了一个高效、可靠的解决方案。通过利用ZooKeeper的特性,可以有效地克服分布式环境下Session管理的挑战,提高系统的整体性能和用户体验。

    互联网系统垂直架构之Session解决方案

    Spring框架提供了更高级的Session管理功能,如Spring Session,支持分布式Session存储。 总结,Session在互联网系统垂直架构中的管理是复杂而重要的。选择合适的Session解决方案需要综合考虑系统的规模、性能需求和...

    集群中几种session同步解决方案的比较

    ### 集群中几种session同步解决方案的比较 在分布式系统和集群环境中,session管理是一项关键技术,它确保了用户在不同服务器之间的交互能够保持一致性。本文将深入探讨六种常用的session共享方法,包括它们的工作...

    tomcat分布式

    分布式部署是大型系统或高并发环境下的常见解决方案,它可以将负载分散到多个服务器上,降低单点故障的风险,同时提高服务的响应速度。 分布式Tomcat的实现通常涉及以下几个关键知识点: 1. **负载均衡**:通过...

    Spring Boot + Spring Session + Redis

    这个解决方案主要解决分布式系统中的session共享问题,使得用户在不同服务器之间切换时,仍然能够保持会话状态。 Spring Boot是Spring的一个模块化、简化版,它提供了快速构建独立、生产级别的Java应用程序的能力,...

Global site tag (gtag.js) - Google Analytics