分布式系统Session一致性问题

标签: Session 分布式
17人阅读 评论(0) 收藏 举报
分类:

转载地址:https://www.cnblogs.com/study-everyday/p/7853145.html


session的概念

什么是session?

服务器为每个用户创建一个会话,存储用户的相关信息,以便多次请求能够定位到同一个上下文。这样,当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的 Web 页时,如果该用户还没有会话,则 Web 服务器将自动创建一个 Session 对象。当会话过期或被放弃后,服务器将终止该会话。

Web开发中,web-server可以自动为同一个浏览器的访问用户自动创建session,提供数据存储功能。最常见的,会把用户的登录信息、用户信息存储在session中,以保持登录状态。

什么是session一致性问题?

只要用户不重启浏览器,每次http短连接请求,理论上服务端都能定位到session,保持会话。

分布式session

单服务器web应用中,session信息只需存在该服务器中,这是我们前几年最常接触的方式,但是近几年随着分布式系统的流行,单系统已经不能满足日益增长的百万级用户的需求,集群方式部署服务器已在很多公司运用起来,当高并发量的请求到达服务端的时候通过负载均衡的方式分发到集群中的某个服务器,这样就有可能导致同一个用户的多次请求被分发到集群的不同服务器上,就会出现取不到session数据的情况,于是session的共享就成了一个问题。

如上图,假设用户包含登录信息的session都记录在第一台web-server上,反向代理如果将请求路由到另一台web-server上,可能就找不到相关信息,而导致用户需要重新登录。

Session一致性解决方案

1.session复制(同步)

 

思路:多个web-server之间相互同步session,这样每个web-server之间都包含全部的session

优点:web-server支持的功能,应用程序不需要修改代码

不足

  • session的同步需要数据传输,占内网带宽,有时延

  • 所有web-server都包含所有session数据,数据量受内存限制,无法水平扩展

  • 有更多web-server时要歇菜

 

2.客户端存储法 

思路:服务端存储所有用户的session,内存占用较大,可以将session存储到浏览器cookie中,每个端只要存储一个用户的数据了

优点:服务端不需要存储

缺点

  • 每次http请求都携带session,占外网带宽

  • 数据存储在端上,并在网络传输,存在泄漏、篡改、窃取等安全隐患

  • session存储的数据大小受cookie限制

“端存储”的方案虽然不常用,但确实是一种思路。

 

3.反向代理hash一致性

 思路:web-server为了保证高可用,有多台冗余,反向代理层能不能做一些事情,让同一个用户的请求保证落在一台web-server上呢?

 

 

方案一:四层代理hash

反向代理层使用用户ip来做hash,以保证同一个ip的请求落在同一个web-server上

 

方案二:七层代理hash

反向代理使用http协议中的某些业务属性来做hash,例如sid,city_id,user_id等,能够更加灵活的实施hash策略,以保证同一个浏览器用户的请求落在同一个web-server上

优点

  • 只需要改nginx配置,不需要修改应用代码

  • 负载均衡,只要hash属性是均匀的,多台web-server的负载是均衡的

  • 可以支持web-server水平扩展(session同步法是不行的,受内存限制)

不足

  • 如果web-server重启,一部分session会丢失,产生业务影响,例如部分用户重新登录

  • 如果web-server水平扩展,rehash后session重新分布,也会有一部分用户路由不到正确的session

session一般是有有效期的,所有不足中的两点,可以认为等同于部分session失效,一般问题不大。

对于四层hash还是七层hash,个人推荐前者:让专业的软件做专业的事情,反向代理就负责转发,尽量不要引入应用层业务属性,除非不得不这么做(例如,有时候多机房多活需要按照业务属性路由到不同机房的web-server)。

 

4.后端统一集中存储

 

思路:将session存储在web-server后端的存储层,数据库或者缓存

优点

  • 没有安全隐患

  • 可以水平扩展,数据库/缓存水平切分即可

  • web-server重启或者扩容都不会有session丢失

不足:增加了一次网络调用,并且需要修改应用代码

对于db存储还是cache,个人推荐后者:session读取的频率会很高,数据库压力会比较大。如果有session高可用需求,cache可以做高可用,但大部分情况下session可以丢失,一般也不需要考虑高可用。

 

总结

