分布式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" />
        
        <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的处理方案,推荐使用第四种方案.

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

你可能感兴趣的:(分布式杂谈)