• 分布式系统session一致性问题


    一、引言

    1.什么是session

    Session 是服务器用来保存用户操作的一系列会话信息,由Web容器进行管理。最常见的,会把用户的登录信息、用户信息存储在 session 中,以保持登录状态。

    2.session的创建

    在会话开始时,分配一个唯一的会话标识 SessionID(sessionid 是一个会话的key,浏览器第一次访问服务器会在服务器端生成一个 session,

    有一个 sessionId 和它对应。),并通过 Cookie 将这个标识告诉浏览器(客户端会将 sessionID 保存在 cookie 中。),

    以后每次请求的时候,浏览器都会带上这个会话标识SessionID来告诉Web服务器这个请求是属于哪个会话的。

    在Web服务器上,各个会话都有独立的存储,保存不同会话的信息。如果遇到禁用Cookie的情况,

    一般的做法就是把这个会话标识放到URL的参数中。

    3.session共享

    分布式情况下,如果每台服务器都session存在自己的内存中,不同服务器之间就会造成数据不一致问题,

    这时候就需要session共享。单机情况下,不存在Session共享的情况。分布式情况下,

    如果不进行Session共享会出现数据不一致,比如:会导致请求落到不同服务器要重复登录的情况。

    二、解决方案

    1.session复制

     应用服务器开启web容器的session复制功能,在集群中的几台服务器之间同步session对象,

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

    不足:

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

    • 有更多web-server时,容易造成网络风暴

    2. 客户端存储

    将session存储到浏览器cookie中。每次请求服务器的时候,将session放在请求中发送给服务器,服务器处理完请求后再将修改后的session响应给客户端。

    缺点:

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

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

    3. 反向代理hash一致性

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

    不足:

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

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

    4. 后端统一集中存储

    将session存储在web-server后端的存储层,数据库或者缓存,一般用redis/memchache缓存。

  • 相关阅读:
    phpcms相关
    php文件缓存
    js 、jq强化复习
    框架替换主页
    羽恒梦工厂所有后台的操作页面
    羽恒梦工厂个人中心
    羽恒梦工厂详情页
    待查的问题
    ASP.NET中的常用快捷键
    快速排序
  • 原文地址:https://www.cnblogs.com/yumingxing/p/9505512.html
Copyright © 2020-2023  润新知