文档章节

分布式下Session一致性问题

yysue
 yysue
发布于 2018/02/27 22:56
字数 1145
阅读 120
收藏 22

一、Session一致性问题

1.1 什么是Session

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

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

1.2 什么是Session一致性问题

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

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

二、解决方案

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服务器的映射,要消耗一定的内存。

实现:

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

2.2 session replication

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

问题:

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

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

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

实现:

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

2.3 session数据集中存储

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

问题:

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

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

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

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

2.4 cookie based

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

问题:

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

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

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

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

三、参考:

© 著作权归作者所有

上一篇: Java日志
yysue
粉丝 28
博文 273
码字总数 157915
作品 0
济南
程序员
私信 提问
SpringSession:分布式 session 实现方案及 SpringSession 功能分析

上一篇文章 SpringSession:集成SpringBoot 中介绍了如何在中来集成 ,整个过程非常简单,同时也简单分析了下的作用原理。继上一篇实践之后,本文主要来分析 的原理。 1、从 session 的一致性...

glmapper
2018/11/24
0
0
分布式web架构中Session管理的方法

分布式架构 单体架构中,Session管理方案是在用户进行登录的时候将Session存放在应用服务器的内存中,由于只有一个应用服务器节点,用户的所有请求都是这个唯一节点进行响应处理,所以能够轻...

刘诗书
2017/11/23
0
0
搞懂分布式技术11:分布式session解决方案与一致性hash

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/a724888/article/details/80783989 session一致性架构设计实践 原创: 58沈剑 架构师之路 2017-05-18 一、缘起...

你的猫大哥
2018/06/23
0
0
分布式session一致性问题

转载自 :https://www.cnblogs.com/study-everyday/p/7853145.html session的概念 什么是session? 服务器为每个用户创建一个会话,存储用户的相关信息,以便多次请求能够定位到同一个上下文...

zengqiang1
2018/03/29
0
0
Chubby的锁服务

最近在完成Zeppelin的中心节点重构的过程中,反思了我们对分布式锁的实现和使用。因此重读了Chubby论文The Chubby lock service for loosely-coupled distributed systems,收益良多的同时也...

CatKang
2017/10/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

golang 不同mysql 连接库对比

待续

caucy
1分钟前
1
0
PHP JsonWebToken的实现

废话不多说,上码(thinkphp环境) <?phpnamespace app\index\controller;class Jwt{ /** * @var array jwt头部 */ private static $header = [ //生成signatu......

yehua11
6分钟前
1
0
gitlab docker Web界面打开反应迟钝的解决办法

参考:https://blog.csdn.net/happyfreeangel/article/details/88653846 解决办法: 修改gitlab的配置文件:gitlab.rb 位置在容器中的/etc/gitlab/config 使用容器时必须挂载到外面的存储,要...

bapleliu
6分钟前
1
0
AJAX 请求 浏览器F12 看不到返回值

最近在某某高校上线AA系统之后对于某一个接口,有的时候可以界面可以正常渲染并展示正确的数据,偶尔不行。 前端开发人员打开浏览F12,指着屏幕说,AJAX请求了没有返回呀,这个要后端看看到底...

特拉仔
11分钟前
1
0
好程序员Java学习路线分享JVM类加载机制

好程序员Jav学习路线分享JVM类加载机制JVM相关概念 - jdk<br> jdk(Java Development Kit)Java开发包,是Java开发人员用于编译和调试程序的一套程序的集合。 - jre<br> jre(Java Runtime ...

好程序员官方
14分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部