分布式下Session一致性问题
一、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服务器来说,在同样的处理情况下,响应的结果输出越少,支持的并发请求就会越多。

三、参考:
分布式下Session一致性问题的更多相关文章
- 分布式下Session一致性架构举例
一.问题及方案 见这篇文章:分布式下Session一致性问题 二.分布式环境搭建: 系统环境 [root@centos7 ~]# cat /etc/redhat-release CentOS Linu ...
- nginx反向代理、负载均衡以及分布式下的session保持
[前言]部署服务器用到了nginx,相比较于apache并发能力更强,优点也比其多得多.虽然我的项目可能用不到这么多性能,还是部署一个流行的服务器吧! 此篇博文主要学习nginx(ingine x)的 ...
- 分布式架构中一致性解决方案——Zookeeper集群搭建
当我们的项目在不知不觉中做大了之后,各种问题就出来了,真jb头疼,比如性能,业务系统的并行计算的一致性协调问题,比如分布式架构的事务问题, 我们需要多台机器共同commit事务,经典的案例当然是银行转 ...
- 分布式session一致性问题
1.分布式session一致性 :指服务器集群情况下session共享的问题. 2.session的作用:保存服务器(tomcat)与客户端(浏览器)整个通讯的会话基本信息. 3.session应用场 ...
- 【Distributed】分布式Session一致性问题
一.概述 1.1 什么是Session 1.2 Session实现原理 1.3 Session常见问题 Session 保证在那里? 关闭浏览器Session会失效吗 服务器集群之后,Session产 ...
- 分布式下的session处理方式
分布式下的session处理方式 现在的企业级别开发下,分布式的问题是随处可见.今天我们来看看分布式情况下session的处理. 目前的处理方式有以下几种: 1.session黏性.就是说,用户在访问 ...
- session一致性架构设计
什么是session? 由于HTTP协议是无状态的协议,因此它不会去记住上一次浏览器访问服务器时的信息.同一个用户的两次操作,与两个不同用户的操作,对它来说是一样的. 这样虽然满足了互联网web应用的 ...
- 分布式系统session一致性的问题
session的概念 什么是session? 服务器为每个用户创建一个会话,存储用户的相关信息,以便多次请求能够定位到同一个上下文.这样,当用户在应用程序的 Web 页之间跳转时,存储在 Sessio ...
- session一致性架构设计实践.
一.缘起 什么是session? 服务器为每个用户创建一个会话,存储用户的相关信息,以便多次请求能够定位到同一个上下文. Web开发中,web-server可以自动为同一个浏览器的访问用户自动创建se ...
随机推荐
- 如何解决Ubuntu下的“E: Unable to correct problems, you have held broken packages.”的问题. aptitude
今天安装build-essential时出现了以下问题,这属于包的依赖. 解决方案: 1,sudo apt-get install aptitude:完成aptitude命令安装 2,sudo apt ...
- can总线第三讲
一 CAN控制器官方定义:CAN控制器用于将欲收发的信息(报文),转换为符合CAN规范的CAN帧,通过CAN收发器,在CAN-bus上交换信息.举个便于理解的例子:就像您发快递一样,要根据快递公司提 ...
- C++ | 智能指针初探
智能指针初探 在 c/c++ 语言中有一种特殊的类型--指针类型. 指针作为实体,是一个用来保存一个内存地址的计算机语言中的变量.它可以直接对内存地址中的数据进行操作,是一种非常灵活的变量.指针被誉为 ...
- python中PIL库的使用
API参考 打开dos窗口,安装库: pip install pillow 很明显,图片有点大,咱们缩略一下: from PIL import Image im = Image.open(" ...
- 四、PCB初始化设置
1.参数设置Setup-Design Parameters 2.显示设置 3.颜色设置(自定义) 4..栅格设置(走线层将25分为5等份)
- IOS中弹出键盘后出现fixed失效现象的解决方案
概述 这个问题常出现在移动web开发中聊天或者留言页面的绝对定位输入框上,页面超过屏幕大小时候输入框focus状态下(键盘弹出)绝对定位的元素失效,导致页面滚动时候把定位元素一并带走,体验十分不好,在 ...
- 微信小程序自定义tab,多层tab嵌套实现
小程序最近是越来越火了-- 做小程序有一段时间了,总结一下项目中遇到的问题及解决办法吧. 项目中有个多 tab 嵌套的需求,进入程序主界面下面有两个 tab,进入A模块后,A模块最底下又有多个tab, ...
- C#编写一个控制台应用程序,输入正方形边长或者半径,计算其周长和面积并输出
编写一个控制台应用程序,输入正方形边长或者半径,计算其周长和面积并输出 (1) 编写两个接口,接口 IShape 包含三个方法:initialize, getPerimeter, getArea.分别 ...
- Hadoop搭建高可用的HA集群
一.工具准备 1.7台虚拟机(至少需要3台),本次搭建以7台为例,配好ip,关闭防火墙,修改主机名和IP的映射关系(/etc/hosts),关闭防火墙 2.安装JDK,配置环境变量 二.集群规划: 集 ...
- 跳转到下一页面时,必须先勾选阅读xx须知/协议才可跳转功能
当跳转到新的html页面时,先判断checkbox是否选中,选中-->跳转到新页面:未选中--弹出提示消息(请先同意须知) HTML: 1 <div class="choose& ...