본문 바로가기

미들웨어/Apache,Tomcat

Tomcat Session Clustering 설정

반응형

다중인스턴스, 또는 다중화구성을 한 경우 session clustering 설정을 통해 Tomcat JVM간 session공유가 가능하도록

설정이 필요하다.

redis등 별도로 session server를 두는 경우도 있으나 이번 포스팅에서는 Tomcat간의 session clustering을 설명한다.


1. Tomcat의 Session Manager

  • Tomcat의 session clustering에는 DeltaManager와 BackupManager가 존재한다.
  • DeltaManager는 Cluster에 속한 Member전원에게 session 객체를 공유한다.
    공식 Docs에는 4node이상의 환경에서는 사용을 권장하지 않는다.
  • BackupManager는 자신의 Backup Member에게만 session 객체를 공유한다.
    Backup대상 외 다른 Member는 session객체의 위치만 전달 받는다.

 

 

2. 설정방법

  • DeltaManager
    <Engine name="Catalina" defaultHost="localhost" jvmRoute="was1">
    <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="6" channelStartOptions="3">
          <Manager className="org.apache.catalina.ha.session.DeltaManager"
                   expireSessionsOnShutdown="false"
                   notifyListenersOnReplication="true"/>
          <Channel className="org.apache.catalina.tribes.group.GroupChannel">
              <Receiver
                address="0.0.0.0"
                autoBind="0"
                className="org.apache.catalina.tribes.transport.nio.NioReceiver"
                maxThreads="6"
                port="4100"
                selectorTimeout="5000"
              />
              <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.TcpPingInterceptor" staticOnly="true"/>
              <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
              <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatchInterceptor"/>
              <Interceptor className="org.apache.catalina.tribes.group.interceptors.StaticMembershipInterceptor">
                <Member
                    className="org.apache.catalina.tribes.membership.StaticMember"
                    port="4200"
                    host="0.0.0.0"
                    uniqueId="{0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2}"
                />
                <Member
                    className="org.apache.catalina.tribes.membership.StaticMember"
                    port="4300"
                    host="0.0.0.0"
                    uniqueId="{0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,3}"
                />
                <Member
                    className="org.apache.catalina.tribes.membership.StaticMember"
                    port="4400"
                    host="0.0.0.0"
                    uniqueId="{0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,4}"
                />
              </Interceptor>
          </Channel>
          <Valve className="org.apache.catalina.ha.tcp.ReplicationValve" filter=""/>
          <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
          <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
      </Cluster>
    </Engine>
  • channelSendOptions="6" : 동기방식. 8로 설정할 경우 비동기로 동작한다.
  • channelStartOptions="3" : MultiCast를 사용하지 않을 경우 3번을 사용한다.
                                              해당 옵션을 사용하지 않은 경우 MultiCast를 위해 <Membership>태그을 넣어주어야 한다.
  • jvmRoute : StickySession을 위한 이름으로 WAS서버(인스턴스)별로 구분 가능한 이름을 사용한다.
  • Receiver : Session 객체를 전달받을 정보로 IP, Port를 환경에 맞게 설정한다.
  • Member : Cluster에 참여할 Member들의 정보로 대상의 IP, Port를 환경에 맞게 설정한다.
  • uniqueId : Member별로 공유의 Key값을 지정해준다.

 

  • BackupManager
    <Engine name="Catalina" defaultHost="localhost" jvmRoute="was1">
    <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="8">
        <Manager className="org.apache.catalina.ha.session.BackupManager"
                   expireSessionsOnShutdown="false"
                   notifyListenersOnReplication="true"
                   mapSendOptions="6"/>
        <Channel className="org.apache.catalina.tribes.group.GroupChannel">
            <Membership className="org.apache.catalina.tribes.membership.McastService"
                        address="228.0.0.4"
                        port="35564"
                        frequency="500"
                        dropTime="3000"/>
            <Receiver
                address="10.0.2.15"
                autoBind="0"
                className="org.apache.catalina.tribes.transport.nio.NioReceiver"
                maxThreads="6"
                port="4100"
                selectorTimeout="5000"
            />
            <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.MessageDispatchInterceptor"/>
            <Interceptor className="org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor"/>
          </Channel>
          <Valve className="org.apache.catalina.ha.tcp.ReplicationValve" filter=""/>
          <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
          <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
      </Cluster>
  • MultiCast를 통해 Backup대상이 정해지고, 나머지 Member들은 session객체의 위치만 공유받는다.
  • DeltaManager에 한 설정과 마찬가지로 Backup Member를 직접 지정도 가능하다.
  • Session Clustering을 위해선 Context단위로 web.xml에 <distributable/> 설정을 추가해야 한다.
<web-app>
  <distributable/>
</web-app>

 

반응형

 

3. SESSIONID값의 변경

  • SESSIONID값(default : JSESSIONID)의 변경이 필요한 경우 아래 설정을 참고한다.
  • server.xml의 <Context>태그 내에 sessionCookieName 설정 추가
<Context docBase="/webwas/test" sessionCookieName="MSESSIONID" path="" reloadable="false" />

 

  • workers.properties에 session_cookie명 설정 추가
worker.list=balancer1
worker.balancer1.session_cookie=MSESSIONID

실제로 부하가 큰 환경의 4node환경에 DeltaManager로 Tomcat Session clustering을 구성하여 사용하고 있지만 아직은(?)

문제가 되고있진 않다.

구축단계에서 BackupManager와 DeltaManager모두를 테스트했지만 차이점을 느끼지 못했고 Reference가 많은 DeltaManager를 사용하게 되었다.

반응형