集群中通过msm实现session共享,采用轮询的方式时session经常失效

attacker 发布于 2013/11/14 10:31
阅读 1K+
收藏 0
最近有个任务是使用nginx+tomcat实现集群和负载均衡,同时结合使用memcached实现session共享。配置集群中没有什么问题,就是这个通过memcached+tomcat实现session共享这出现了问题,现在使用了两个tomcat服务器,一个memcached,当nginx中配置使用轮询的方式时,登录后系统之后操作的过程中频繁出现需要重新登录的情况,使用ip_hash的配置方式没有此问题。
    最开始配置完memcached+tomcat后进行测试的时候,在两个tomcat中分别放一个简单的小项目,就是在首页上显示sessionID,采用轮询的方式,不断刷新,sessionID并不会改变,说明session已经共享了,不明白到项目中为什么会出现这样的问题。
    两个tomcat的context.xml的添加manager标签,是一样的,配置如下
    <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
sticky="true"
        memcachedNodes="n1:168.168.169.120:11211"
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$" transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>
    server.xml的Engine标签中也都添加了jvmRoute属性。
    在系统里有个检测session的过滤器,其中有句代码是
           Httpsession session = request.getSession(false),
就是这句代码,该方法经常返回null,这时就会session失效。可是,在没有超时的情况下该方法怎么就返回null呢?
    各位对此了解或遇到过此类情况的大神,请在百忙之中抽空指教下,在此先谢了。
加载中
0
zhhuang007
zhhuang007
sticky="true"   粘性session,配成false
0
SkyE族
SkyE族

我在搭建过程中也出现过这样的问题,之后我改成tomcat集群,使用tomcat的Session广播包的方式可以解决这个问题,当时没有在实际生成环境中使用,不知道真实的环境下,效果如何:

tomcat server.xml中添加

<Engine name="Catalina" defaultHost="localhost" jvmRoute="节点名称相同">
	        <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="224.0.0.4"
                        port="45564"
                        frequency="500"
                        dropTime="3000"/>
            <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
                      address="10.0.1.190"
                      port="4000"
                      autoBind="100"
                      selectorTimeout="5000"
                      maxThreads="6"/>


、、



1)修改:Server
port
Connector portConnector
port
端口号确保同一台服务器上的Tomcat的端口不一致。



2)修改Receiver
className
中的addressIP地址(与本机的通讯的IP地址相同)、port的端口号(该端口号初始为4000 Tomcat集群中的成员确保每个端口号都不一致)。



3)修改conf目录、项目中的WEB-INF 的web.xml。在</web-app>该标签钱添加<distributable/>



 

0
SkyE族
SkyE族

http://jackandroid.iteye.com/blog/627147

 

这个你看看 或许可以帮助你

返回顶部
顶部