美文网首页
分布式Session

分布式Session

作者: 隔壁老王的隔壁啊 | 来源:发表于2018-09-09 19:02 被阅读9次

    一、session

    在单机下,session由部署在服务器上的web容器管理;但是在分布式环境中,负载均衡下将请求随机分发到集群中到任何一个服务器上,此时获取正确到session就比较复杂.

    1、session复制

    session复制是集群中的服务器之间同步session对象,每台服务器都保存session信息,这样保证了session都高可用;但这只是和集群比较小都情况,当集群比较大当时候,session复制就会消耗更大当资源,甚至会导致内存资源不够.

    <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="8">
        <Manager className="org.apache.catalina.ha.session.DeltaManager" expireSessionsOnShutdown="false" notifyListenersOnReplication="true" />
        <Channel className="org.apache.catalina.tribes.group.GroupChannel">
            <Membership className="org.apache.catalina.tribes.membership.McastService" address="228.0.0.4" 
                        port="45564" frequency="500" dropTime="3000" />
            <!-- 这里如果启动出现异常,则可以尝试把address中的"auto"改为"localhost" -->
            <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver" address="auto" port="4000" 
                      autoBind="100" selectorTimeout="5000" maxThreads="6" />
            <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
                <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender" />
            </Sender>
            <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector" />
            <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatchInterceptor" />
        </Channel>
        <Valve className="org.apache.catalina.ha.tcp.ReplicationValve" filter="" />
        <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve" />
        <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer" tempDir="/tmp/war-temp/" 
                  deployDir="/tmp/war-deploy/" watchDir="/tmp/war-listen/" watchEnabled="false" />
        <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener" />
    </Cluster>
    
    

    缺点: 当服务器数比较多的情况下会导致性能降低,不适合服务器比较多的集群.

    2、session绑定

    session绑定指定是利用负载均衡的源地址hash算法将源于同一IP的请求分发到同一台服务器上,这样整个会话期间用户的所有请求在同一台服务器上处理.主要实现方式:

    upstream lingxi {
        ip_hash;
        server 10.0.1.1:80;
        server 10.0.1.2:80;
    }
    

    缺点: 一旦某台服务器挂了,那么该机器的session不复存在,而当请求切换到其它机器后此时就没有session了.

    3、利用cookie

    将session记录在客户端,当请求服务器时,将session放在cookie发送给服务器,服务端处理结束再将其响应给客户端.

    缺点: 用户可能禁用cookie,cookie有大小限制,并且每次传输cookie影响性能.

    4、session服务器

    将应用服务器的状态分离为无状态的应用服务器和有状态的session服务器,而对session服务器可以使用分布式缓存,例如redis、memcache等都可以.

    二、小结

    以上就是分布式环境下session的处理方案,推荐使用第四种方案.

    参考《大型网络技术架构》

    相关文章

      网友评论

          本文标题:分布式Session

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