解决session共享问题方式调研

为了提高服务器性能,最近公司项目采用了分布式服务集群的部署方式。所谓集群,就是让一组计算机服务器协同工作,解决大并发,大数据量瓶颈问题。项目使用nginx做负载均衡,这样同一个IP访问同一个页面会被分配到不同的服务器上,此时就涉及到一个session共享的问题。因为session是在服务器端保存的,如果用户跳转到其他服务器的话,session就会丢失,一般情况下,session不可跨服务器而存在。于是就有了分布式系统的session共享问题。

集群中session安全和同步是个最大的问题,下面是收集到的几种session同步的方案,希望能通过分析其各自的优劣找出其适应的场景。

一、客户端cookie加密

当用户登陆成功以后,把网站域名、用户名、密码、token、 session有效时间全部采用cookie的形式写入到客户端的cookie里面。如果用户从一台Web服务器跨越到另一台服务器的时候,我们的程序主动去检测客户端的cookie信息,进行判断,然后提供对应的服务,当然,如果cookie过期,或者无效,自然就不让用户继续服务了。

优点:

简单、高效,也不会加大数据库的负担。

缺点:

  1. cookie安全性较低,虽然它已经加了密,但是还是可以伪造的。
  2. 但是如果客户端把cookie禁掉了的话,那么session就无从同步了,这样会给网站带来损失;
  3. session中数据不能太多,最好只有个用户id。

二、session复制

大部分应用服务器都提供了session复制的功能来实现集群,tomcat,jboss,was都提供了这样的功能。

优点:

通过应用服务器配置即可,无需改动代码。

缺点:

  1. 性能随着服务器增加急剧下降,而且容易引起广播风暴;
  2. session数据需要序列化,影响性能。

三、使用数据库保存session

这种共享session的方式即将session信息存入数据库中,其它应用可以从数据库中查出session信息。

优点:

使用数据库来保存session,就算服务器宕机了也没事,session照样在。

缺点:

  1. 每次请求都需要对数据库进行读写,session的并发读写在数据库中完成,会加大数据库的IO,对数据库性能要求比较高。
  2. 我们需要额外地实现session淘汰逻辑代码,即定时从数据库表中更新和删除session信息,增加了工作量。
  3. 数据库读写速度较慢,不利于session的适时同步。

四、使用redis或memcache来保存session

提供一个集群保存session共享信息,其他应用统统把自己的session信息存放到session集群服务器组。当应用系统需要session信息的时候直接到session群集服务器上读取。目前大多都是使用Memcache或redis来对Session进行存储。以这种方式来同步session,不会加大数据库的负担,并且安全性比用cookie大大的提高,把session放到内存里面,比从文件中读取要快很多。 以redis来实现Session共享的方式目前比较流行的有两种实现方案,下面主要对这两种方案进行介绍。

1. tomcat-cluster-redis-session-manager

使用 tomcat-redis-session-manager 开源项目解决分布式session跨域的问题,他的主要思想是利用Servlet容器提供的插件功能,自定义HttpSession的创建和管理策略,并通过配置的方式替换掉默认的策略。tomcat-redis-session-manager重写了Tomcat的org.apache.catalina.session.ManagerBase里边的具体写的操作, 将tomcat的session存储位置指向了Redis:

RedisSessionManager 继承了org.apache.catalina.session.ManagerBase并重写了 addfindSessioncreateEmptySessionremove 等方法,并将对session 的增删改查操作指向了对Redis数据存储的操作。

具体可以参考:Redis+Tomcat+Nginx集群实现Session共享,Tomcat Session共享

优点:

无需修改任何代码。

缺点:

  1. 配置相对还是有一点繁琐,需要人为的去修改Tomcat的配置。
  2. 暂时此插件只支持tomcat7、tomcat8、tomcat9,对于tomcat有较大的依赖。

2. 使用Spring Session和redis管理session

Spring Session不依赖于Servlet容器,而是Web应用代码层面的实现,直接在已有项目基础上加入spring Session框架来实现Session统一存储在Redis中。如果你的Web应用是基于Spring框架开发的,只需要对现有项目进行少量配置,即可将一个单机版的Web应用改为一个分布式应用,由于不基于Servlet容器,所以可以随意将项目移植到其他容器。

优点:

  1. 如果web应用是基于spring框架开发的,那么只需简单配置,既可以修改为一个分布式应用。
  2. 不急于servlet容器,可以随意将项目移植到其他容器。

缺点:

需要修改代码。

具体可以参考:使用Spring Session和Redis解决分布式Session跨域共享问题


参考链接:

解决nginx负载均衡的session共享问题

java集群之session共享解决方案

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏数据和云

浅谈TimesTen内存数据库的结构

作者介绍 ? 朱亮 云和恩墨技术专家,6年专职oracle dba生涯先后服务于保险、金融、电信、百货等客户 Oracle TimesTen In-Memor...

42580
来自专栏Flutter&Dart

DartVM服务器开发(第八天)--http服务端框架

Aqueduct是一个HTTP Web服务器框架,用于构建用Dart编写的REST应用程序。

53340
来自专栏北京马哥教育

根分区伸缩实验

众所周知LVM是Linux环境下对 磁盘进行管理的一种机制。用户在安装Linux操作系统时,难以分配合适的硬盘空间,当一个分区存放不下某个文件时, 这个文件因...

31560
来自专栏LeoXu的博客

[转]RPM使用详解 来源:互联网 作者:佚名

在Linux 操作系统中,有一个系统软件包,它的功能类似于Windows里面的“添加/删除程序”,但是功能又比“添加/删除程序”强很多,它就是 Red Hat ...

8420
来自专栏幸山的专栏

精通yum配置以及问题解决

yum基于RPM包管理,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,提供了查找、安装、删除某一个、一组甚至全部软件包的命令,而且命令简洁...

1.1K00
来自专栏三丰SanFeng

分布式系统组件之配置中心

配置中心概述: 在分布式系统中,配置中心是一个基本的组件,它为散布在不同机器上的服务提供配置文件的通知,读取,更新服务,一般对配置中心的设计要点如下: 1) 配...

216100
来自专栏零基础使用Django2.0.1打造在线教育网站

利用Flask搭建微电影视频网站(四):后台页面搭建

努力与运动兼备~~~有任何问题可以加我好友或者关注微信公众号,欢迎交流,我们一起进步!

70910
来自专栏后端技术探索

nginx 缓存策略实现方案

由于本人工作原因,涉及到网络直播领域,其中视频的回放下载,涉及到了一些视频下载方面的技术。针对于一个完整视频的下载,目前市面上的主流做法是,先将整个视频流切片,...

45110
来自专栏编程坑太多

Maven学习笔记四(坐标和依赖)

14740
来自专栏韩伟的专栏

集群开源软件赏:ZooKeeper

本篇是开源软件最后一篇,接下来的一周将推送语言相关或项目管理相关内容。敬请期待。以下正文: 所谓集群系统,是指由多个进程和服务器合作组成完成一定功能的系统。之所...

45870

扫码关注云+社区

领取腾讯云代金券