分布式Session

一、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的处理方案,推荐使用第四种方案.

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值