应用服务器集群的Session管理1 Session 复制2 Session绑定(黏滞sticky)3 利用Cookie 记录Session4 Session服务器

应用服务器的高可用架构设计主要基于服务无状态这一特性,但是事实上,业务总 是有状态的,

  • 在交易类的电子商务网站,需要有购物车记录用户的购买信息,用户每次 购买请求都是向购物车中增加商品
  • 在社交类的网站中,需要记录用户的当前登录状态、最新发布的消息及好友状态等,用户每次刷新页面都需要更新这些信息

Web 应用中将这些多次请求修改使用的上下文对象称作会话(Session) 单机情况下,Session 可由部署在服务器上的Web 容器( 如Tomcat) 管理 在使用负载均衡的集群环境中,由于负载均衡服务器可能会将请求分发到集群中的任何一台应用服务器上,所以保证每次请求依然能够获得正确的Session比单机时要复杂很多

集群环境下,Session 管理主要有以下几种手段

1 Session 复制

Session 复制是早期系统使用的一种服务器集群Session管理机制 应用服务器开启Web 容器的Session复制功能,在集群中的几台服务器之间同步Session对象, 使得每台服务器上都保存所有用户的Session信息,这样任何一台机器宕机都不会导致 Session 数据的丢失,而服务器使用Session 时,也只需要在本机获取即可

使用Session复制实现应用服务器共享Session

1.1 优点

虽然简单,从本机读取Session信息也很快速,但只能使用在集群规模比较小的情况下

1.2 缺点

  • 当集群规模较大时,集群服务器间需要大量的通信进行Session复制,占用服务器和网络的大量资源,系统不堪负担
  • 而且由于所有用户的Session信息在每台服务器上都有备份,在大量用户访问的情况下,甚至会出现服务器内存不够Session使用的情况
  • 而大型网站的核心应用集群就是数千台服务器,同时在线用户可达千万,因此并不适用这种方案

2 Session绑定(黏滞sticky)

可以利用负载均衡的源地址Hash算法实现

负载均衡服务器总是将来源于同一IP的请求分发到同一台服务器上(也可以根据Cookie信息将同一个户的请求总是分发到同一台服务器上,当然这时负载均衡服务器必须工作在HTTP 协议层) 这样在整个会话期间,用户所有的请求都在同一台服务器上处理,即Session绑定在某台特定服务器上,保证Session总能在这台服务器上获取

利用负载均衡的会话黏滞机制将请求绑定到特定服务器

但是Session绑定的方案显然不符合我们对系统高可用的需求

缺点

一旦某台服务器宕机,那么该机器上的Session也就不复存在了,用户请求切换到其他机器后因为没有Session而无法完成业务处理

因此虽然大部分负载均衡服务器都提供源地址负载均衡算法,但很少有网站利用这个算法进行Session管理

3 利用Cookie 记录Session

早期系统使用C/S架构,一种管理Session的方式是将Session记录在客户端,每次请求服务器的时候,将Session放在请求中发送给服务器,服务器处理完请求后再将修改过的Session响应给客户端 如今的B/S架构,网站没有客户端,但是可以利用刘览器支持的Cookie记录Session

利用Cookie 记录Session信息

3.1 缺点

  • 受Cookie大小限制,能记录的信息有限
  • 每次请求响应都需要传输Cookie,影响性能
  • 如果用户关闭Cookie,访问就会不正常

但是

3.2 优点

由于Cookie的

  • 简单易用
  • 可用性高
  • 支持应用服务器的线性伸缩
  • 而大部分应用需要记录的Session 信息又比较小

因此事实上,许多网站都或多或少地使用Cookie记录Session。

4 Session服务器

那么有没有可用性高、伸缩性好、性能也不错,对信息大小又没有限制的服务器集群Session管理方案呢?

答案就是Session服务器!利用独立部署的Session服务器(集群)统一管理Session,应用服务器每次读写Session时,都访问Session服务器

利用Session服务器共享Session

这种方案事实上是将应服务器的状态分离,分为

  • 无状态的应用服务器
  • 有状态的Session服务器

然后针对这两种服务器的不同特性分别设计其架构

对于有状态的Session服务器,一种比较简单的方法是利用

  • 分布式缓存 即使用cacheDB存取session信息,应用服务器接受新请求将session信息保存在cache DB中,当应用服务器发生故障时,web服务器会遍历寻找可用节点,分发请求,当应用服务器发现session不在本机内存时,则去cache DB中查找,如果找到则复制到本机,这样实现session共享和高可用。
  • 数据库等

在这些产品的基础上进行包装,使其符合Session 的存储和访问要求。如果业务场景对Session 管理有比较高的要求,比如利用Session 服务集成单点登录(SSO)、用户服务等功能,则需要开发专门的Session服务管理平台。

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏ml

javaSE基础之记事本编程

     首先安装好jdk和jre,之后进行如下操作:           1. 将代码记事本----》cmd--->javac 文件名.java ----->...

3147
来自专栏彭湖湾的编程世界

【npm】利用npm安装/删除/发布/更新/撤销发布包

什么是npmnpm是javascript的包管理工具,是前端模块化下的一个标志性产物 简单地地说,就是通过npm下载模块,复用已有的代码,提高工作效率 1.从社...

5928
来自专栏cyhone的专栏

重新理解IO模型

本文试图理清楚几种IO模型的根本性区别,同时分析了为什么在Linux网络编程中最好要用非阻塞式IO?

6127
来自专栏韩伟的专栏

高性能服务器架构思路( 五 ) : 分布式缓存

在高性能的服务器架构中,常用的缓存和分布两种策略,往往是结合到一起使用的。只有清楚的理解这些技术的原理,并且和实际的业务场景结合起来,才能真正的做出满足应用要求...

3.7K0
来自专栏企鹅号快讯

某CMS注入分析及注入点总结

Bluecms是一个地方网站的开源的cms,在很多地方性的网站上应用还是不少的,今天在逛seebug的时候看到了一个漏洞的公告。 ? 有公告但是这里还没有详情,...

2129
来自专栏酷玩时刻

H5仿微信支付键盘

视频地址:https://github.com/Javen205/IJPay-Demo/blob/master/doc/pay_keyboard.m4v

1452
来自专栏数据和云

故障诊断 | 存储Cache丢失导致数据库无法open的案例分享

当存储Cache由于丢失时,我们应该如何处理,让数据库重新能够open起来呢?让我们听听,云和恩墨 ACE 李真旭分享的这篇案例。 发现问题 最近某客户的一套核...

3508
来自专栏java相关

java中缓存分类总结

在平时的开发中会经常用到缓存,比如locache、redis等,但一直没有对缓存有过比较全面的总结。下面从什么是缓存、为什么使用缓存、缓存的分类以及对每种缓存的...

5302
来自专栏marsggbo

coursera 视频总是缓冲或者无法观看的解决办法

注意!!!该方法针对Windows用户,亲测有效。 1.用管理员权限记事本打开host文件 2.将如下内容复制到文件末尾 52.84.246.90 ...

2345
来自专栏老安的博客

docker 容积硬盘扩容小坑一个

1373

扫码关注云+社区

领取腾讯云代金券