[Tomcat] 톰캣7 세션 클러스터링 방법

[Tomcat] 톰캣7 세션 클러스터링 방법

세션 클러스터링이란 여러 대의 WAS가 세션을 공유하는 것을 말한다.

이렇게 되면 한 대의 WAS가 죽어도 나머지 WAS가 세션을 유지시켜 준다.

참고로 세션은 도메인이 동일해야만 같은 제이세션아이디(세션을 찾아오기 위힌 key에 해당하는 쿠키값)을 갖기 때문에, 세션 클러스터링을 하기 전에 로드밸런싱 작업이 선행되어야 한다.

로드밸런싱이란 쉽게 말해서 하나의 도메인 주소로 접속했을 때 1번 WAS 또는 2번 WAS를 번갈아가며 접속하게 만드는 부하분산을 뜻한다. 로컬환경에서 간단히 로드밸런싱을 테스트하기 위해서는 다음 포스트를 읽어보면 좋다. ([Nginx] L4 대신 Nginx 웹서버로 로드밸런싱 하는 방법 : https://blog.naver.com/bb_/222215375652)

결국 우리가 흔히 말하는 서버 이중화 작업이란, 이러한 (1) 로드밸런싱 작업과 (2) 세션 클러스터링 작업을 포괄한 개념이다.
톰캣7 세션 클러스터링 방법은 간단하다.
1. 톰캣 폴더 내의 server.xml 파일 수정
먼저 server.xml 파일을 수정한다.
그대로 복사해서 붙여넣고 일부분만 수정하면 된다.
[AS-IS]

      <!–
      <Cluster className=”org.apache.catalina.ha.tcp.SimpleTcpCluster”/>
      –>

[TO-BE]

      <!–
      <Cluster className=”org.apache.catalina.ha.tcp.SimpleTcpCluster”/>
      –>

      <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=”211.111.222.333” 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>

address=”211.111.222.333″ 부분에는 해당 WAS의 ip 주소를 입력하면 된다.

port=”4000″ 부분은 수신 포트로 4000~4100 사이 포트를 지정하면 된다.

동일한 PC에 톰캣 2개가 같이 있다면, 첫번째 톰캣은 4000, 두번째 톰캣은 4001… 식으로 겹치지 않게 지정하면 된다.

2. 웹 어플리케이션의 web.xml 파일 수정

web.xml 파일을 수정하는데, 주의할 점은 톰캣 내의 web.xml 파일이 아니라, 톰캣이 구동하는 웹 어플리케이션의 WEB-INF/web.xml 파일을 수정해야 한다.

예를 들어 tomcat 폴더 하위의 webapps/ROOT/WEB-INF/web.xml 파일을 말한다.

[AS-IS]

(중략)

</web-app>

[TO-BE]

(중략)

    <distributable/>

</web-app>

web-app 태그 안에 <distributable/> 를 넣어주면 된다.

3. 테스트 페이지 작성

테스트 페이지 작성은 선택사항이다. 여기서는 jsp 파일로 작성해보았다.

톰캣을 2개라고 가정하고 2개를 만든다.

(1) 톰캣 1의 test.jsp 파일

<%

    // 세션어트리뷰트에 값 세팅하기

    session.setAttribute(“tomcat1“, “Hello World”);

    out.println(“TOMCAT1“);
    out.println(“<br>”);

    out.println(“SESSION ID : ” + session.getId());
    out.println(“<br>”);
 

    // 다른 서버에서 세팅한 어트리뷰트를 꺼내보기

    String result = String.valueOf(session.getAttribute(“tomcat2“));
    out.println(“result : ” + result);
%>

(2) 톰캣 2의 test.jsp 파일

<%

    // 세션어트리뷰트에 값 세팅하기

    session.setAttribute(“tomcat2“, “Hello World”);

    out.println(“TOMCAT2“);
    out.println(“<br>”);

    out.println(“SESSION ID : ” + session.getId());
    out.println(“<br>”);

    // 다른 서버에서 세팅한 어트리뷰트를 꺼내보기
    String result = String.valueOf(session.getAttribute(“tomcat1“));
    out.println(“result : ” + result);
%>

위 jsp 페이지를 호출했을 때 처음에는 result 값이 null 이 나오지만, 몇 번 새로고침하다보면 Hello World 라는 값이 나와야 한다.

그리고 몇 번을 새로고침하더라도 세션 아이디가 바뀌지 않고 동일하게 유지되어야 한다.

4. 문제해결

기동 시 catalina.out 로그에 org.apache.catalina.ha.session.DeltaManager startInternal 이라는 문자열이 찍히는지 확인하자. 찍히지 않으면 세션 클러스터링이 적용되지 않은 것이다.

(1) web.xml 파일 안에 <distributable/> 가 있는지 확인하자. 다시 강조하지만 web.xml 파일은 톰캣 내의 web.xml 파일이 아니라, 톰캣이 구동하는 웹 어플리케이션의 WEB-INF/web.xml 파일을 수정해야 한다.

(2) web-app 태그의 version 어트리뷰트의 값이 3.0 이상인지 확인해보자. 만약 그렇지 않다면 다음 포스트를 참고하자. ([TOMCAT] 톰캣 세션 클러스터링 안되는 문제 : https://blog.naver.com/bb_/221541869532)

참고사이트 2 : https://idchowto.com/?p=53319