专栏首页爱编码分布式Session

分布式Session

前言

分布式Session一致性?

说白了就是服务器集群Session共享的问题

Session的作用?

Session 是客户端与服务器通讯会话跟踪技术,服务器与客户端保持整个通讯的会话基本信息。

客户端在第一次访问服务端的时候,服务端会响应一个sessionId并且将它存入到本地cookie中,在之后的访问会将cookie中的sessionId放入到请求头中去访问服务器,如果通过这个sessionid没有找到对应的数据那么服务器会创建一个新的sessionid并且响应给客户端。

分布式Session存在的问题?

假设第一次访问服务A生成一个sessionid并且存入cookie中,第二次却访问服务B客户端会在cookie中读取sessionid加入到请求头中,如果在服务B通过sessionid没有找到对应的数据那么它创建一个新的并且将sessionid返回给客户端,这样并不能共享我们的Session无法达到我们想要的目的。

解决方案:

1)使用cookie来完成(很明显这种不安全的操作并不可靠)

2)使用Nginx中的ip绑定策略,同一个ip只能在指定的同一个机器访问(不支持负载均衡)

3)利用数据库同步session(效率不高)

4)使用tomcat内置的session同步(同步可能会产生延迟)

5)使用token代替session

6)我们使用spring-session以及集成好的解决方案,存放在redis中

解决方案

1.session复制

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

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

实现方式:

① 设置tomcat ,server.xml 开启tomcat集群功能

Address:填写本机ip即可,设置端口号,预防端口冲突。

② 在应用里增加信息:通知应用当前处于集群环境中,支持分布式 在web.xml中添加选项。

不足:

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

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

2. 客户端存储

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

缺点:

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

2)、session存储的数据大小受cookie限制

3. 反向代理hash一致性

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

实现方式:以Nginx为例,在upstream模块配置ip_hash属性即可实现粘性Session。

upstream mycluster{
#这里添加的是上面启动好的两台Tomcat服务器
  ip_hash;#粘性Session
   server 192.168.22.229:8080 weight=1;
   server 192.168.22.230:8080 weight=1;
}

不足:

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

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

4. 后端统一集中存储

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

本文分享自微信公众号 - 爱编码(ilovecode),作者:zero

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-10-22

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 番外篇:入门React

    原生js代码乱七八糟的时候,那就来体验一下React。 Tip:内容有点乱,秘籍在最后

    用户3467126
  • 《Yarn的使用教程》--- 大数据系列

    上图解析:ResourceManager和NodeManager设计源自于数据计算框架。ResourceManager主要负责资源调度,而NodeManager...

    用户3467126
  • SpringCloud之Hystrix

    在分布式环境中,许多服务依赖关系中的一些必然会失败。Hystrix是一个库,它通过添加延迟容忍和容错逻辑来帮助您控制这些分布式服务之间的交互。Hystrix通过...

    用户3467126
  • session一致性架构设计实践

    一、缘起 什么是session? 服务器为每个用户创建一个会话,存储用户的相关信息,以便多次请求能够定位到同一个上下文。 Web开发中,web-server可...

    架构师之路
  • 生产LVS负载均衡与keepalive的高可用实践

    VS/NAT模式(Network address translation) VS/TUN模式(tunneling) DR模式(Direct routing):常...

    晴天Online
  • truncate 引起 system lock 分析

    线程是被mysql_lock_tables()函数调用,并且此后该线程未更新过状态。

    MySQL轻松学
  • Mybatis注解开发使用二级缓存

    现在用注解只需要一步 @CacheNamespace(blocking = true)

    韦恩少爷的背
  • 写给Python开发者:机器学习十大必备技能

    有时候,作为一个数据科学家,我们常常忘记了初心。我们首先是一个开发者,然后才是研究人员,最后才可能是数学家。我们的首要职责是快速找到无 bug 的解决方案。

    AI科技大本营
  • 再见乱码:5 分钟读懂 MySQL 字符集设置

    作者: 程序猿小卡_casper 原文:https://segmentfault.com/a/1190000012775484 一、内容概述 在MySQL的使用...

    企鹅号小编
  • 一文了解web无状态会话token技术JWT

    目前web开发前后端已经算非常的普及了。前后端分离要求我们对用户会话状态要进行一个无状态处理。我们都知道通常管理用户会话是session。用户每次从服务器认证成...

    码农小胖哥

扫码关注云+社区

领取腾讯云代金券