AWS 레디스를 이용해서 톰캣 세션 클러스트링
로드밸런싱 (Load Balancing) ?
트래픽이 많을 때 여러 대의 서버가 분산처리하여 서버의 로드율을 증가, 부하량, 속도 저하 등 고려하여 분산 처리하여 해결해주는 서비스
로드밸런싱을 해주는 소프트웨어 혹은 하드웨어 장비를 로드밸런서(Load Balancer)
스티키 세션 (sticky session) ?
로드밸런서가 세션 기간 동안 동일한 클라이언트의 request를 항상 동일한 서버로 라우팅 해주는 기능
세션 클러스트링 (session clustring) ?
다중 서버 환경에서 로드밸런서를 통해 어떤 서버로 접속하든지 세션이 동일하게 유지되도록 설정해주는 것
1. 준비
Amazon ElastiCache Redis
Tomcat 설치된 인스턴스 1
Tomcat 설치된 인스턴스 2
2. Redis jar & 환경설정 파일 다운
자신에게 맞는 버전을 맞춰서 다운로드 한다.
https://github.com/ran-jit/tomcat-cluster-redis-session-manager/releases
Releases · ran-jit/tomcat-cluster-redis-session-manager
Tomcat clustering redis session manager java client. - ran-jit/tomcat-cluster-redis-session-manager
github.com
3. 다운 받았으면 압축을 해제하고 톰캣에 각각 설정 파일을 추가한다.
tomcat-cluster-redis-session-manager/lib/* ▶ {톰캣}/lib/

톰캣 경로로 이동전에 redis-data-cache.properties 파일을 열어서 설정을 해준다.

redis.hosts=<AWS Redis 구성 엔트포인트 주소>:<구성엔드포인트 포트>
redis.cluster.enabled=true 변경


tomcat-cluster-redis-session-manager/conf/* ▶ {톰캣}/conf/
4. 톰캣 설정
1) {톰캣}/conf/context.xml 파일을 열어서 수정한다.
<Context>
...
추가
<Valve className="tomcat.request.session.redis.SessionHandlerValve" />
<Manager className="tomcat.request.session.redis.SessionManager" />
...
</Context>
5. 세션 체크를 위해 검증 파일 생성 session_check.jsp
<%@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. 톰캣을 재기동 하고 session_check.jsp 에 접속하여 IP가 변경되는지 SessionID가 동일한지 확인한다.


7. 설정 결과 톰캣 두개중 한개가 다운되어도 세션이 유지됨을 확인 할 수 있다.
참고
'개발 > AWS' 카테고리의 다른 글
| [AWS] Application Load Balancer를 사용하여 한 도메인을 다른 도메인으로 리디렉션 (0) | 2025.05.27 |
|---|---|
| [AWS] Code Deploy 설정 (0) | 2025.04.07 |
| [AWS] ppk to pem / pem to ppk (1) | 2024.04.24 |