본문 바로가기
CSP (Cloud Service Provider)/AWS

ElastiCache를 이용하여 톰캣 세션 클러스터링 실습

by BTC_홍대동무 2023. 12. 1.

베하~~!

BTC현상수배범입니다.

 

AWS EC2에서 톰캣을 사용한다면, 세션 클러스터링이 불가능합니다.

세션 클러스터링이 불가능한 이유는 AWS 네트워크는 멀티케스트를 지원하지 않기 때문입니다.

그렇기때문에 AWS EC2에 톰캣을 사용하실때는, 별도로 세션 관리를 위한 장치를 설치 진행해야합니다.

Amazon ElastiCache를 이용하여 톰캣 세션 클러스터링 실습을 진행하도록 하겠습니다.

사전 준비사항

  1. AWS ElastiCache Redis 준비 - ElastiCache가 아니어도 상관 없으나 테스트는 ElastiCache Redis로 진행
  2. ALB + 2대의 Tomcat 서버 준비 (정상동작 확인 후 진행)
  3. 작업 전 반드시 스냅샷 생성 (백업 용도)
  4. 참고자료

https://github.com/ran-jit/tomcat-cluster-redis-session-manager/wikihttps://velog.io/@whereisdw/Redis를-통한-Tomcat-Session-Cluster-구성https://1mini2.tistory.com/43

https://inpa.tistory.com/entry/WEB-🌐-세션Session-불일치-문제-해결법-⸢서버-다중화-환경-⸥

https://aws-solutions.tistory.com/5

https://github.com/ran-jit/tomcat-cluster-redis-session-manager/releases/tag/2.0.4

 

 

실습 진행 순서

1. ElastiCache → Redis 클러스터 생성 및 구성 정보

 

 

2. EC2 서버에 JDK & Tomcat 설치 및 버전 확인

yum install -y tomcat
# tomcat version
Server version: Apache Tomcat/7.0.76
Server built:   Aug 3 2023 15:20:07 UTC
Server number:  7.0.76.0
OS Name:        Linux
OS Version:     5.10.199-190.747.amzn2.x86_64
Architecture:   amd64
JVM Version:    17.0.9+8-LTS
JVM Vendor:     Amazon.com Inc.

 

3. redis jar 및 환경 파일 다운로드(링크에서 tomcat-cluster-redis-session-manager.zip을 다운로드)

 

wget https://github.com/ran-jit/tomcat-cluster-redis-session-manager/releases/download/2.0.4/tomcat-cluster-redis-session-manager.zip

 

4. 압축을 풀고 conf와 lib 폴더를 Tomcat 루트 폴더에 복사

unzip tomcat-cluster-redis-session-manager.zip
cp tomcat-cluster-redis-session-manager/lib/* /usr/share/tomcat/lib/
cp tomcat-cluster-redis-session-manager/conf/* /usr/share/tomcat/conf/

 

5. {tomcat_home}/conf 디렉토리에 있는 파일들을(redis-data-cache.properties, context.xml, web.xml) 수정

1) {tomcat_home}/conf/redis-data-cache.properties 설정을 수정

ElastiCache의 기본 엔드포인트 값으로 변경

 

2) {tomcat_home}/conf/context.xml 내용에 아래 항목을 추가

 

3) {tomcat_home}/conf/web.xml에서 세션 timeout을 설정(단위는 seconds)

4) session 체크를 위해 sample source를 배포

<%@page contentType="text/html; charset=UTF-8"%>
<%@ page import="java.text.*"%>
<%@ page import="java.util.*"%>
<%
  String RsessionId = request.getRequestedSessionId();
  String sessionId = session.getId();
  boolean isNew = session.isNew();
  long creationTime = session.getCreationTime();
  long lastAccessedTime = session.getLastAccessedTime();
  int maxInactiveInterval = session.getMaxInactiveInterval();
  Enumeration e = session.getAttributeNames();
%>
<html>
 <head>
  <meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
   <title>Session Test</title>
 </head>
 <body>
    <table border=1 bordercolor="gray" cellspacing=1 cellpadding=0 width="100%">
      <tr bgcolor="gray">
       <td colspan=2 align="center"><font color="white"><b>Session Info</b></font></td>
      </tr>
     <tr>
       <td>Server HostName</td>
       <td><%=java.net.InetAddress.getLocalHost().getHostName()%></td>
     </tr>
     <tr>
       <td>Server IP</td>
       <td><%=java.net.InetAddress.getLocalHost().getHostAddress()%></td>
     </tr>
     <tr>
       <td>Request SessionID</td>
       <td><%=RsessionId%></td>
     </tr>
     <tr>
       <td>SessionID</td>
       <td><%=sessionId%></td>
     </tr>
     <tr>
       <td>isNew</td>
       <td><%=isNew%></td>
     </tr>
     <tr>
       <td>Creation Time</td>
       <td><%=new Date(creationTime)%></td>
     </tr>
     <tr>
       <td>Last Accessed Time</td>
       <td><%=new Date(lastAccessedTime)%></td>
     </tr>
     <tr>
       <td>Max Inactive Interval (second)</td>
       <td><%=maxInactiveInterval%></td>
     </tr>
     <tr bgcolor="cyan">
       <td colspan=2 align="center"><b>Session Value List</b></td>
     </tr>
     <tr>
       <td align="center">NAME</td>
      <td align="center">VAULE</td>
     </tr>
<%
 String name = null;
 while (e.hasMoreElements()) {
 name = (String) e.nextElement();
%>
    <tr>
       <td align="left"><%=name%></td>
       <td align="left"><%=session.getAttribute(name)%></td>
     </tr>
<%
 }
%>
</table>
<%
 int count = 0;
 if(session.getAttribute("count") != null)
 count = (Integer) session.getAttribute("count");
 count += 1;
 session.setAttribute("count", count);
 out.println(session.getId() + " : " + count);
%>
  </body>
</html>

 

 

6. tomcat을 재기동하고 {ALB DNS}/로 접근해서 sessionID가 아래와 같이 유지되는지 확인

systemctl restart tomcat.service

 

 

7. 설정한 인스턴스로 이미지 생성후 EC2인스턴스 추가 구성 → ALB Target Group에 추가

 

 

8. 추가 EC2 인스턴스에도 sessionID가 유지되는 것을 확인 (데이터 정합성 문제 해결)

 

 

다음엔 더 즐거운 주제로 만나요~~

베빠~

 

'CSP (Cloud Service Provider) > AWS' 카테고리의 다른 글

[AWS] AWS Pinpoint  (1) 2023.12.07
[AWS] AWS Elastic Beanstalk  (1) 2023.12.05
[AWS] AWS CloudFront  (1) 2023.12.01
[AWS] EFS  (1) 2023.12.01
[AWS] 서버리스 기반 웹 애플리케이션 만들기 (1)  (0) 2023.11.27

댓글