首页 > 编程知识 正文

cookiesession共享,集群session解决方案

时间:2023-05-06 05:48:05 阅读:32002 作者:102

Session是服务器用于存储用户操作的一组会话信息,由Web容器进行管理。 对于独立的,会话共享不存在。 对于分布式,如果不共享Session,请求可能会落在不同的计算机上,从而导致重复登录。 一般来说,解决Session共享有以下方案。

1、会话拷贝

session复制是一种服务群集session管理机制,它经常使用早期的企业类。 APP应用服务器打开web容器的session复制功能,在群集中的几个服务器之间同步session对象,并将所有session信息存储在每台服务器上,从而在任一停机时间内完成session信息如果服务器使用session,则直接从本地获取。

当APP应用程序群集达到数千个时,这种方法会出现瓶颈,每一个群集都需要session备份,并且内存可能不足。

Terracotta实现了Session复制的原理: Terracotta的基本原理是对于集群之间共享的数据,当某个节点发生变化时,Terracotta只将变化的部分发送到Terracotta服务器,而服务器该方案可视为对第二个方案的优化。

优点:这极大地减少了网络负载,并消除了每个节点浪费CPU时间和内存进行大量序列化操作的需要。 通过将这种集群间的数据共享机制应用于Session同步,可以在避免对数据库的依赖的同时,获得负载均衡和灾难恢复的效果。

2、会话绑定

使用散列算法(如nginx上的ip_hash )将同一Ip的请求分发到同一服务器。

这种方式不符合对系统的高可用性要求。 因为如果一台服务器停机,该计算机上的会话也将不存在,用户请求切换到其他计算机后,或者有会话,业务处理将无法完成。

3、用cookie记录会话

session记录在客户机上,每次向服务器请求时,都会将session作为请求发送到服务器,并在服务器处理请求后将更改的session响应到客户机。 这里的客户端是cookie。

利用cookie记录会话也有缺点。 例如,受cookie大小的限制,可记录的信息有限。 每次请求响应时都必须传递cookie,这会影响性能,并且如果用户关闭cookie,访问将不正常。 但那是

虽然cookie易于使用、高可用性,并支持APP应用程序服务器的线性伸缩,但大多数session信息相对较小,因此实际上许多网站都使用cookie来记录session。

4 .会话服务器

session服务器解决了上述所有问题,并利用独立部署的session服务器(群集)统一管理session,服务器在每次读写session时访问sion服务器。

实际上,此解决方案是一种APP应用程序服务器状态隔离,分为无状态APP应用程序服务器和有状态的session服务器,并根据它们的特性设计体系结构。

对于有状态的session服务,一个比较简单的方法是使用分布式缓存(memcached )、数据库等。 根据这些产品打包,以满足session的存储和访问要求。

如果业务场景对session管理有很高的要求,例如要利用基于session服务的单点登录(sso )、用户服务器等功能,就必须开发专用的session服务管理平台。

如果同时发生分布式会话,是否会出现会话不同步的问题?

可以使用tair乐观锁定解决此问题,并在用户获得会话后获得版本号。 更新会话后,版本号为1。 如果在新会话时与版本号不匹配,则无法更新。 保证会话的一致性

使用Session共享也有两种机制:

1、粘性Session处理方式

原理:为每个Tomcat指定不同的主memcached访问权限。 多个memcached之间的信息是同步的,可以进行主从备份和高可用性。 用户访问时,首先在Tomcat中创建Session,然后复制Session并将其部署到相应的memcached中。 memcached是备份程度,读写在Tomcat。 一个Tomcat锁定后,群集将在Tomcat中准备用户访问,从存储在cookie中的SessionID中找到Session,如果找不到,则前往相应的memcached查找Session

2、非粘性Session处理方式

原理: memcached从主从服务器复制会话,写入会话从memcached服务器上,读取会话并从主memcached复制会话,Tomcat本身不保存会话。

优点:容错、会话实时响应。

实现方式:通过开源msm插件解决Tomcat之间的Session共享: memcached_session_manager(MSM ) )。

a .将相关jar包复制到tomcat/lib

目录下

JAVA memcached客户端:spymemcached.jarmsm项目相关的jar包:1. 核心包,memcached-session-manager-{version}.jar2. Tomcat版本对应的jar包:memcached-session-manager-tc{tomcat-version}-{version}.jar序列化工具包:可选kryo,javolution,xstream等,不设置时使用jdk默认序列化。

b. 配置Context.xml ,加入处理Session的Manager

粘性模式配置: 

 

非粘性配置: 

 

3、微服务架构下分布式Session管理方案

经过上文的分析,在微服务架构中,使用Session集中管理的方式维护微应用的Session是比较好的选择。因为在Session存储介质上,Redis要比Memcache合适,所以使用Redis来集中存放微应用Session更为合适。在Session管理实现方案上,Spring Session的实现思路适用性较高,但是代码量大,学习和维护成本高,所以笔者认为参照Spring Session的思路,自己开发一套轻量级的代码是比较好的选择。

经过设计,微服务架构中的Session集中管理示意图如下。

图5  Session集中管理方案示意图

1、参照SpringSession的实现,使用SessionFilter进行请求拦截,然后通过Request包装类接管Web服务器的Session管理。在Request包装类中,重写getSession方法,Session使用方法和过去一样,对使用者透明。

2、基于jedis开发一个分布式缓存SDK模块,用于Session共享模块和Redis中间进行通信,能够增加Session集中管理的可扩展性,如果需要支持其他的缓存服务器,对缓存SDK进行扩展开发即可。

3、搭建Redis集群用于存放微应用Session,以保证Session数据的高可用。Redis集群示意图如下。

集群中包含两个Master和两个Slave,两个Master对Session数据进行分片存储,而Slave可用于进行数据备份和读写分离。

5、Session持久化到数据库

原理:拿一个数据库专门用来存储Session信息,保证Session的持久化。

优点:服务器出现问题,Session不会丢失。

缺点:如果网站的访问量很大,把Session存储到数据库中,会对数据库造成很大压力,还需要增加额外的开销,维护数据库。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。