자바 응용 서버 의 tomcat 세 션 복사 클 러 스 터 설정 예제 상세 설명

세 션 은 사용 자 를 식별 하고 사용자 의 방문 행 위 를 추적 하 는 수단 으로 쿠키(클 라 이언 트 존재)나 session(서버 존재)를 통 해 이번 요청 이 클 라 이언 트 가 보 낸 것 임 을 판단 합 니 다.자주 사용 하 는 세 션 은 바 인 딩 세 션 을 유지 합 니 다.바로 앞에서 우리 가 이야기 한 프 록 시 에서 알고리즘 을 사용 하거나 클 라 이언 트 에 게 첫 번 째 쿠키 를 추가 하 는 방식 으로 같은 쿠키 나 같은 ip 주소 의 요청 을 항상 같은 백 엔 드 server 로 보 내 서 응답 하 는 것 입 니 다.그러나 이러한 세 션 바 인 딩 방식 에 문제 가 존재 합 니 다.바로 백 엔 드 의 한 server 가 지연 되면 그 전의 모든 세 션 정보 가 사라 집 니 다.그러면 후속 클 라 이언 트 가 요청 합 니 다.대 리 는 백 엔 드 가 지연 되 는 server 로 요청 하 시 겠 습 니까?스케줄 링 이 올 라 가면 사용자 의 이전 세 션 정보 가 없어 집 니 다.스케줄 링 을 하지 않 으 면 사용 자 는 서 비 스 를 받 을 수 없습니다.따라서 이러한 상황 에 대해 저 희 는 세 션 을 백 엔 드 의 모든 server 에 동기 화 시 켜 야 합 니 다.한 대 또는 몇 대의 백 엔 드 server 가 지연 되 더 라 도 사용자 의 세 션 정 보 를 잃 어 버 리 지 않 고 똑 같은 서비스 도 사용 할 수 있 습 니 다.이러한 불필요 한 방식 으로 세 션 정 보 를 저장 하면 사용자 의 세 션 정 보 는 모든 백 엔 드 server 에 있 을 수 있 습 니 다.이것 은 사용자 가 요청 하면 전단 스케줄 러 는 요청 을 백 엔 드 의 한 server 에 임의로 배치 한 다음 에 서버 에서 이번 요청 한 사용자 세 션 정 보 를 방송 방식 으로 다른 백 엔 드 server 에 알 릴 수 있다 는 것 을 의미 합 니 다.그러면 이 클 라 이언 트 는 후속 으로 요청 합 니 다.백 엔 드 의 server 에 예약 하 든.백 엔 드 서버 에 이 클 라 이언 트 가 이전에 요청 한 세 션 정보 가 있 기 때문에 그 대 를 막론하고 식별 할 수 있 습 니 다.tomcat 의 경우 내부 에 이러한 기능 을 지원 하 는 구성 요소 가 있 습 니 다.다 중 방송 통신 방식 을 바탕 으로 세 션 정 보 를 백 엔 드 의 다른 노드 에 동기 화 할 수 있 습 니 다.이 구성 요 소 는 cluster 입 니 다.
예제:tomcat cluster 구성 요 소 를 사용 하여 tomcat 의 세 션 복사 클 러 스 터 를 정의 합 니 다.
환경 설명
명칭.
ip 주소
포트
에이전트 Nginx
192.168.0.41
80
응용 서비스 tomcatA
192.168.0.42
8080
응용 서비스 tomcatB
192.168.0.43
8080
테스트 페이지 준비 및 tomcatA 설정

알림:my app 의 내용 및 파일 디 렉 터 리 구조 입 니 다.

알림:위 설정 은/myapp 의 응용 프로그램 을 배치 하 는 것 을 표시 합 니 다.파일 경 로 는/webapps/myapp 이 고 engine 에 jvmRoute="tomcatA"를 설정 합 니 다.

알림:cluster 설정 은 위 에 빨 간 상 자 를 치 는 위 치 를 주의해 야 합 니 다.공식 설정 문서 에서 뒤의완전한 server.xml 설정

<?xml version='1.0' encoding='utf-8'?>
<Server port="8005" shutdown="SHUTDOWN">
 <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
 <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
 <Listener className="org.apache.catalina.core.JasperListener" />
 <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
 <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
 <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
 <GlobalNamingResources>
 <Resource name="UserDatabase" auth="Container"
    type="org.apache.catalina.UserDatabase"
    description="User database that can be updated and saved"
    factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
    pathname="conf/tomcat-users.xml" />
 </GlobalNamingResources>
 <Service name="Catalina">
 <Connector port="8080" protocol="HTTP/1.1"
    connectionTimeout="20000"
    redirectPort="8443" />
 <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
 <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcatA">
  <Realm className="org.apache.catalina.realm.LockOutRealm">
  <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
    resourceName="UserDatabase"/>
  </Realm>

  <Host name="localhost" appBase="webapps"
   unpackWARs="true" autoDeploy="true">
  <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
    prefix="localhost_access_log." suffix=".txt"
    pattern="%h %l %u %t "%r" %s %b" />
  <Context path="/myapp" docBase="/webapps/myapp" reloadable=""/>
  <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="228.0.0.4"
      port="45564"
      frequency="500"
      dropTime="3000"/>
   <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
      address="192.168.0.42"
      port="4000"
      autoBind="100"
      selectorTimeout="5000"
      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"/>
   </Channel>

   <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
     filter=""/>
   <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>

   <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
     tempDir="/tmp/war-temp/"
     deployDir="/tmp/war-deploy/"
     watchDir="/tmp/war-listen/"
     watchEnabled="false"/>

   <ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>
   <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
  </Cluster>
  </Host>
 </Engine>
 </Service>
