
다중 호스트 환경에서 도커로 톰캣 세션 클러스터링을 구축하고자 할 경우, 도커도 클러스터링 환경이 필요하다.
도커 스웜의 overlay 네트워크를 통해 다중 호스트 환경의 컨테이너들도 클러스터링 될 수 있다.
다만, overlay 네트워크에서는 멀티캐스팅이 불가해 유니캐스트 방식으로 설정해야 한다.
(단일 호스트 환경에서는 도커 bridge 네트워크를 통해 멀티캐스팅 방식으로 톰캣 클러스터링 가능함)
환경
- 호스트
- VM1 : 192.168.137.100
- VM2 : 192.168.137.101
- 도커 스웜
- VM1 : Manager
- VM2 : Worker
- 세팅 방법 : https://onestone-note.tistory.com/143
Docker Swarm 구축
환경 노드: 192.168.137.100 (Manager) 192.168.137.101 (Worker) 방화벽 오픈 Manager default port: 2377/tcp node communication: 7946/tcp, 7946/udp overlay network: 4789/udp firewall-cmd --permanent --zone=public --add-port=2377/tcp firewall-cmd --per
onestone-note.tistory.com
네트워크 생성
- overlay 네트워크 생성 (도커 스웜에서만 사용 가능)
docker network create -d overlay --attachable tomcat-cluster
- 네트워크 확인
docker network ls
톰캣 컨테이너 생성
- VM1에서 tomcat01 컨테이너 생성
docker run -it --name tomcat01 --network tomcat-cluster -p 8080:8080 -d tomcat:8.5
- VM2에서 tomcat02 컨테이너 생성
docker run -it --name tomcat02 --network tomcat-cluster -p 8080:8080 -d tomcat:8.5
톰캣 클러스터링 설정
- VM1 tomcat01의 server.xml 설정에 추가
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="8" channelStartOptions="3">
<Manager className="org.apache.catalina.ha.session.DeltaManager" expireSessionsOnShutdown="false" notifyListenersOnReplication="true"/>
<Channel className="org.apache.catalina.tribes.group.GroupChannel">
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver" address="192.168.137.100" port="4000" autoBind="0" 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.MessageDispatchInterceptor"/>
<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.StaticMembershipInterceptor">
<Member className="org.apache.catalina.tribes.membership.StaticMember" port="4000" host="192.168.137.101" uniqueId="{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2}" />
</Interceptor>
</Channel>
<Valve className="org.apache.catalina.ha.tcp.ReplicationValve" filter=".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;" />
<Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener" />
</Cluster>
- VM2 tomcat02의 server.xml 설정에 추가
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="8" channelStartOptions="3">
<Manager className="org.apache.catalina.ha.session.DeltaManager" expireSessionsOnShutdown="false" notifyListenersOnReplication="true"/>
<Channel className="org.apache.catalina.tribes.group.GroupChannel">
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver" address="192.168.137.101" port="4000" autoBind="0" 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.MessageDispatchInterceptor"/>
<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.StaticMembershipInterceptor">
<Member className="org.apache.catalina.tribes.membership.StaticMember" port="4000" host="192.168.137.100" uniqueId="{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}" />
</Interceptor>
</Channel>
<Valve className="org.apache.catalina.ha.tcp.ReplicationValve" filter=".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;" />
<Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener" />
</Cluster>
세션 확인
- 톰캣 컨테이너 내의 webapps.dist 디렉토리에 'examples'라는 예제 프로젝트가 있다.
이 디렉토리를 webapps에 넣고, 이 예제 프로젝트를 통해 세션을 테스트해볼 수 있다.
(http://192.168.137.100:8080/examples/servlets/servlet/SessionExample)
- 앞단에 nginx를 두고 tomcat01, tomcat02 컨테이너들을 로드밸런싱 해서 세션이 유지되는지 확인한다.
- nginx 로드밸런싱 설정 참고
upstream tomcat {
server 192.168.137.100:8080;
server 192.168.137.101:8080;
}
server {
listen 80;
location /examples {
proxy_pass http://tomcat/examples;
}
}
'인프라 > Docker' 카테고리의 다른 글
lighthouse 성능 보고서 추출 도커 이미지 만들기 (0) | 2024.05.10 |
---|---|
[Docker] Nginx 포워드 프록시 모듈 추가 (ver 1.24) (0) | 2024.01.10 |
[Docker] 사용자, 그룹을 tomcat으로 하는 커스텀 tomcat 이미지 생성 (Dockerfile) (0) | 2023.12.08 |
[flask + uwsgi] Dockerfile (0) | 2023.04.29 |
Docker Swarm 구축 (0) | 2023.02.12 |