JBoss EAP 6의 HA(High Availability) 프로파일 환경에서 웹 애플리케이션의 세션 클러스터링을 구현하는 방법을 정리합니다.
<distributable/>선언부터 복제 트리거 설정, 그리고 웹 서버(Apache)와의 연동을 위한jvmRoute및 JGroups 네트워크 설정까지 다룹니다.
Test Environment
- Middleware: JBoss EAP 6.4 (Domain Mode)
- Profile: ha 또는 full-ha (클러스터링 모듈이 포함된 프로파일 필수)
1. 애플리케이션 설정 (Application Config)
세션 클러스터링이 작동하려면 먼저 애플리케이션이 "나는 분산 가능한 애플리케이션입니다"라고 선언해야 합니다.
1) web.xml 설정 (필수)
<distributable/> 태그가 없으면 JBoss는 해당 애플리케이션의 세션을 메모리에만 저장하고 복제하지 않습니다.
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" ...>
<distributable/>
<session-config>
<session-timeout>30</session-timeout> </session-config>
</web-app>
2) jboss-web.xml 설정 (옵션/상세 튜닝)
세션 복제의 빈도와 범위를 세밀하게 제어하려면 WEB-INF/jboss-web.xml 파일을 설정합니다.
<jboss-web>
<replication-config>
<cache-name>web</cache-name>
<!-- 복제 시점 결정 -->
<replication-trigger>SET_AND_NON_PRIMITIVE_GET</replication-trigger>
<!-- 복제 단위 결정 (SESSION: 전체 / ATTRIBUTE: 변경된 속성만) -->
<replication-granularity>SESSION</replication-granularity>
</replication-config>
</jboss-web>
SET: 세션 속성이 변경(setAttribute)될 때만 복제 (성능 우수).SET_AND_GET: 세션을 읽기만 해도 복제 (데이터 일관성 최우선).SET_AND_NON_PRIMITIVE_GET: (Default) 기본형이 아닌 객체를 읽거나 변경할 때 복제.
2. Sticky Session 설정 (jvmRoute)
웹 서버(Apache mod_jk/mod_cluster)가 로드밸런싱을 할 때, 사용자가 처음 접속한 JBoss 서버로 계속 요청을 보내게 하려면(Sticky Session), 세션 ID 뒤에 서버 식별자(jvmRoute)를 붙여야 합니다.
1) host.xml 설정 (서버별 식별자 부여)
각 서버 인스턴스에 고유한 jvmRoute 값을 시스템 프로퍼티로 정의합니다.
<servers>
<server name="Server01" group="main-server-group" auto-start="true">
<system-properties>
<!-- 이 값은 workers.properties의 워커 이름과 일치해야 함 -->
<property name="jvmRoute" value="Server01" boot-time="true"/>
</system-properties>
</server>
<server name="Server02" ...>
<system-properties>
<property name="jvmRoute" value="Server02" boot-time="true"/>
</system-properties>
</server>
</servers>
2) domain.xml 설정 (Web Subsystem 적용)
정의한 시스템 프로퍼티(${jvmRoute})를 웹 서브시스템의 instance-id로 매핑합니다.
<subsystem xmlns="urn:jboss:domain:web:2.2" default-virtual-server="default-host" instance-id="${jvmRoute}" native="false">
<connector name="http" protocol="HTTP/1.1" scheme="http" socket-binding="http"/>
<!-- AJP 커넥터 필수 (mod_jk 연동 시) -->
<connector name="ajp" protocol="AJP/1.3" scheme="http" socket-binding="ajp"/>
...
</subsystem>
3. JGroups 네트워크 설정 (UDP vs TCP)
JBoss 클러스터링 멤버 간의 통신은 기본적으로 UDP(Multicast)를 사용합니다. 하지만 클라우드 환경이나 네트워크 장비에서 멀티캐스트를 차단하는 경우 클러스터링이 되지 않습니다. 이럴 땐 TCP(Unicast)로 변경해야 합니다.
domain.xml 수정
jgroups 서브시스템의 default-stack 속성을 변경합니다.
<!-- 기존 UDP 설정 -->
<subsystem xmlns="urn:jboss:domain:jgroups:1.1" default-stack="udp">
<!-- TCP로 변경 -->
<subsystem xmlns="urn:jboss:domain:jgroups:1.1" default-stack="tcp">
<stack name="tcp">
<transport type="TCP" socket-binding="jgroups-tcp"/>
...
</stack>
</subsystem>
MPING(멀티캐스트 기반 멤버 검색) 대신 TCPPING을 사용하여 정적으로 IP 리스트를 지정해야 서로를 찾을 수 있는 환경이 많습니다. 네트워크 구성에 따라 추가 설정이 필요합니다.
4. 검증 (Verification)
- 서버 기동 확인: 서버 시작 로그에
Received new cluster view메시지가 나타나며 멤버들이 서로를 인식하는지 확인합니다. - 세션 ID 확인: 브라우저 개발자 도구(F12)에서
JSESSIONID쿠키 값 뒤에.Server01처럼 jvmRoute 값이 붙는지 확인합니다. - Failover 테스트: 한 쪽 서버를 강제로 내린 후(Shutdown), 다른 서버에서 로그인 풀림 없이 세션이 유지되는지 테스트합니다.