톰캣 8.5 세션클러스터링 설정

| 2020년 5월 30일 | 0 Comments

 

로드밸런서 등을 이용하여 톰캣을 이중화했을 때 어떤 서버로 접속하든지 세션이 동일하게

유지되기 위해 세션 클러스터링 설정이 필요합니다.

 

해당 설정은 비교적 간단하게 적용 할 수 있으며, 아래와 같은 환경에서 테스트를 진행했습니다.

 서버 사설 IP 나머지 환경
 A(웹 서버 및 WAS 서버 역할) 10.4.0.23

CentOS 7, httpd 2.4.6 tomcat 8.5.5

(톰캣 구동 포트 8005,8009,8080)

 B(WAS 서버 역할) 10.4.0.28

CentOS 7, tomcat 8.5.5

(톰캣 구동 포트 8015, 8019, 8090)

 

아파치 및 톰캣을 연동한 뒤 설정을 진행해보도록 하겠습니다. 

 

-서버 A에서만 진행

# yum install -y httpd httpd-devel

 

-서버 A, B 둘 다 진행

url  :  https://tomcat.apache.org/download-80.cgi

위 페이지에서 tar.gz 를 다운로드 받아줍니다.

# cd /usr/local/src

# wget http://apache.tt.co.kr/tomcat/tomcat-8/v8.5.55/bin/apache-tomcat-8.5.55.tar.gz

# tar xvfz apache-tomcat-8.5.55.tar.gz

# mv apache-tomcat-8.5.55 /usr/local/tomcat

 

자바도 설치해줍니다.

# yum install java-1.8.0-openjdk java-1.8.0-openjdk-devel

 

환경 변수 설정을 진행합니다.

# vi /etc/profile

# source /etc/profile

 

리부팅 후에도 톰캣 이 자동 실행되도록 설정해줍니다.

# cp /usr/local/tomcat/bin/catalina.sh /etc/init.d/tomcat

# chmod 700 /etc/init.d/tomcat

# vi /etc/init.d/tomcat

 

#!/bin/sh 하단에 아래 내용 추가

# Linux Startup Script for Tomcat 8
# chkconfig: 2345 99 99
# description: Tomcat is JSP Service Server
 
