본문 바로가기
프로그램 활용/웹서버

아파치 톰캣 세션 클러스터링

by 3604 2023. 10. 24.
728x90

출처: https://jy-p.tistory.com/87

  • 아파치 톰캣이란?


클라이언트 요청이 왔을때만 응답하는 정적 웹페이지를 만드는데 사용하는 아파치(웹 서버)와 동적인 웹을 만들기 위한 웹 컨테이너, 서블릿 컨테이너 역할을 하는 톰캣(웹 애플리케이션 서버, WAS))을 합쳐서 부르는 말입니다.

 

 

  • 세션 클러스터링이란?


세션 클러스터링은 아파치 톰캣이 2대 이상 운영되는 환경에서 세션을 동일하게 관리하는 것을 의미합니다. 예를 들어 결제 시스템을 사용하는, 로드밸런서를 이용해 WAS)가 이중화 되어있는 환경에서 접속해있던 한 서버가 갑자기 다운되어 다른 서버로 넘어가는 경우 세션이 동일하게 유지되어야 하기 때문에 세션 클러스터링 설정이 필요합니다.

 

 

* 아파치, 톰캣, 커넥터 모두 설치 되었다는 가정하에 설정 부분만 정리했습니다.

 

 

  • apache-tomcat 연동

httpd.conf 파일을 열어 다음과 같은 설정이 되어있는지 확인 후 없으면 추가해줍니다.

 

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


* tomcat_lb는 workers.properties에서 설정한 worker.list 인스턴스 리스트를 기재한 것 입니다. (원하는 이름으로 써도됨)

 

 

 

  • workers.properties 설정
worker.list=tomcat_lb
// 사용할 tomcat 인스턴스 리스트

worker.tomcat1.type=ajp13
// tomcat1 인스턴스의 타입, ajp13 커넥터를 이용하여 통신

worker.tomcat1.host=10.4.0.10
// was1서버 IP

worker.tomcat1.port=8009
// ajp13 커넥터 포트

worker.tomcat1.lbfactor=100
// 로드밸런싱 비율(url - 현재 설정의 경우 100:100 = 1:1)


worker.tomcat2.type=ajp13
worker.tomcat2.host=10.4.0.14
worker.tomcat2.port=8019
worker.tomcat2.lbfactor=100

worker.tomcat_lb.type=lb
// tomcat_lb 인스턴스의 타입 , lb = 로드밸런서

worker.tomcat_lb.balanced_workers=tomcat1,tomcat2
// tomcat_lb의 리스트

 

 

 

  • tomcat의 server.xml 설정





저는 포트를 따로 변경해서 설정하였습니다.

설치 방법에 따라 ajp13 Connector 포트 설정 부분이 주석처리 되어있을 수 있으며, 그럴 경우 주석을 제거해주면 됩니다.
설정 후 톰캣 구동포트에 맞게 shutdown port(ex. 8005) 를 제외한 나머지 포트(ex. 8009, 8080)를 방화벽에 추가해줍니다.


또한 톰캣을 공식 홈페이지에서 다운로드 받았을 경우 ajp13 Connector 포트 설정 부분의 address 부분을 "::1" 에서 "::" 또는 "0.0.0.0"로 변경하며,  tomcat 7.0.100, tomcat 8.5.51, tomcat 9.0.31 이상 버전부터는 secretRequired="false"를 추가해줍니다.

* address : address=”::1” 로 설정시 localhost 만 접근 가능, “::” 로 설정하여야 외부에서 접근 가능
* secretRequired : secret key 통신 여부를 묻는 설정 (기본값 true, 상황에 맞게 설정하면 됨)

만약 secret key 사용한다면 다음과 같이 설정하면 됩니다.

Tomcat 7.0.100, tomcat 8.5.51, tomcat 9.0.31 하위 버전


ㄴ address=[Tomcat 서버 IP] requiredSecret=[원하는 키 값]


Tomcat 7.0.100, tomcat 8.5.51, tomcat 9.0.31 이상 버전


아파치 톰캣이 연동된 환경에선 아파치의 Workers File 에 아래 내용도 추가해줘야 합니다.

worker.[인스턴스명].secret=[Tomcat에 설정한 키 값]

 

 

  • 세션 확인 테스트 페이지 만들기 
tomcat 웹 다큐먼트 루트에 테스트 파일 생성
(index.jsp)
<%
session.setAttribute(url - "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(url - )%></td>
</tr>
</table>
<div>Im Tomcat1</div>
</body>
</html>


* 빨간 부분은 was서버 마다 다르게 설정합니다.

파일 생성 후 들어가면 세션 값이 다르게 나옵니다. 이제 세션 클러스터링을 설정을 해보겠습니다.

 

 

 

  • 세션 클러스터링

apache와 tomcat 연동 및 로드밸런싱 설정 후 세션 클러스터링 설정을 진행합니다. 설정 방법은 거의 동일하며 톰캣 버전이 올라감에 따라 클래스 명이 변경된 부분 등만 수정해주면 됩니다.

설정은 server.xml 파일 및 web.xml 파일에서 진행하며, 설치 방법에 따라 설정 파일 위치는 다를 수 있습니다.

 

server.xml
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
클러스터 관련 설정의 주석을 제거해준 뒤 아래 내용을 추가해줍니다.

<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>                                                                  // 주석 제거
<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="224.0.0.4"                                                                                                           // 멀티 캐스트 IP
port="45564"                                                                                                                         // 기본 포트
frequency="500"                                                                                                                  // 해당 초 마다 UDP packet 을 날려 hearbeat 확인
dropTime="3000"/>                                                                                                            // 해당 초 동안 hearbeat 없을 경우 장애로 판단
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
address="10.4.0.23"                                                                                                           // WAS IP에 맞게 수정
port="4000"                                                                                                                           // 해당 포트를 통해 replication message listening
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.MessageDispatch15Interceptor"/>
</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>

 

server.xml 설정을 한 뒤 web.xml 파일을 수정해줍니다. tomcat 설정파일 하단의 web.xml 파일 및 webapps/ROOT/WEB-INF 디렉토리 하단의 web.xml 파일 모두 수정해주면 됩니다.


* 톰캣 8, 9버전의 경우 위 설정에서 주황색으로 표시된 MessageDispatch15Interceptor 부분 MessageDispatchInterceptor 로 수정해주면 동일하게 동작합니다. 수정하지 않을 경우 catalina.out 로그에 java.lang.ClassNotFoundException 에러가 발생합니다.


 

web.xml
...(생략)
<distributable/>
</web-app>

web.xml 파일의 마지막 라인인 </web-app> 상단에 추가해줬습니다. 만약 추가하지 않을 경우 catalina.out 로그에 Context manager does not exist 라는 warning 메시지가 발생하며 세션 클러스터링 설정이 적용되지 않습니다

 

* 설정 후 멀티캐스트 Port인 45564 의 경우 TCP 와 UDP 모두 허용해줘야하며, listening 을 위한 Port 인 4000~4100번 포트의 경우 TCP 에 대해 허용해줍니다.

 

설정 완료 되었으며 tomcat 재실행 후 세션 테스트 페이지를 확인해 보면 됩니다.

확인 방법은 WAS) 1번과 WAS) 2번이 구동되어있는 상태에서 WAS) 1번 서버를 종료했을 때 세션 ID 가 유지되는지 테스트
해봅니다.

728x90