
HAProxy 로드 밸런서와 두 개의 Tomcat 백엔드 서버가 있습니다. HAProxy는 쿠키 기반 지속성으로 구성되고 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 }, 페이로드={}, 명령={}, 도메인={}, ]]
또한, 백엔드를 수행할 때:
경고: 관리자 [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 }, 페이로드={}, 명령={}, 도메인={} , ]. 60초 이내에 세션 상태가 수신되지 않으면 이 작업은 시간 초과됩니다. 2014년 5월 8일 오전 10:54:21 org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor 보고서 INFO: ThroughputInterceptor 보고서 Tx Msg:1 메시지 전송:0.00MB(총) 전송:0.00MB(응용 프로그램) 시간:0.01 초 Tx 속도:0.04MB/초(총) TxSpeed:0.04MB/초(응용 프로그램) 오류 메시지:0 Rx Msg:0 메시지 Rx 속도:0.00MB/초(첫 번째 메시지 이후) 수신:0.00MB]
2014년 5월 8일 오전 10:54:21 org.apache.catalina.ha.session.DeltaManager waitForSendAllSessions 정보: 관리자 [webservice#]; 세션 상태는 14/5/8 오전 10시 54분에 전송되며 111ms 내에 수신되었습니다.
따라서 클러스터링과 멀티캐스트가 작동합니다.
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>
사용자가 로그인하면 세션이 유효한 한 하나의 백엔드 서버에 고정되기 때문에 쿠키 지속성이 작동하는 것을 확인했습니다. 그러나 세션을 보유하고 있는 서버를 종료하면 다른 서버에서 이를 발견한 로그 파일을 볼 수 있지만 사용자는 쫓겨납니다.
또한 web.xml에는 배포 가능 요소 세트가 있습니다.
어떤 아이디어가 있나요?
감사해요
답변1
제공하신 구성에 문제가 있는 것을 볼 수 없습니다. 당신을 위한 몇 가지 제안.
관리자(http://node01:80/manager/html) 다른 노드의 관리자에서 각 세션을 봅니다.
노드 손실로 인해 세션이 종료되어서는 안 되기 때문에 복제하지 않는 것 같습니다.
포트: 5000 및 멀티캐스트 주소: 228.0.0.4에 대한 방화벽 규칙을 확인하세요.
방화벽 구성에서 대부분의 문제가 발생했습니다!