톰캣의 부하를 줄이기 위해 두 개의 톰캣으로 나누겠습니다.
두 번째 톰캣을 설치합니다.
저는 복사를 하겠습니다.
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에서 관리자 모드로 들어간 뒤 네트워크를 클릭합니다.
그리고 새로고침을 하여 세션 값을 확인합니다.
이 상태에서 8081 포트를 입력합니다.
같은 쿠키 값을 확인할 수 있습니다. 세션이 복제되었음을 확인할 수 있습니다.
참고) 클러스터링이 동작하기 위해서는 시스템이 멀티캐스팅을 지원해야 합니다.
Of course, you need to enable multicasting on your system.
'개발 > Tomcat' 카테고리의 다른 글
아파치 톰캣 연동 mac (0) | 2020.10.21 |
---|