본문 바로가기
TOMCAT/ loadbalacing 과 session clustering

[ tomcat ] loadbalacing 과 session clustering

by 정윤재 2011. 12. 24.

상용 서비스에서 컨테이너를 tomcat 하나로 쓰는 서비스는 없을 것이다.
보통 tomcat 2개 이상을 아래와 같은 구조로 사용하기를 원할 것인다.



그런데 이러한 방식에는 2가지 이슈 사항이 있다.

1. 업무 부하
- 같은 URL로 접근 하여 tomcat1, tomcat2 에 분산 되어 http request 가 들어 갈 텐데
   만약 tomcat1 과 tomcat2 에 대한 http request 가 9:1(극단적으로) 비율로 들어간다면
   tomcat1 에는 과다한 업무 부하가 생길 수 있다. 
   위의 이슈 사항에 대해 tomcat 에서 해결할 수 있는 방법은 apache http server
   를 이용한 load balancing 이다.

2. fail over
- 위의 그림 상에서 두 개의 tomcat 중 한 개가 죽었을 때 다른 톰캣으로 가서 실행
   되면 좋겠지만 서버가 다를 경우 http session 이 공유 되지 않아 자동적으로
   로그 아웃이 되거나 서비스에 연속성이 떨어 질 것이다.
   이런 이슈 사항을 톰캣은 http session 이 변할 때 muticast 로 특정 member 들끼리
   http session 을 공유 하여 하나의 tomcat 이 죽더라도 다른 톰캣에서 작업들을
   연속성 있게 할 수 있도록 하였다.

위의 두 가지가 반영 되면


이렇게 될 것이다.

위와 같이 설정한 예제를 아래와 같이 정리 해 보겠다.

환경 : apache 2.2
         java 1.6
         tomcat 7

일단 apache 와 tomcat 의 연동은 되어 있다는 전제 하에 진행 하겠다.

1. apache 설정 부분 (apache 설치 경로 /conf 안의 내용들)
1-1. uriworkermap.properties 파일
/cms_admin_poc/* = loadbalancer
/cms_developer_poc/* = loadbalancer
/cms_shop/* = loadbalancer
#위와 같은 경로로 들어올 경우 loadbalalcer 로 전달해 주라는 말임

1-2. workers.properties 파일
worker.list = tomcat_cms1,tomcat_cms2,loadbalancer
worker.tomcat_cms1.type=ajp13
worker.tomcat_cms1.host=localhost
worker.tomcat_cms1.port=8029
worker.tomcat_cms1.lbfactor=100
#아파치 톰캣(1번째 톰캣)연동 되어 있는 정보 적어주기

worker.tomcat_cms2.type=ajp13
worker.tomcat_cms2.host=211.63.6.184
worker.tomcat_cms2.port=8029
worker.tomcat_cms2.lbfactor=200
#아파치 톰캣(2번째 톰캣)연동 되어 있는 정보 적어주기
worker.loadbalancer.type=lb
worker.loadbalancer.balanced_workers=tomcat_cms1,tomcat_cms2
#loadbalancer 설정해 주기

2. tomcat 설정 부분(tomcat 설치 경로/conf/server.xml 파일 내용)
<!-- host 태그 사이에 아래 내용들 삽입 -->

        <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
                 channelSendOptions="6">
     <!-- SimpleTcpCluster 은 memory 에 세션 정보 저정하는 방식임. 이외에 DB저장방식,file 저장방식이 있음-->
          <Manager className="org.apache.catalina.ha.session.BackupManager"
                   expireSessionsOnShutdown="false"
                   notifyListenersOnReplication="true"
                   mapSendOptions="6"/>
          <!--
          <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.63.6.75"
                      port="5000"
                      selectorTimeout="100"
                      maxThreads="6"/>
  <!-- 리시버엔 자기네 ip 써야함 (auto 는 실패함) -->
            <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"/>
            <Interceptor className="org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor"/>
          </Channel>
          <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
                 filter=".*\.gif|.*\.js|.*\.jpeg|.*\.jpg|.*\.png|.*\.htm|.*\.html|.*\.css|.*\.txt"/>
          <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.ClusterSessionListener"/>
        </Cluster>

참고) 운영 체제에서 multicat 설정이 안되어 있을 경우 위와 같이 안될 가능성이 있는데
        해결방법은  
       shell>ifconfig -a  
          eth0      Link encap:Ethernet  HWaddr 00:1F:29:E7:ED:A4 
          inet6 addr: fe80::21f:29ff:fee7:eda4/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:36157517 errors:0 dropped:0 overruns:0 frame:0
          TX packets:18839 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:3269828443 (3.0 GiB)  TX bytes:1207502 (1.1 MiB)
          Interrupt:169 Memory:f8000000-f8012100

         3번째 줄의 UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
         같이 multicast 가 설정되어 있어야 하는데 없다를 확인 하면
 
         shell> ifconfig eth0 multicast라고 설정해 주면 된다.

3. 웹 프로젝트 안의 web.xml 파일 내용

<distributable/>
 태그 추가


---------------------------------------------------------------------
위와 같이 하면 성능에 대한 부담을 상당 부분 덜고 tomcat 장애 사항에도 자동적인
대처가된다.


댓글