美文网首页
分布式系统session共享

分布式系统session共享

作者: 起猿日 | 来源:发表于2018-12-06 16:25 被阅读0次

    1.session 的几个问题

    问题1:tomcat中的session保存的位置

    存在tomcat的本地ConcurrentHashMap(本地缓存),以sessionId为key

    问题2:tomcat如何追踪当前请求属于哪个session

    通过cookice:产生会话时向浏览器发送存有sessionId的cookice,后续请求都带上这个cookice。

    问题3:session是不是用户登录时候产生的?

    不是。两种方式:(1)访问JSP时候默认产生,因为JSP的九大内置对象中有session对象。(2)当后台通过HttpSession session= request.getSession() 创建时才产生。

    【问题】:当服务器无法扛起快速增长的用户访问量时怎么办?

    1.更换更好的服务器
    2.用多台服务器一起服务

    【问题】:从架构师的角度如何考量以上方法?

    1.成本 高性能or普通服务器
    2.性能
    3.可用性
    4.扩展性

    什么是集群?

    多台服务器一起来完成同一项繁重就是集群,每台机子都做同样的工作无差别。

    2.反向代理-负载均衡

    代理的职责:

    接收用户请求,再均衡地分发给集群中的机器,拥有强大的并发负载能力。

    负载均衡选择

    硬的:常见的NetScaler、F5、RadWare和Array
    评价:价格贵但提供高可用性和高稳定性
    软的:流行的有LVS、haproxy、nginx
    评价:开源软件,成本低

    ----Nginx----

    轻量级Web服务器/反向代理服务器及电子邮件代理服务器。

    特点
    1.占内存少,并发能力强
    2.模块化组件,可扩展性强
    3.跨平台,linux下性能更优异
    适用场景
    1.静态HTTP服务器
    2.正/反向代理服务器
    3.负载均衡
    4.虚拟主机
    5.电子邮件代理
    6.目录保护和访问限制
    7.防盗链
    8.下载限速
    9.web缓存
    10.请求转发

    负责均衡策略

    轮询:轮流访问每台必访问


    weight权重:

    ip_hash:
    轮询方式上加:ip_hash
    该策略是指一个客户端只访问特定一台服务器,原理是根据客户端ip做哈希值再取模结果当做数组下标值接着找到对应服务器。

    什么是正向代理?

    个人PC请求代理服务器(校园网、vpn)

    什么是反向代理?

    将请求分发给多个后台服务器的其中一台。

    3.session一致性问题解决方案

    Session丢失问题原因:Nginx将请求分配到无session的机器造成状态的不一致。

    解决方案

    ip_hash负载均衡策略 :

    做法:修改Nginx配置文件 upstream 内加 ip_hash
    优点:仅修改Nginx配置;对代码无入侵不需要改代码;只要hash属性是均匀的,多台server的负载是均衡的;便于水平扩展;安全性高
    缺点:服务器重启造成部分session丢失;单点负载高的风险

    服务器session复制

    多台服务器的session相互同步;
    做法:1.修改Tomcat server.xml中的Cluster节点;2.修改应用web.xml,增加节点:<distributable/>
    优点:代码无入侵;适应各种负载均衡策略;服务器重启session不丢失;安全性高
    缺点:session同步有延迟;占用网络带宽;序列化与反序列化消耗CPU性能
    该方式的原理
    单播 组播 广播

    session统一缓存

    思路:
    1.平时用的session都是通过request获取的,业务代码只是用session对象不管存取
    2.想办法把tomcat生成的request替换为我们自己写的request,再提供给业务代码使用,在我们的request中替换session的生产、存、取、失效操作。
    3.如何替换? -- Filter 拦截器
    4.缓存数据库-------redis

    使用redis作为统一缓存的做法:

    1.增加redis client和spring session的依赖
    2.修改web.xml 增加filter: springSessionRFilter;
    3.修改spring配置文件,在容器中注入spring session 和redis相关的bean

    相关文章

      网友评论

          本文标题:分布式系统session共享

          本文链接:https://www.haomeiwen.com/subject/dxyqcqtx.html