"오늘의 문제를, 내일의 기록으로 남깁니다."

막연한 이론보다, 구체적인 코드가 필요할 때. 직접 겪고 해결한 문제들을 기록합니다. 실무에서 부딪히는 진짜 이슈와, 내가 이해한 방식 그대로 정리한 가이드입니다.

웹개발/서버 운영 & 인프라

Tomcat 세션 클러스터링, Redis 없이 DeltaManager로 구현하는 방법

자바를잡아 2025. 6. 26. 19:40
반응형

Redis 없이 Tomcat 세션 클러스터링 구현 방법 (DeltaManager vs BackupManager)

Tomcat 클러스터링을 구성할 때 많은 개발자들은 Redis 같은 외부 세션 저장소를 떠올립니다. 하지만 Redis 없이도 Tomcat 자체 기능으로 세션을 공유할 수 있습니다. 이 글에서는 Redis 없이 세션 클러스터링을 구성하는 방법과 실무에서 가장 많이 쓰는 DeltaManager / BackupManager 설정 방법을 소개합니다.

✅ 목차

  • Tomcat 세션 클러스터링이란?
  • Redis 없이 가능한 세션 공유 방식
  • DeltaManager vs BackupManager 비교
  • 실제 설정 예제
  • 주의사항 및 실무 팁

📌 Tomcat 세션 클러스터링이란?

세션 클러스터링(Session Clustering)이란, 하나의 서버에서 생성된 세션을 다른 서버에서도 접근 가능하게 만들어주는 기술입니다.
로드밸런싱 구조에서 세션이 공유되지 않으면 로그인 유지가 불가능하므로, 반드시 구현해야 합니다.

📌 Redis 없이 가능한 세션 공유 방식

Tomcat은 Redis 없이도 자체적으로 세션 복제 기능을 제공합니다. 대표적으로 다음 두 가지 방식이 있습니다:

방법설명
DeltaManager변경된 세션만 복제 (성능 ↑, 안정성 ↓)
BackupManager세션 전체를 백업 (안정성 ↑, 자원 소모 ↑)

📌 DeltaManager vs BackupManager 비교

항목DeltaManagerBackupManager
복제 방식변경분만 전송전체 세션 백업
동기화 타이밍실시간요청 시점에 따라 다름
성능빠름느림
안정성세션 유실 위험 ↑복구 정확도 ↑
실무 추천세션 작을 때 적합세션 클 때 적합

📌 Tomcat 세션 클러스터링 설정 예제 (DeltaManager)

[context.xml 공통 설정]

<Context>
    <Manager className="org.apache.catalina.ha.session.DeltaManager"
             expireSessionsOnShutdown="false"
             notifyListenersOnReplication="true" />

    <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
             channelSendOptions="8">

        <Channel>
            <Membership className="org.apache.catalina.tribes.membership.McastService"
                        address="228.0.0.4"
                        port="45564"
                        frequency="500"
                        dropTime="3000" />
            <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
                      address="auto"
                      port="4000"
                      autoBind="100"
                      selectorTimeout="5000"
                      maxThreads="6" />
            <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
                <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender" />
            </Sender>
        </Channel>

        <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
               filter=".*\.jsp" />

        <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
                  tempDir="/tmp/war-temp/"
                  deployDir="/tmp/war-deploy/"
                  watchDir="/tmp/war-listen/"
                  watchEnabled="false" />
    </Cluster>
</Context>

🔁 이 설정은 모든 Tomcat 인스턴스에 동일하게 적용해야 합니다.

📌 실무 팁

  • Sticky Session 없이도 세션 유지 가능 (로드밸런서에서 세션공유 허용해야 함)
  • 세션에 저장되는 객체는 반드시 Serializable 구현 필요
  • Tomcat 간 시스템 시간이 다르면 세션 복제가 꼬일 수 있음 → NTP 동기화 필수
  • 업로드나 대용량 세션 데이터 공유는 피할 것

✅ 마무리

Redis가 없어도 충분히 세션 클러스터링은 가능합니다. 특히 레거시 JSP 시스템이나 내부망 시스템

🔔 다음 글 예고

[Tomcat + Apache 로드밸런싱 구성 방법 - mod_jk vs mod_proxy]

반응형