다중 호스트 환경에서 도커로 톰캣 세션 클러스터링을 구축하고자 할 경우, 도커도 클러스터링 환경이 필요하다.

도커 스웜의 overlay 네트워크를 통해 다중 호스트 환경의 컨테이너들도 클러스터링 될 수 있다.

다만, overlay 네트워크에서는 멀티캐스팅이 불가해 유니캐스트 방식으로 설정해야 한다.

(단일 호스트 환경에서는 도커 bridge 네트워크를 통해 멀티캐스팅 방식으로 톰캣 클러스터링 가능함)

 

 

환경

 

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;
    }
}

 

복사했습니다!