我有 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
我看不出您提供的配置有什么问题。给您一些建议。
您可以通过进入管理器 (http://node01:80/manager/html) 并在另一个节点的管理器中查看每个会话。
我怀疑您没有进行复制,因为节点丢失不应该终止会话。
检查防火墙规则中的端口:5000 和多播地址:228.0.0.4
我们在防火墙配置上遇到了大多数问题!