一、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的处理方案,推荐使用第四种方案.
参考《大型网络技术架构》
网友评论