保证session一致性的架构设计常见方法:

  • session同步法:多台web-server相互同步数据

  • 客户端存储法:一个用户只存储自己的数据

  • 反向代理hash一致性:四层hash和七层hash都可以做,保证一个用户的请求落在一台web-server上

  • 后端统一存储:web-server重启和扩容,session也不会丢失

 

对于方案3和方案4,个人建议推荐后者:

  • web层、service层无状态是大规模分布式系统设计原则之一,session属于状态,不宜放在web层

  • 让专业的软件做专业的事情,web-server存session?还是让cache去做这样的事情吧。


查看评论

《彻底解决分布式系统一致性问题》学习笔记

《彻底解决分布式系统一致性问题》直播者:李艳鹏 笔记作者:JKXQJ一致性问题产生的背景JEE架构:WEB容器—组合业务逻辑—>EJB容器—数据存ORM—>数据库 SSH架构:Struts ...
  • acmjk
  • acmjk
  • 2017-07-11 00:39:55
  • 502

分布式以客户为中心的一致性

分布式应用中的典型场景(一)在一个web的分布式系统中,Web页面的更新通常是由某一个单一的授权机构Web管理员进行更新的。因此,不存在多个进程同时更新的写-写冲突。大部分的操作都是浏览器读取这个页面...
  • ai_xiangjuan
  • ai_xiangjuan
  • 2017-09-21 23:20:29
  • 87

分布式系统的数据一致性问题

第二个是分布式系统的数据一致性问题。这里我采用的是大多数互联网公司所用的基于消息的最终一致性。可以使用Spring做到消息发送与本地事务结合(这点很重要)。Spring cloud专门提供了一个框架叫...
  • wssjdysf1
  • wssjdysf1
  • 2017-11-09 17:47:00
  • 71

分布式系统一致性问题和一致性算法

一致性问题 一致性算法是用来解决一致性问题的,那么什么是一致性问题呢? 在分布式系统中,一致性问题(consensus problem)是指对于一组服务器,给定一组操作,我们需要一个协议使得最后...
  • lucky_greenegg
  • lucky_greenegg
  • 2016-09-23 22:41:41
  • 3436

集群session一致性和同步问题

一. 何为session 用户使用网站的服务,基本上需要浏览器和web服务器进行多次交互,web服务器如何知道哪些请求是来自哪个会话的? 具体方式为:在会话开始时,分配一个唯一的会话标识(...
  • kk936321732
  • kk936321732
  • 2015-05-04 18:06:18
  • 4121

如何解决分布式系统数据事务一致性问题

用户在京东上下了一个订单,发现自己在京东的账户里面有余额,然后使用余额支付,支付成功之后,订单状态修改为支付成功,然后通知仓库发货。假设订单系统,支付系统,仓库系统是三个独立的应用,是独立部署的,系统...
  • babyshy
  • babyshy
  • 2016-12-06 23:46:10
  • 523

分布式一致性与复制-01

本文是对《分布式原理与范型》的读书笔记。 1、数据复制的好处 分布式系统中数据的复制是为了提高系统的   可靠性、性能。 实现数据复制的难点:保持各个副本间的一致性。 首先:数据复制可以提高系...
  • huangwei19892008
  • huangwei19892008
  • 2013-06-01 13:28:46
  • 1994

分布式理论:关于一致性讨论

一、回顾分布式特点    1.集中式特点       一台或多台计算机组成中心接节点,所有的数据都存在中心节点上。Client端只负责数据的展示,Server处理数据的存储和处理。显而易见,优点是...
  • Weiguang_123
  • Weiguang_123
  • 2016-07-31 14:34:58
  • 2200

架构文摘:分布式系统Session一致性问题解析

一、问题的提出 1. 什么是Session? 用户使用网站的服务,需要使用浏览器与Web服务器进行多次交互。HTTP协议本身是无状态的,需要基于HTTP协议支持会话状态(Session Sta...
  • zhaobryant
  • zhaobryant
  • 2018-03-20 19:05:30
  • 24

区块链技术指南之分布式系统核心问题

区块链技术指南之分布式系统核心问题 万法皆空,因果不空。 随着摩尔定律碰到瓶颈,越来越多的系统要依靠分布式集群架构来实现海量数据处理和可扩展计算能力。 区...
  • huangshulang1234
  • huangshulang1234
  • 2018-01-16 09:39:22
  • 634
    个人资料
    专栏达人 持之以恒
    等级:
    访问量: 67万+
    积分: 8913
    排名: 2694
    博客专栏
    最新评论