WEB WAS/WAS

[Tomcat] Redis 설정하기

홍또~ 2020. 6. 22. 09:37

※Redis 서버를 따로 구성한 상황에서, 세션클러스터링을 해야하는 Tomcat에서의 설정부분을 다룬다.

1. Tomcat경로 conf 아래에 redisson.conf 를 생성해준다(원래 없는 파일)

{
"singleServerConfig":{
"idleConnectionTimeout":10000,
"pingTimeout":1000,
"connectTimeout":10000,
"timeout":3000,
"retryAttempts":3,
"retryInterval":1500,
"password":null,
"subscriptionsPerConnection":5,
"clientName":null,
"address": "redis://redis ip넘버:redis 포트넘버",
"subscriptionConnectionMinimumIdleSize":1,
"subscriptionConnectionPoolSize":50,
"connectionMinimumIdleSize":32,
"connectionPoolSize":64,
"database":0,
"dnsMonitoringInterval":5000
},
"threads":0,
"nettyThreads":0,
"codec":{
"class":"org.redisson.codec.JsonJacksonCodec"
},
"transportMode":"NIO"
}

2.  Tomcat경로 conf 아래에 context.xml을 vi로 열어 다음을 추가해준다

 <Manager className="org.redisson.tomcat.RedissonSessionManager"
        configPath="${catalina.base}/conf/redisson.conf" readMode="REDIS"/>
 <Valve className="tomcat.request.session.redis.SessionHandlerValve" />
 <Manager className="tomcat.request.session.redis.SessionManager" />

 

여기서 catalina.base 경로는 Tomcat설치 경로이다.

3. Tomcat 버전에 맞게 redisson-tomcat-x-x.xx.x.jar를 다운받아 Tomcat lib경로에 넣어준다

-필자는 Tomcat 8.5를 사용하기 떄문에 redisson-tomcat-8-3.11.1.jar를 사용하였다.

4.Tomcat 버전에 맞게 redisson-all-x.xx.x.jar를 다운받아 Tomcat lib경로에 넣어준다

-필자는 Tomcat 8.5를 사용하기 떄문에 redisson-all-3.11.2.jar를 사용하였다.

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

에서 파일을 다운로드후 압축을 풀고 redis-data-cache.properties 파일을 톰캣 conf로, jar들을 톰캣 lib을 옮긴다.

6. redis-data-cache.properties 파일에서 redis.hosts=서버ip:redis포트 로 수정한다.

7. web.xml에서 적당하게 session 시간을 설정해준다

<session-config>
<session-timeout>200</session-timeout>
</session-config>

 

 

설정 후 재기동하고 Log를 보면 아래와 같이 redis서버와 연결이 되었다는 메세지가 출력되어있을 것이다.

edisson-netty-2-3] INFO org.redisson.connection.pool.MasterPubSubConnectionPool - 1 connections initialized for redis IP:redis Port
[redisson-netty-2-3] INFO org.redisson.connection.pool.MasterConnectionPool - 32 connections initialized for 1redis IP:redis Port

 

5.세션클러스터링 되었는지 확인하는 방법

<%@ page language="java" contentType="text/html; charset=EUC-KR"
        pageEncoding="EUC-KR"%>
<%@ 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>

위의 jsp를 생성한 후 호출한다

<호출 목록>

Server HostName TEST-WAS-01
Server IP 10.123.45.6
Request SessionID 74D2Q248A077E2B3357EH7U2AW45231G.jvm1
SessionID 74D2Q248A077E2B3357EH7U2AW45231G.jvm1
isNew false
Creation Time Wed Jun 17 11:27:21 KST 2020
Last Accessed Time Wed Jun 17 11:34:09 KST 2020
Max Inactive Interval (second) 1800
Session Value List
NAME VAULE
session:thisAccessedTime 1592361249644
session:isNew false
session:lastAccessedTime 1592361249644
session:maxInactiveInterval 1800
session:isValid true
session:creationTime 1592360841399
count 2

1) 해당 테이블에서 Server HostName,Server IP, SessionID 를 따로 적어 둔 후 새로고침을 했을때 해당 값을이 고정되면서 count가 올라가는지 확인한다.

2) Server HostName,Server IP를 확인하여 현재 붙은 Tomcat을 중지한다. 

3) 일정시간이 지난 후 새로고침을 했을때, Server HostName,Server IP는 바뀌고 SessionIDcount가 유지되었는지 확인한다.

4) 유지되었으면 세션클러스터링 성공!