分布式下Session一致性问题

摘要:
②如果存储session的机器或集群发生问题,就会影响到应用。当集群规模较大时,session数较多时,该方案可以考虑。

一、Session一致性问题

1.1 什么是Session

用户使用网站的服务,基本上需要浏览器和web服务器进行多次交互,web服务器如何知道哪些请求是来自哪个会话的?

具体方式为:在会话开始时,分配一个唯一的会话标识(sessionId),通过cookie把这个标识告诉浏览器,以后每次请求的时候,浏览器都会带上这个会话标识来告诉web服务器请求是属于哪个会话的。如果遇到禁用cookie的情况,一般的做法就是把这个会话标识放到url的参数中。

分布式下Session一致性问题第1张

1.2 什么是Session一致性问题

因为会话信息保存在单机上,当我们的应用服务器从一台变成两台后,我们就会遇到session的问题了!

如下图所示,当我们第一次访问网站时请求落到了左边的服务器,那么我的session就创建在左边的服务器上了,如果我们不做处理,就不能保证接下来的请求每次都落在同一边的服务器上了,这就是session问题。

分布式下Session一致性问题第2张

二、解决方案

start nginx

nginx -s stop
nginx -s reload

以下方案都是解决session问题的方案,对于大型网站来说,session sticky和session集中管理是比较好的方案。

2.1 session sticky

session sticky

http://blog.csdn.net/tomcat_baby/article/details/52787679

http://blog.csdn.net/yangbutao/article/details/12971037

在web服务器变成多台后,如果我们可以保证同一个会话请求都能在同一个web服务器上处理,那么对于这个会话个体来说,和单机的情况是一样的。这就需要负载均衡器能够根据每次请求的会话标识来进行请求转发。

有何问题:

① 如果有一台web服务器宕机或重启,那么这台机器上的会话数据会丢失

② 负载均衡器变成了一个有状态的结点,要保存会话到具体web服务器的映射,要消耗一定的内存。

分布式下Session一致性问题第3张

实现:

基于nginx的ip_hash策略来做负载均衡,根据ip做hash计算,同一个ip的请求始终会定位到同一台tomcat,这样做的好处是对应用无侵入,可以水平扩展

2.2 session replication

web服务器之间增加了会话数据的同步,通过同步就保证了不同web服务器之间的session数据一致,一般的应用容器都支持这种方式。

问题:

① 只要session数据有变化,就需要将数据同步到其他机器上,会带来一定的网络带宽开销

② 每台web服务器都要保存所有的session数据,如果整个集群session数很多的话,对内存资源消耗较大。

该方案不适合集群机器较多的场景。

分布式下Session一致性问题第4张

实现:

服务器Session复制,Tomcat服务器创建Session后,会通过组播方式把session发送到组播

2.3 session数据集中存储

把session数据集中存储起来,然后不同的web服务器从相同的地方来获取session,存储session数据的方式可以为数据库,也可以使用其他分布式存储系统。

问题:

① 获取session存在延时和不稳定性,不过我们的通信基本在内网,问题不大。

② 如果存储session的机器或集群发生问题,就会影响到应用。

当集群规模较大时,session数较多时,该方案可以考虑。

分布式下Session一致性问题第5张

实现:Session不由tomcat管理,而是统一放到一个地方集中式管理,读取和写入Session都依赖第三方软件。例如redis,mongodb,mysql等

2.4 cookie based

该方案通过cookie来传递session数据,即把session数据存在cookie中

问题:

① cookie有长度限制,这也就会限制session数据的长度

② 安全性,cookie的数据保存在客户端,这就存在安全性的问题,我们需要对写入cookie的session数据做加密处理

③ 带宽消耗, 客户端每次都要带着session过来,会消耗一定网络资源

④ 性能影响,每次http请求和响应都带有session数据,对web服务器来说,在同样的处理情况下,响应的结果输出越少,支持的并发请求就会越多。

分布式下Session一致性问题第6张

三、参考:

免责声明:文章转载自《分布式下Session一致性问题》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇【oracle】cursor 概念,cursor经典例子[nginx] nginx源码分析--健康检查模块锁分析下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

spring security xml配置详解

security 3.x <?xml version="1.0" encoding="UTF-8"?> <beans:beans xmlns="http://www.springframework.org/schema/security"xmlns:beans="http://www.springframework.org/schem...

Hibernate的批量处理

  Hibernate完全以面向对象的方式操作数据库,当程序员以面向对象的方式操作持久化对象时,将自动转换为对数据的操作。例如我们Session的delete()方法,来删除持久化对象,Hibernate将负责删除对应的数据记录;当我们执行持久化对象的setter方法时,Hibernate将自动转换为底层的update语句,修改数据库的对应记录。   问题...

解决cookie跨域访问

一、前言   随着项目模块越来越多,很多模块现在都是独立部署。模块之间的交流有时可能会通过cookie来完成。比如说门户和应用,分别部署在不同的机器或者web容器中,假如用户登陆之后会在浏览器客户端写入cookie(记录着用户上下文信息),应用想要获取门户下的cookie,这就产生了cookie跨域的问题。   二、介绍一下cookie   cookie ...

[转载]Yahoo!的分布式数据平台PNUTS简介及感悟

转载自:http://timyang.net/architecture/yahoo-pnuts/ 在分布式领域有个CAP理论(Brewer’s CAP Theorem) ,是说Consistency(一致性), Availability(可用性), Partition tolerance(分布) 三部分在系统实现只可同时满足二点,没法三者兼顾。所以架构设计...

Java中Cookie常用操作类(Spring中操作Cookie)

说明:Cookie下用Key取值没有快速的方法,只能便利循环去取。 技巧:置0则cookie会立即删除,设置-1,负值则会在关闭浏览器后删除。切记一定要增加路径:setPath("/"),不然不会生效。在获取Cookie时要看下是否设置了域名:setDomain,不然本地调试时获取不到。 Cookie 的限制: 大多数浏览器支持最大为4096字节(4KB)...

运维与自动化系列③自动化部署基础与shell脚本实现

自动化部署基础与shell脚本实现 关于自动化的基础知识: 1.1:当前代码部署的实现方式: 运维纯手工scp到web服务器纯手工登录git服务器执行git pull或svn服务器执行svn update更新代码通过xftp上传代码开发打压缩包上传到服务器然后解压 缺点:1.需要运维全程参与,占用大量的工作时间2.上线时间比较慢3.人为造成的失误较多,管理...