# chkconfig –add tomcat
# chkconfig tomcat on
 
 
# vi /usr/local/tomcat/conf/server.xml
위 설정 파일에서 커넥터 내용 주석 해제 후 address 부분을 서버 IP로 수정해줍니다.
`서버 B 에서는 톰캣 구동 포트를 8005 -> 8015, 8009 -> 8019, 8080 -> 8090 으로 수정해줬습니다.
 
 
설정을 수정한 뒤 방화벽에 톰캣 구동 포트를 추가해줍니다. 방화벽 구성은 서버마다 다르기 때문에
설정부분은 생략하겠습니다.
 
 
– 서버 A에서만 진행
이제 서버 A 에서 톰캣 커넥터를 설치하여 아파치와 톰캣을 연동해보겠습니다.
 
url  :  https://tomcat.apache.org/download-connectors.cgi
 
# cd /usr/local/src
# wget http://apache.tt.co.kr/tomcat/tomcat-connectors/jk/tomcat-connectors-1.2.48-src.tar.gz
# yum install gcc gcc-c++
 
# tar xvfz tomcat-connectors-1.2.48-src.tar.gz
# cd tomcat-connectors-1.2.48-src/native/
# ./configure –with-apxs=[아파치 apxs 경로]
# make && make install
 
설치가 완료되었으면 아파치 설정파일에 아래 내용을 추가해줍니다.
 
LoadModule jk_module modules/mod_jk.so
 
<IfModule mod_jk.c>
   JkWorkersFile conf/workers.properties
   JkLogFile logs/mod_jk.log
   JkShmFile logs/mod_jk.shm
   JkMount /*.jsp tomcat_lb
</IfMoudule>
 
 
로드밸런서 설정을 진행합니다.
# vi /etc/httpd/conf/workers.properties
worker.list=tomcat_lb
 
worker.tomcat1.type=ajp13
worker.tomcat1.host=10.4.0.23
worker.tomcat1.port=8009
worker.tomcat1.lbfactor=100
 
worker.tomcat2.type=ajp13
worker.tomcat2.host=10.4.0.28
worker.tomcat2.port=8019
worker.tomcat2.lbfactor=100
 
worker.tomcat_lb.type=lb
worker.tomcat_lb.balanced_workers=tomcat1,tomcat2
 
 
서버 IP/index.jsp 페이지로 접근하면 아파치와 톰캣이 연동된 것을 확인할 수 있습니다.
 
이제 세션 클러스터링 설정을 진행하겠습니다. 서버 A와 서버 B 각각 진행해줍니다.
– 서버 A, B 공통
<Cluster className=”org.apache.catalina.ha.tcp.SimpleTcpCluster”> 
클러스터 부분 주석을 해제한 후 뒤에 아래 내용 추가해줍니다.
 
– 서버 A 설정

<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=”10.4.0.23″
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”/>

<ClusterListener className=”org.apache.catalina.ha.session.ClusterSessionListener”/>
</Cluster>

 
– 서버 B 설정

<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=”10.4.0.28″
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”/>

<ClusterListener className=”org.apache.catalina.ha.session.ClusterSessionListener”/>
</Cluster>

 
Cluster 안의 노드들을 동적으로 구분하기 위해 Multicast IP 및 Port를 설정합니다. frequency 에 설정된 값을
기준으로 udp 패킷을 날려 heartbeat 를 확인합니다.
 
또한 Receiver 설정에서 replication 메시지 수신 포트를 4000~4100 포트로 지정해줬습니다.
 
위 설정을 진행한 뒤 톰캣 웹어플리에키션의 web.xml 파일 하단에 <distributable/> 을 추가해줌으로서 세션이 공유될
수 있게해줍니다.
 
– 서버 A, B 공통
# vi /usr/local/tomcat/conf/web.xml
# vi /usr/local/tomcat/webapps/ROOT/WEB-INF/web.xml
 
모든 설정이 완료되었으면 방화벽에 Multicast Port 및 replication 메시지 수신 포트를 추가해줍니다.
참고로 Multicast Port 의 경우 udp 도 허용해줘야합니다.
 
설정 후 톰캣을 재시작한 뒤 catalina.out 파일을 확인해보면 아래와 같은 로그를 확인할 수 있습니다.
 
 
이제 세션이 공유되는지 테스트를 위한 jsp 파일을 생성하여 테스트 해보겠습니다.
 
# cd /usr/local/tomcat/webapps/ROOT
# mv index.jsp index.jsp_ori
# vi index.jsp

<%
session.setAttribute(“a”,”a”);
%>

<html>
<head>
<title>Session Clustering Test</title>
</head>
<body>
<table width=”100%” border=”0″ cellspacing=”0″ cellpadding=”0″>
<tr bgcolor=”#CCCCCC”>
<td width=”13%”>Tomcat1</td>
<td width=”87%”> </td>
</tr>
<tr>
<td>Session ID :</td>
<td><%=session.getId()%></td>
</tr>
</table>
<div>Im Tomcat1</div>
</body>
</html>

서버 A 와 서버 B 가 구분되게 설정을 한 뒤 페이지에 접근해봅니다.

서버 A(tomcat1) 의 세션 ID 가 확인됩니다. 이제 서버 A 의 톰캣 데몬을 중지한 후에도 세션 ID 가

유지되는지 확인해보도록 하겠습니다.

서버 A 에서 톰캣을 중지하자 서버 B 의 catalina.out 에 위와 같은 로그가 남으며 아래와 같이 세션 ID가

유지되는 것을 확인할 수 있었습니다.

 

이상으로 톰캣 8.5 버전에서 세션 클러스터링 적용방법에 대해 알아봤습니다. 감사합니다.

Category: LINUX

Avatar

About the Author ()