关于服务器集群的session处理方式的总结

来源:互联网 发布:极有家 知乎 编辑:程序博客网 时间:2024/05/21 07:55

对于服务器集群的session处理,现总结有三种处理方式。

 

1. session保持,session保持是指一个客户端请求发到多个集群服务器其中的一个,这个服务器上就会存有这个客户端的session ,之后这个客户端所有的请求都会转发到这个服务器上。对于这种方式,可以用nginx+tomcat集群,nginx设置负载均衡的权重以及加上ip_hash;即可实现session保持。理论上说这种方式可以通过增加服务器支持大并发,适合中高型并发量的项目。

2. Session 复制,这种方式是客户端访问哪个服务器产生session再将session通过广播复制到其他服务器,这样就可以保持session 一致,缺点是超过集群超过6个服务器就会出现性能下降,因为复制并广播session会占用大量带宽和内存。这样最多也就能支持2-3千的并发,适用于中低并发量的项目。实现方式如下:

在集群tomcatserver.xml中添加以下代码:

 

 

 <Engine name="Catalina" defaultHost="localhost" jvmRoute="node2"><!--注意每个tomcat起一个jvmRoute="node2"-->

 

      <!--For clustering, please take a look at documentation at:

          /docs/cluster-howto.html  (simple how to)

          /docs/config/cluster.html (reference documentation) -->

      <!--

      <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>

      -->

  

  <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" bind="127.0.0.1" address="228.0.0.4" port="45564" frequency="500" dropTime="3000"/>

<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"

address="auto"

port="4002"

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.MessageDispatch15Interceptor"/>

</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.JvmRouteSessionIDBinderListener"/>

<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>

</Cluster>

 

然后在每个tomcat下的项目web.xml里加入 <distributable/> ,完成。

 

 

3.session共享。用redismemcache等第三方缓存作为公共session存储。这种较为简单,实用,但是会有缓存挂了所有回话都挂的风险,这种方案适合大型分布式系统采用,适合大并发和超大并发。

阅读全文
0 0
原创粉丝点击