반응형
다중인스턴스, 또는 다중화구성을 한 경우 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를 사용하게 되었다.
반응형
'미들웨어 > Apache,Tomcat' 카테고리의 다른 글
Tomcat jmx-proxy를 활용한 모니터링 (1) | 2023.03.12 |
---|---|
Tomcat Connector Threads 설정 정리 (0) | 2023.03.08 |
Tomcat JNDI DataSource 설정 (0) | 2023.03.04 |
Tomcat 설치 및 기본구조 (0) | 2023.03.03 |
Apache mod_security를 사용한 보안강화 (0) | 2023.03.02 |