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

Sticky Session과 Session Clustering

by BTC_작은뉴진 2023. 6. 2.

안녕하세요~ 뉴진쓰팀의 작은뉴진입니다!

 

오늘은 Sticky Session과 Session Clustering에 대해 말씀드리려고 해요~

바로 본론으로 들어가볼까요?


한 대의 서버로는 부족하게 되면 Scale Out을 해서 여러 서버에 로드밸런싱을 하게 되는데, 그렇게 되면 세션이 불일치할 수도 있어요..

 

예를 들어 고객이 서버 1에서 로그인을 하고 상품을 주문을 했는데 로드밸런싱 알고리즘으로 인해 서버1이 아닌 서버2로 요청이 됐지만 서버2에는 사용자의 로그인 정보가 없어서 다시 로그인을 하라고 할 수도 있는 것이죠~

 

 

근데 잠깐, 여기서 세션이란 무엇일까요?

 

세션이란 웹 사이트의 여러 페이지에 걸쳐 사용되는 사용자 정보를 저장하는 방법이라고 해요.

 

사용자 측의 컴퓨터에 모든 데이터를 저장하는 쿠키와는 다르게,

세션은 서비스가 돌아가는 서버 측에 데이터를 저장하고, 세션의 키값만을 사용자 측에 남겨두며,

브라우저는 필요할 때마다 이 키값을 이용하여 서버에 저장된 데이터를 사용하게 돼요.

 

 

그럼 이제 이러한 세션의 불일치를 해결하는 방법에 대해 알아보도록 해요!

 

 

Sticky Session

말 그대로 끈적끈적하게 고정된 세션을 말해요.

사용자가 처음 접속한 서버에만 고정이 되며 그 서버만 해당 사용자의 요청을 처리하는 방법이죠~

 

https://smjeon.dev/web/sticky-session/

 

하지만 이러한 방법에는 문제점이 있는데요,

여러 명의 사용자가 하나의 서버에만 고정이 되면 해당 서버에 트래픽이 집중된다는 점과,

서비스 중에 사용자가 고정되어 있는 서버에 장애가 발생하면 해당 서버에 고정되어 있는 사용자들은 세션 정보를 잃게 된다는 것이죠😭

이러한 문제점을 보완할 수 있는게 Session Clusteting 방법이에요.

 

 

Session Clustering

서버가 두 대 이상 있을 경우 세션 정보를 서로 공유하여 클러스터 내의 서버에서 동일한 세션을 관리하는 방법을 말해요.

예를 들어 서버 1에 로그인 세션이 저장되었다면 , 서버 2와 3에세도 로그인 세션이 남아있는 방법이죠.

 

https://smjeon.dev/web/sticky-session/

 

 

오늘은 AWS의 Elasticache for Reids를 사용하여 Session Clusting을 구현하는 방법을 실습해볼게요.

 

1. 먼저 Redis 클러스터를 생성해요

우선 Redis Cluster의 포토인 6379 포트를 열어주고 Redis 클러스터를 만들어 줍니다.

 

2. Tomcat 세션 테스트용 페이지를 만들어요

- JDK, Tomcat 설치

apt update && apt install wget unzip curl vim -y

# JDK 설치
apt install openjdk-11-jre -y

# Tomcat 설치
cd /usr/local
wget https://archive.apache.org/dist/tomcat/tomcat-9/v9.0.38/bin/apache-tomcat-9.0.38.zip
unzip apache-tomcat-9.0.38.zip
mv apache-tomcat-9.0.38 tomcat

cd /usr/local/tomcat/bin
chmod 755 *.sh

- tomcat-cluster-redis-session-manager 설치 & redis 엔드포인트 입력 & 설정

mkdir /usr/local/tomcat/download
cd /usr/local/tomcat/download
wget https://github.com/ran-jit/tomcat-cluster-redis-session-manager/releases/download/3.0.1.1/tomcat-cluster-redis-session-manager.zip
unzip tomcat-cluster-redis-session-manager.zip

cp tomcat-cluster-redis-session-manager/lib/* ../lib
cp tomcat-cluster-redis-session-manager/conf/* ../conf
vim /usr/local/tomcat/conf/redis-data-cache.properties

vim /usr/local/tomcat/conf/context.xml

# --- 내용 추가 ---
<Valve className="tomcat.request.session.redis.SessionHandlerValve" />
<Manager className="tomcat.request.session.redis.SessionManager" />
# ------

- index.jsp 수정

vim /usr/local/tomcat/webapps/ROOT/index.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>

- 작동 확인

cd /usr/local/tomcat/bin/
./catalina.sh run &

curl localhost:8080

 

3. 마지막으로 세션 테스트를 해볼거에요

서버가 바껴도 계속 Count가 바뀌는걸 볼 수 있죠~??


 

오늘은 Sticky Session과 Session Clustering에 대해 알아보고 Session Clustering을 테스트 해봤어요.

 

다음에는 더 재밌는 주제를 가지고 찾아올게요 베빠~~

 

댓글