Tomcat 8 + Memcached 기반 세션 클러스터링 구현 가이드

1. 사전 준비 사항

  • 모든 서버의 시간 동기화 (ntpdate 등 활용, 타임존 확인 필수)
  • 방화벽 비활성화 또는 필요한 포트(nginx 80, memcached 11211, tomcat 8080 등) 오픈
  • 필요 소프트웨어: nginx, memcached, tomcat 8, Java 8 이상

2. Nginx 및 Memcached 설치 및 구성

Nginx와 Memcached는 패키지 매니저(yum/apt)로 간단히 설치할 수 있습니다.

yum install nginx memcached -y
systemctl start nginx memcached
systemctl enable nginx memcached

Nginx 설정 파일 예시:

user nginx;
worker_processes 1;

events {
    worker_connections 1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for"';

    sendfile on;
    tcp_nopush on;
    keepalive_timeout 65;
    gzip on;

    upstream tomcat-web {
        server 192.168.0.14:8080;
        server 192.168.0.15:8080;
    }

    server {
        listen 80;
        server_name www.tomcat.com;

        location / {
            root html;
            index index.html index.htm index.jsp;
        }

        location ~* \.(jsp|do)$ {
            proxy_pass http://tomcat-web;
            proxy_redirect off;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
        }

        location /nginx_status {
            stub_status on;
            access_log off;
            allow 192.168.0.0/24;
            deny all;
        }

        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
            root html;
        }
    }
}

3. Tomcat 8 구성 및 Memcached 연동

3.1 필수 JAR 파일 다운로드

다음 JAR 파일들을 각 Tomcat 서버의 TOMCAT_HOME/lib 디렉토리에 복사합니다:

  • memcached-session-manager-*.jar
  • memcached-session-manager-tc8-*.jar
  • javolution-*.jar
  • kryo-*.jar (선택, 성능 향상에 도움)
  • reflectasm-*.jar (kryo 사용 시 필요)
  • asm-*.jar (kryo 사용 시 필요)
  • minlog-*.jar (kryo 사용 시 필요)

3.2 Tomcat server.xml 설정

각 Tomcat 서버의 conf/server.xml에서 사용할 Host(예: localhost) 내에 Context를 추가합니다.

Tomcat 서버 1 설정

<Host name="localhost" appBase="webapps"
      unpackWARs="true" autoDeploy="true">
    <Context path="/test" docBase="/usr/local/tomcat/webapps/test" reloadable="true">
        <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
                 memcachedNodes="n1:192.168.0.12:11211,n2:192.168.0.13:11211"
                 failoverNodes="n1"
                 requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
                 transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory" />
    </Context>
    <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
           prefix="localhost_access_log" suffix=".txt"
           pattern="%h %l %u %t &quot;%r&quot; %s %b" />
</Host>

Tomcat 서버 2 설정 (동일하게 memcachedNodes는 같고, failoverNodes를 n2로 지정해 각 서버의 로컬 memcached가 우선 사용)

<Host name="localhost" appBase="webapps"
      unpackWARs="true" autoDeploy="true">
    <Context path="/test" docBase="/usr/local/tomcat/webapps/test" reloadable="true">
        <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
                 memcachedNodes="n1:192.168.0.12:11211,n2:192.168.0.13:11211"
                 failoverNodes="n2"
                 requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
                 transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory" />
    </Context>
    <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
           prefix="localhost_access_log" suffix=".txt"
           pattern="%h %l %u %t &quot;%r&quot; %s %b" />
</Host>

3.3 테스트 JSP 페이지 생성

각 Tomcat 서버에 테스트 디렉토리와 JSP 파일을 생성합니다.

Tomcat 서버 1 (192.168.0.14)

mkdir -pv /usr/local/tomcat/webapps/test/WEB-INF/{classes,lib}
cat > /usr/local/tomcat/webapps/test/index.jsp << 'EOF'
<%@ page language="java" %>
<html>
<head><title>TomcatA</title></head>
<body>
    <h1><font color="red">TomcatA</font></h1>
    <table align="centre" border="1">
        <tr>
            <td>Session ID</td>
            <% session.setAttribute("tomcat","tomcat"); %>
            <td><%= session.getId() %></td>
        </tr>
        <tr>
            <td>Created on</td>
            <td><%= session.getCreationTime() %></td>
        </tr>
    </table>
</body>
</html>
EOF

Tomcat 서버 2 (192.168.0.15)

mkdir -pv /usr/local/tomcat/webapps/test/WEB-INF/{classes,lib}
cat > /usr/local/tomcat/webapps/test/index.jsp << 'EOF'
<%@ page language="java" %>
<html>
<head><title>TomcatB</title></head>
<body>
    <h1><font color="blue">TomcatB</font></h1>
    <table align="centre" border="1">
        <tr>
            <td>Session ID</td>
            <% session.setAttribute("tomcat","tomcat"); %>
            <td><%= session.getId() %></td>
        </tr>
        <tr>
            <td>Created on</td>
            <td><%= session.getCreationTime() %></td>
        </tr>
    </table>
</body>
</html>
EOF

3.4 Tomcat 재시작 및 테스트

systemctl restart tomcat   # 또는 startup.sh / shutdown.sh 스크립트 사용

웹 브라우저에서 http://www.tomcat.com/test/index.jsp로 접근합니다. 여러 번 새로고침해도 동일한 세션 ID가 유지되는지 확인합니다. (nginx가 로드밸런싱하더라도 세션이 유지됩니다.)

4. 확인 포인트

  • 세션 ID가 변경되지 않고 지속되는지 확인
  • 한쪽 Tomcat 서버를 중지해도 세션이 다른 서버에서 계속 사용되는지 테스트
  • Memcached에 세션 데이터가 저장되었는지 확인 가능 (memcached-stat 명령 또는 텔넷으로 확인)

태그: Tomcat Memcached Session Replication Load Balancing nginx

6월 7일 16:21에 게시됨