개발/Tomcat

톰캣 클러스터링

톰캣의 부하를 줄이기 위해 두 개의 톰캣으로 나누겠습니다.

 

두 번째 톰캣을 설치합니다.

 

저는 복사를 하겠습니다.

sudo cp -a apache-tomcat-9.0.37 tomcat1
sudo cp -a apache-tomcat-9.0.37 tomcat2

 

같은 포트를 사용하면 충돌이 발생합니다.

tomcat2의 Shutdown, Connect, ajp 포트를 변경합니다.

/usr/local/tomcat2/conf/server.xml

<Server port="8006" shutdown="SHUTDOWN">	/* 8005 -> 8006 */

<Connector port="8081" protocol="HTTP/1.1"  /* 8080 -> 8081 */                            
             connectionTimeout="20000"
             redirectPort="8443" />

<Connector protocol="AJP/1.3"
          address="0.0.0.0"
          secretRequired="false"
          port="8010"                       /* 8009 -> 8010 */                     
          redirectPort="8443" />

8006, 8081, 8010은 임의로 지정하셔도 됩니다.

 

변경한 후에 정상적으로 동작하는지 확인합니다.

localhost:8080
localhost:8081
localhost

모두 같은 화면이 나와야 합니다.

 

Load balancing


두 톰캣에 분산 처리를 위한 로드밸런스를 추가하겠습니다.

지난번 연동에 사용한 worker.properites를 수정합니다. (예시를 보여드립니다. 아직 완전한 내용은 아닙니다.)

/etc/apache2/conf/workers.properties

worker.list=worker1,worker2,loadbalancer               
worker.worker1.type=ajp13
worker.worker1.host=localhost
worker.worker1.port=8009
worker.worker1.lbfactor=100
worker.worker1.socket_timeout=600   #10분
worker.worker1.socket_keepalive=1   #1 사용, 0 미사용

worker.worker2.type=ajp13
worker.worker2.host=localhost
worker.worker2.port=8010
worker.worker2.lbfactor=100
worker.worker2.socket_timeout=600   #10분
worker.worker2.socket_keepalive=1   #1 사용, 0 미사용

#tomcat timeout에 따른 중복 발생 방지
worker.loadbalancer.retries=0
worker.worker1.retries=0
worker.worker2.retries=0

worker.loadbalancer.type=lb
worker.loadbalancer.sticky_session=1
worker.loadbalancer.balanced_workers=worker1,worker2

보통 검색을 하면 위와 같이 나옵니다. 설정을 따라 하면 mod_jk.log 에서 다음과 같은 로그를 볼 수 있습니다.

The attribute 'worker.loadbalancer.balanced_workers'is deprecated - please check the documentation for the correct replacement.

이 부분을 수정해 줍니다.

worker.list=loadbalancer                                   
worker.loadbalancer.balance_workers=worker1
worker.worker1.type=ajp13
worker.worker1.host=localhost
worker.worker1.port=8009
worker.worker1.lbfactor=100
worker.worker1.socket_timeout=600   #10분
worker.worker1.socket_keepalive=1   #1 사용, 0 미사용

worker.loadbalancer.balance_workers=worker2
worker.worker2.type=ajp13
worker.worker2.host=localhost
worker.worker2.port=8010
worker.worker2.lbfactor=100
worker.worker2.socket_timeout=600   #10분
worker.worker2.socket_keepalive=1   #1 사용, 0 미사용

#tomcat timeout에 따른 중복 발생 방지
worker.loadbalancer.retries=0
worker.worker1.retries=0
worker.worker2.retries=0

worker.loadbalancer.type=lb
worker.loadbalancer.sticky_session=1  

 

 

그리고 httpd.conf 파일을 수정합니다.

/usr/local/etc/httpd/httpd.conf

JkMount /* loadbalancer 

 

tomcat1과 tomcat2의 server.xml 파일을 수정합니다. 주석이 없는 곳에 이름을 맞에 입력합니다.

<Engine name="Catalina" defaultHost="localhost" jvmRoute="worker1">
<Engine name="Catalina" defaultHost="localhost" jvmRoute="worker2">

이어서 session replication 설정을 알아보겠습니다.

 

Session replication


세션 복제를 위하여 server.xml 파일을 수정합니다. 

 

Cluster 부분의 주석을 지우거나 공식 홈페이지의 default cluster configuration을 추가합니다.

<!--
       <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
 -->

공식 홈페이지에 자세한 설명이 나와있습니다.

tomcat.apache.org/tomcat-9.0-doc/cluster-howto.html

더보기
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
                 channelSendOptions="8">

          <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="auto"
                      port="4000"
                      autoBind="100"
                      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.TcpFailureDetector"/>
            <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatchInterceptor"/>
          </Channel>

          <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
                 filter=""/>
          <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>

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

그리고 웹 애플리케이션의 web.xml 파일에 <distributable/>을 추가합니다.

 

모든 설정이 완료되었습니다. 세션이 복제되었는지 확인해 보겠습니다.

 

http://localhost:8080에서 관리자 모드로 들어간 뒤 네트워크를 클릭합니다.

그리고 새로고침을 하여 세션 값을 확인합니다.

 

localhost:8080

이 상태에서 8081 포트를 입력합니다.

localhost:8081

같은 쿠키 값을 확인할 수 있습니다. 세션이 복제되었음을 확인할 수 있습니다.

 

 

참고) 클러스터링이 동작하기 위해서는 시스템이 멀티캐스팅을 지원해야 합니다.

Of course, you need to enable multicasting on your system.

'개발 > Tomcat' 카테고리의 다른 글

아파치 톰캣 연동 mac  (0) 2020.10.21