본문 바로가기
개발/AWS

[AWS] Redis를 통한 Tomcat 세션 클러스트링

by HW프로젝트 2024. 7. 18.

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. 설정 결과 톰캣 두개중 한개가 다운되어도 세션이 유지됨을 확인 할 수 있다.

 

참고

https://velog.io/@whereisdw/Redis%EB%A5%BC-%ED%86%B5%ED%95%9C-Tomcat-Session-Cluster-%EA%B5%AC%EC%84%B1