• 分布式集群下的Session存储方式窥探


    传统的应用服务器,自身实现的session管理是大多是基于单机的,对于大型分布式网站来说,支撑其业务的远远不止一台服务器,而是一个分布式集群,请求在不同的服务器之间跳转。那么,如何保持服务器之前的session同步呢?

    分布式环境下,如果一次请求被负载均衡分配到了服务器A,如果按照一般的方式存储session,在A的本地会存储session,如果此次会话没有结束,下一次的请求被负载均衡到了B服务器(或者其他的非A服务器)那么上次的请求的session信息将不再存在。如果不做任何处理的话,用户将出现频繁登录的现象。所以分布式环境下session的存储显得格外重要。

    那么有哪些方法可以做到分布式环境下的session存储呢?

    <1>持久化

    可以将session的存储放在数据库中,进行持久化,每台服务器要使用session的时候,可以同时向数据库中去存取,这样可以保证当服务器宕机的时候,可以保持数据不容易丢失;

    但是缺点也很明显,整个系统的吞吐量下降。

    <2>粘性session(Sticky Session在实现上可以用Nginx的ip_hash机制)

    原理:粘性session 是指将一个请求绑定到固定的服务器上,正如上面所说,如果设置了粘性session,负载均衡将请求转发到了服务器A上,此用户以后的每一次请求都会转发到服务器A上,相当于用户和服务器黏在一起了。

    优点:实现很简单,不需要对session做处理。

    缺点:不是高可用的,如果当前访问的宕机了,请求会转发到其他的服务器,当前请求的session信息将会失效。适合用在故障对用户的的影响较小的场景下。

    <3>session复制

    原理:任何一个服务器上的session发生变化,该节点会把这个 session的所有内容序列化,然后广播给所有其它节点,不管其他服务器需不需要session,以此来保证Session同步。

    优点:可容错,各个服务器之间session能够实时响应;

    缺点:网络负荷会有一定的压力(可能会堵塞,拖慢服务器)。

    <4>session缓存

    不管是memcache还是redis要以集群的方式来提供session服务。并且memcache和redis的快速访问具有很大的优势,可以提供较高的读写性能,这一点对并发量大的系统来说很重要。从安全性来考虑,session时候过期时间的,利用缓存存储可以利用缓存的失效机制。

  • 相关阅读:
    Azure虚拟机部署Linux+PHP+Swoole
    [经验分享]OBS 如何实现多路推流
    SQL Server 中的登陆用户如何只看到指定的数据库
    NCF 数据库错位导致站点访问不了
    AutoIT+Selenium的使用
    2019年入职体检那些事
    Jmeter 针对工具类的每个方法进行测试
    Effective Jmeter:记录一些场景下有效的解决方案
    通过 Test Fragment + Module Controller 封装登录接口
    在setUp线程组中初始化全局工具类
  • 原文地址:https://www.cnblogs.com/feiyafeiblog/p/6919051.html
Copyright © 2020-2023  润新知