Tomcat 6 会话复制不适用于 HAProxy

Tomcat 6 会话复制不适用于 HAProxy

我有 HAProxy 负载均衡器和两台 Tomcat 后端服务器。根据文档,HAProxy 配置了基于 cookie 的持久性,Tomcat 配置了 SimpleTcpCluster。两台 Tomcat 后端服务器之间的多播已启用。但是会话复制不起作用。每次我关闭保存会话的服务器时,用户都会被注销。在 catalina.out 中,我看到服务器正在相互通信,例如当我关闭一台后端时:

2014 年 5 月 8 日上午 11:00:25 org.apache.catalina.tribes.group.interceptors.TcpFailureDetector performBasicCheck INFO:可疑成员,已确认死亡。[org.apache.catalina.tribes.membership.MemberImpl[tcp://{10, 2, 1, 69}:5000,{10, 2, 1, 69},5000, alive=931801,id={-18 123 59 -88 -95 20 78 -34 -83 31 -43 73 -64 -71 42 -62 }, payload={}, command={}, domain={}, ]]

另外,当我启动后端时:

警告:管理器 [webservice#],从 org.apache.catalina.tribes.membership.MemberImpl[tcp://{10, 2, 1, 69}:5000,{10, 2, 1, 69},5000, alive=672675,id={-18 123 59 -88 -95 20 78 -34 -83 31 -43 73 -64 -71 42 -62 }, payload={}, command={}, domain={}, ] 请求会话状态。如果 60 秒内未收到任何会话状态,此操作将超时。 2014 年 5 月 8 日上午 10:54:21 org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor 报告信息:ThroughputInterceptor 报告 Tx 消息:1 条消息已发送:0.00 MB(总计)已发送:0.00 MB(应用程序)时间:0.01 秒 Tx 速度:0.04 MB/秒(总计)TxSpeed:0.04 MB/秒(应用程序)错误消息:0 Rx 消息:0 条消息 Rx 速度:0.00 MB/秒(自第一条消息以来)已接收:0.00 MB]

2014 年 5 月 8 日上午 10:54:21 org.apache.catalina.ha.session.DeltaManager waitForSendAllSessions 信息:管理器 [webservice#];会话状态于 2014 年 5 月 8 日上午 10:54 发送,111 毫秒内收到。

因此,集群和多播正在起作用。

这是 HAProxy 后端配置:

backend BE-tomcat_http
mode            http
cookie SERVERID insert indirect nocache
balance         leastconn
timeout connect     30000
timeout server      30000
retries         3
option          httpchk OPTIONS /
option          redispatch
option          http-server-close
option          http-pretend-keepalive
server          node01 10.2.1.69:80 cookie node01 check inter 1000
server          node02 10.2.1.90:80 cookie node02 check inter 1000

这是 Tomcat server.xml

    <Engine name="Catalina" defaultHost="localhost" jvmRoute="node01">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/>


  <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="8">
                  <Manager className="org.apache.catalina.ha.session.DeltaManager"
                           expireSessionsOnShutdown="false"
                           notifyListenersOnReplication="true"
                           mapSendOptions="8"/>
                  <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="5000"
                            selectorTimeout="500"
                            minThreads="2"
                            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"/>
                  <Interceptor className="org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor"/>
                  </Channel>
                  <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
                                             filter=".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;"/>
                   <ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>
                   <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
    <!--           <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
                             tempDir="/tmp/war-temp/"
                             deployDir="/tmp/war-deploy/"
                             watchDir="/tmp/war-listen/"
                             watchEnabled="false"/> -->
     </Cluster>

我发现 cookie 持久性是有效的,因为当用户登录时,只要会话有效,他们就会被固定在一个后端服务器上。但是,当我关闭保存会话的服务器时,用户会被踢出,尽管我在日志文件中看到其他服务器注意到了这一点。

web.xml 还具有可分发元素集。

有任何想法吗?

谢谢

答案1

我看不出您提供的配置有什么问题。给您一些建议。

  1. 您可以通过进入管理器 (http://node01:80/manager/html) 并在另一个节点的管理器中查看每个会话。

    我怀疑您没有进行复制,因为节点丢失不应该终止会话。

  2. 检查防火墙规则中的端口:5000 和多播地址:228.0.0.4

    我们在防火墙配置上遇到了大多数问题!

相关内容