</Server>
우리 에 게 정 의 된 응용 수정 기 웹.xml 에요 소 를 추가 합 니 다.

알림:웹.xml 설정 파일 에 대해 서 는/etc/tomcat/에서 자신의 응용 디 렉 터 리 구조 로 복사 한 다음 주석 이 없 는 위치 에요 소 를 추가 하면 됩 니 다.
tomcatB 에 대해 서도 같은 파일 을 준비 해 야 합 니 다.구분 하기 위해 서 는 index.jsp 를 tomcatB 로 수정 합 니 다.설정 파일 에서 수신 기의 감청 주소 와 jvmRoute 의 값 을 수정 해 야 합 니 다.다른 것 은 변 하지 않 을 수 있 습 니 다.


이 tomcat 세 션 에서 클 러 스 터 를 복사 하면 설정 합 니 다.사실은 위의 설정 파일 을 보면 크게 볼 수 있 습 니 다.tomcat 의 세 션 복사 클 러 스 터 는 멀티캐스트 주소 로 통신 하 는 것 입 니 다.하나의 요청 은 클 러 스 터 의 기점 에 관 계 없 이 멀티캐스트 통신 을 통 해 세 션 정 보 를 멀티캐스트 방식 으로 다른 구성원 에 게 보 냅 니 다.수신 기의 주 소 를 네트워크 카드 로 주 소 를 설정 하 는 것 을 권장 합 니 다.다음은 tomcatA,tomcatB 를 시작 한 다음 로그 가 초기 클 러 스 터 에 성 공 했 는 지,클 러 스 터 수신 기의 주 소 를 받 았 는 지 확인 합 니 다.


알림:여기 주의 하 세 요.만약 에 tomcat 의 시작 이 매우 느 리 면 8005 포트 가 오래 기 다 려 야 일어 납 니 다.rng-tools 를 설치 하고 rngd 를 시작 하면 tomcat 의 시작 을 가속 화 할 수 있 습 니 다.


알림:tomcatA 로그 에서 tomcatB 의 수신 기 주소 와 포트 를 볼 수 있다 면 tomcatA 가 tomcatB 에 인식 되 었 음 을 나타 내 고 tomcatB 를 클 러 스 터 구성원 으로 클 러 스 터 에 가입 한 것 을 나타 낸다.마찬가지 로 tomcatB 로그 에서 tomcatA 의 수신 기 주소 와 포트 를 볼 수 있 습 니 다.tomcatB 가 tomcatA 를 식별 하고 클 러 스 터 에 넣 었 음 을 나타 냅 니 다.
nginx 부하 균형 백 엔 드 tomcat 서버 두 대 설정

알림:여기 서 주요 반대 가 필요 할 때 반대 URI 와 뒤에 proxypass 뒤의 URI 가 같 습 니 다.그렇지 않 으 면 프 록 시 후 세 션 복사 클 러 스 터 가 유효 하지 않 습 니 다.
인증:nginx 의 프로필 문법 을 검사 하고 nginx 를 시작 하여 192.168.0.41/my app 에 접근 하여 어떤 변화 가 있 는 지 확인 합 니 다.




알림:192.168.0.41/my app 에 접근 할 때 sessionid 는 변 하지 않 았 고 변 화 된 것 은 뒤의 jvmRoute 의 값 과 페이지 의 값 만 있 습 니 다.이것 은 우리 가 nginx 를 방문 할 때 nginx 도 자신의 폴 링 알고리즘 을 바탕 으로 요청 을 백 엔 드 로 예약 했다 는 것 을 의미한다.첫 번 째 방문 할 때 백 엔 드 server 는 set-cookie 의 첫 번 째 부분 에 응답 하고 현재 방문 한 페이지 의 session 정 보 를 클 라 이언 트 에 응답 하 며 두 번 째 방문 클 라 이언 트 는 지난번 에 해당 하 는 쿠키 를 가 져 와 서 방문 할 것 이다.이때 백 엔 드 서버 는 클 라 이언 트 가 보 낸 쿠키 를 받 은 다음 자신의 메모리 에서 해당 하 는 session 정 보 를 찾 습 니 다.백 엔 드 server 는 session 정 보 를 멀티캐스트 통신 방식 으로 클 라 이언 트 의 다른 노드 에 공유 하기 때문에 두 번 째 는 그 server 에 배치 되 든 대응 하 는 server 는 이 클 라 이언 트 가 처음으로 서버 에 방문 하 는 session 정 보 를 가지 고 있 습 니 다.그래서 우리 가 두 번 째 로 방 문 했 을 때 sessionid 는 서버 의 sessionid 를 처음 방 문 했 습 니 다.뒤의 tomcatB 는 tomcatB 라 는 jvmRoute 가 처리 한 이번 요청 을 표시 합 니 다.
총결산
자바 응용 서버 의 tomcat 세 션 복제 클 러 스 터 설정 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 자바 tomcat 세 션 복제 클 러 스 터 설정 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 지원 바 랍 니 다!

좋은 웹페이지 즐겨찾기