Tomcat 6 세션 복제가 HAProxy에서 작동하지 않습니다.

Tomcat 6 세션 복제가 HAProxy에서 작동하지 않습니다.

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

제공하신 구성에 문제가 있는 것을 볼 수 없습니다. 당신을 위한 몇 가지 제안.

  1. 관리자(http://node01:80/manager/html) 다른 노드의 관리자에서 각 세션을 봅니다.

    노드 손실로 인해 세션이 종료되어서는 안 되기 때문에 복제하지 않는 것 같습니다.

  2. 포트: 5000 및 멀티캐스트 주소: 228.0.0.4에 대한 방화벽 규칙을 확인하세요.

    방화벽 구성에서 대부분의 문제가 발생했습니다!

관련 정보