16장. JBoss EAP 클러스터링
자바기반의 웹 애플리케이션 서버를 사용한 대규모 웹 시스템이 많아지면서 24시간 365일 안정적인 서비스를 제공하면서도 앞으로의 확장성을 보장할 수 있도록 구성하는 것이 매우 중요하게 되었다. 이번 장에서는 웹 애플리케이션 서버를 사용하여 고가용성이 요구되는 웹 시스템을 구축하는 컨설턴트나 관리자, 개발자들에게 JBoss EAP 6 를 활용하기 위해 필요한 내용과 배경 지식에 대해 설명한다.
1.클러스터링 이해
클러스터(Cluster)란 네트워크를 이용하여 마치 하나의 컴퓨터처럼 동작하도록 여러 대의 컴퓨터를 연결하여 구성하는 것을 말한다. 즉 여러 대의 서버들 전체를 한 대의 서버 시스템과 같이 동작하게 하는 기술이나 기능을 말한다. 클라이언트 입장에서는 특정 서버의 상태에 의존하지 않고 클러스터로 묶인 서버 그룹을 마치 하나의 서버에서 서비스를 제공하는 것으로 인식한다. 클러스터 내의 어떤 서버로 접속하든지 동일하게 처리되기 때문에 클라이언트의 요청을 클러스터 멤버에 분산하여 처리하는 것이다. 이렇게 처리함으로써 클라이언트는 여러 개의 서버를 묶은 클러스터가 마치 하나의 서버인 것처럼 보이게 된다.
확장성과 고가용성이 요구되는 웹 시스템에서는 각각의 레이어 마다 고유의 클러스터링 기술을 사용하고 있다. JBoss EAP6를 사용한 웹 시스템 구축에서도 로드밸런싱과 페일오버(failover)를 위해서 클러스터링 기능을 사용한다. JBoss 는 자바 프로세스 단위로 클러스터링을 구성하며, 서버의 물리적인 위치에 관계없이 구성이 가능하다.
특히 고가용성이 요구되는 미션 크리티컬 업무에서 클러스터링은 매우 중요하다. 예를 들어 금융권에서의 인터넷 뱅킹 시스템, 제조업에서 생산공정관리 시스템, 온라인 쇼핑몰 시스템 등의 서비스에서 클러스터를 이용하여 마치 하나의 서버에서 제공하는 것처럼 구성한다. 클러스터링을 통해 특정 서버 장애가 전체 서비스에 영항을 미치지 않도록 구성하는 것이 매우 중요하다.
클러스터를 구성하는 목적은 크게 두 가지로 부하 분산(Load Balancing)과 고가용성(High Availability)이다.
-
부하 분산(Load Balancing)
부하 분산은 클러스터 앞 단에서 모든 클러스터 멤버로 부하를 균등하게 분산하는 것이다. 이론적으로 클러스터를 사용하면 처리량은 클러스터를 구성하는 서버들의 성능을 합친 것이 된다. 처리량을 늘리고 싶다면, 클러스터에 새로운 서버를 추가하여 전체 클러스터의 처리량을 늘릴 수 있다.

그림 1. 로드 밸런서의 역할
-
고가용성(HA ; High Availability)
고가용성은 클러스터 멤버에 장애가 발생할 경우 다른 멤버가 그 역할을 대신할 수 있도록 하는 것이다. HA 클러스터링은 서비스의 다운 타임을 줄여 준다.
클러스터의 한 서버가 중지될 경우에 다른 서버가 그 역할을 대신(Failover) 처리하여 고가용성을 제공한다. 클러스터링을 구성하여 서비스를 중단 없이 항상 사용 가능한 상태를 유지할 수 있다.

그림 2. 웹 애플리케이션 서버의 HA기능
-
JBoss EAP 6 클러스터
JBoss EAP 6에서는 웹 애플리케이션, EJB 애플리케이션, JMS 기능에 각각 클러스터링을 적용할 수 있다. JBoss EAP 6에는 설정을 편하게 할 수 있도록 프로파일 단위로 클러스터링이 가능한 구성 설정 파일을 제공하고 있다. 파일명의 뒷부분에 ha, full-ha 프로파일이 클러스터링을 제공하는 프로파일이다. 클러스터링을 구현하는 핵심기술은 요청에 대한 로드 밸런싱과 상태를 복제하는 기술이다.
먼저 클러스터링을 구현하기 위한 핵심 기술에 대해서 살펴보고, 웹 애플리케이션, EJB 애플리케이션, JMS에 대한 클러스터링 설정 방법을 설명한다.
2.클러스터링의 핵심기술
JGroups
JGroups는 멀티캐스트 프로토콜을 사용하여 신뢰성 높은 통신을 할 수 있도록 구현된 네트워크 통신 라이브러리이다. JBoss EAP 6의 클러스터링 구현, Infinispan의 네트워크 캐시 구현, HornetQ의 클러스터링 구현 등에 JGroups(http://www.jgroups.org)가 사용된다.
JGroups에서 중요한 프로토콜은 가입과 탈퇴(JOIN/REMOVE), 장애 감지(FD, FD_SOCK) 파티션 결합(MERGE), PING이다.
| 항목 | 설명 |
|---|---|
| 가입(JOIN) | JGroups를 시작할 때 만들어지는 멀티캐스트 그룹 가입을 위한 방식이다. 처음으로 가입하여 다른 멤버가 없으면 리더(코디네이터)가 된다. 멤버가 있으면 기존 리더에게 참가 요청을 하여 멤버 리스트에 추가해 달라고 한다. 그러면 리더가 그룹에 속한 모든 멤버들에게 클러스터 멤버 리스트를 배포하고 정보를 공유한다. |
| 탈퇴(REMOVE) | 탈퇴(REMOVE)은 JGroups 정지시 멀티캐스트 그룹에서 탈퇴하기 위한 것이다. 리더가 아닌 일반 멤버가 탈퇴하는 경우에는 리더가 클러스터 멤버 리스트를 업데이트하고 다른 멤버에게 배포한다. 리더 자신이 탈퇴하는 경우엔 두 번째 멤버가 리더가 되고 클러스터 멤버 리스트를 업데이트하여 다른 멤버에게 배포한다. 마지막 멤버가 탈퇴하면 그 그룹은 없어진다. |
| 장애 감지(FD) | 장애 감지(FD; Failure Detection)는 Heart Beat 메시지를 사용하여 오류가 발생한 멤버를 감지하는 것이다. 각 멤버는 Heart Beat 메시지를 수신하면 응답 메시지를 보내 정상적인 상태 임을 알려야 한다. 지 정한 타임아웃 시간 동안 재시도하여 응답을 받지 못하면, 멤버에 오류가 발생한 것으로 간주하여 클러스터 멤버에서 제거한다. |
| 장애 감지 소켓(FD_SOCK) | 장애 감지 소켓(FD_SOCK)은 클러스터 멤버들간에 TCP 소켓으로 A → B → C → A처럼 링 모양으로 연결하여 상태를 모니터링하기 위한 프로토콜이다. 링 모양이기 때문에 각 멤버는 그 이웃 멤버만 감시하게 된다. 멤버 B가 정상 종료할 때는 멤버 A에 메시지를 보내 종료되는 것을 알려준다. 만약, 멤버 B에 장애가 발생하여 갑자기 종료되면, 멤버 A는 연결된 소켓이 비정상 종료되는 것을 감지할 수 있다. 장애를 감지하면 확인 단계를 거치고 장애가 확실하면 클러스터 멤버 리스트에서 삭제한다. |
| 파티션 결합 (MERGE2) | MERGE는 통신 장애 등 여러 가지 이유로 멀티캐스트 그룹이 여러 개로 나뉜 경우 쪼개진 그룹을 하나로 결합하기 위한 것이다. 리더(코디네이터)는 주기적으로 리더가 여기 있다는 멀티캐스트 메시지를 보낸다. 만약 그룹이 쪼개져서 만들어진 다른 그룹의 리더가 이 메시지를 받으면 결합 프로세스를 시작한다. {A, B}와 {C, D, E}을 결합하여 하나의 {A, B, C, D, E}의 그룹으로 만든다. |
| PING | 처음 클러스터의 멤버를 발견하는 데 사용하는 프로토콜이다. 멀티캐스트 주소에 MPING 요청을 보내서 리더(코디네이터)를 찾고 다른 멤버들을 찾는다. 멀티캐스트를 사용할 수 없는 환경에서는 TCPPING이나 GOSSIP 서버를 이용한 TCPGOSSIP, 공유 파일 시스템을 이용한 FILE_PING, 데이터베이스 테이블을 사용하는 JDBC_PING, 아마존 AWS 환경에서 S3(Simple Storage Service)를 사용한 S3_PING, 오픈스택의 Swift를 사용한 SWIFT_PING등 다양한 방식의 PING을 설정할 수 있다. |
표 1. JGroups의 주요 프로토콜
JBoss EAP 6에서는 ha, full-ha 프로파일에 jgroups 서브 시스템이 설정되어 있다. jgroups 서브시스템에는 멀티캐스트를 사용하는 udp 프로토콜 스택과 TCP를 사용하는 tcp 프로토콜 스택이 정의되어 있고, 기본적으로 udp 프로토콜을 사용하도록 설정되어 있다. 아래의 내용을 살펴보면, 방금 설명한 FD, FD_SOCK, PING등 여러 가지 복잡한 값들이 설정되어 있다. 대부분 기본값을 그대로 사용하면 된다.
<subsystem xmlns="urn:jboss:domain:jgroups:1.1" default-stack="udp">
<stack name="udp">
<transport type="UDP" socket-binding="jgroups-udp"/>
<protocol type="PING"/>
<protocol type="MERGE3"/>
<protocol type="FD_SOCK" socket-binding="jgroups-udp-fd"/>
<protocol type="FD"/>
<protocol type="VERIFY_SUSPECT"/>
<protocol type="pbcast.NAKACK"/>
<protocol type="UNICAST2"/>
<protocol type="pbcast.STABLE"/>
<protocol type="pbcast.GMS"/>
<protocol type="UFC"/>
<protocol type="MFC"/>
<protocol type="FRAG2"/>
<protocol type="RSVP"/>
</stack>
<stack name="tcp">
<transport type="TCP" socket-binding="jgroups-tcp"/>
<protocol type="MPING" socket-binding="jgroups-mping"/>
<protocol type="MERGE2"/>
<protocol type="FD_SOCK" socket-binding="jgroups-tcp-fd"/>
<protocol type="FD"/>
<protocol type="VERIFY_SUSPECT"/>
<protocol type="pbcast.NAKACK"/>
<protocol type="UNICAST2"/>
<protocol type="pbcast.STABLE"/>
<protocol type="pbcast.GMS"/>
<protocol type="UFC"/>
<protocol type="MFC"/>
<protocol type="FRAG2"/>
<protocol type="RSVP"/>
</stack>
</subsystem>
다음과 같이 default-stack을 tcp로 변경하면 TCP를 사용하도록 변경할 수 있다.
<subsystem xmlns="urn:jboss:domain:jgroups:1.1" default-stack="tcp">
멀티캐스트 통신
멀티캐스트 통신은 특정 주소에 참여하는 모든 호스트에 동시에 같은 메시지를 전송하는 통신 방식이다. 멀티캐스트에 사용하는 주소는 IP 주소 상의 D 클래스로 앞의 4 비트가 1110인 224.0.0.0 ~ 239.255.255.255 범위의 주소를 사용한다. 라우터에서 사용하도록 예약된 주소가 있어 실제로 애플리케이션에서 사용할 수 있는 주소는 224.0.1.0 ~ 238.255.255.255 이다.

그림 3. 멀티캐스트 주소
멀티캐스트 통신의 장점은 패킷이 멀티캐스트 그룹 단위로 하나만 전송되기 때문에 네트워크 트래픽이 혼잡해지지 않는다는 것이다. 유니캐스트는 멤버 수만큼 여러 번 패킷을 전송해야 한다.
호스트에 여러 개의 네트워크 인터페이스 카드가 있으면 첫 번째 인터페이스를 멀티캐스트 통신에 사용한다. 다음과 같이 설정하면 지정된 인터페이스 카드를 통해 멀티캐스트 통신할 수 있다.
$ route add-net 231.12.21.0 netmask 255.255.255.0 <인터페이스>
IPv6를 사용할 수 있는 운영체제에서는 기본적으로 소켓이 IPv6를 사용하기 때문에 Java가 IPv6를 사용한다. IPv4를 사용하도록 설정하려면 Java 실행 시 다음 옵션을 지정한다.
-Djava.net.preferIPv4Stack=true
멀티캐스트 테스트
멀티캐스트는 먼저 운영체제에서 멀티캐스트할 수 있게 설정되어야 하며, 사용하는 라우터에서도 멀티캐스트 프로토콜을 지원해야 한다. 멀티캐스트가 가능한 환경인지 테스트하는 있는 방법이 필요하다.
jgroups 라이브러리에는 마치 채팅과 같이 멀티캐스트를 사용하여 메시지를 보내는 테스트 애플리케이션을 제공하고 있다.
다음 명령으로 지정한 멀티캐스트 IP, 포트에 참여하여 메시지를 수신하는 애플리케이션을 시작한다.
$ java -cp jgroups-3.2.5.Final.jar org.jgroups.tests.McastReceiverTest -mcast_addr 224.10.10.10 -port 5555
다음 명령으로 지정한 멀티캐스트 IP, 포트로 메시지를 보내는 애플리케이션을 실행하여, 멀티캐스트로 전송할 텍스트 메시지를 입력한다.
$ java -cp jgroups-3.2.5.Final.jar org.jgroups.tests.McastSenderTest -mcast_addr 224.10.10.10 -port 5555
Socket #2=0.0.0.0/0.0.0.0:5555, ttl=32, bind interface=/192.168.0.23
Socket #4=0.0.0.0/0.0.0.0:5555, ttl=32, bind interface=/127.0.0.1
> test
먼저 실행한 멀티캐스트 수신 애플리케이션에 메시지가 수신되면, 멀티캐스트 통신이 정상적으로 동작하는 것이다.
$ java -cp jgroups-3.2.5.Final.jar org.jgroups.tests.McastReceiverTest -mcast_addr 224.10.10.10 -port 5555
Socket=0.0.0.0/0.0.0.0:5555, bind interface=/192.168.0.28
Socket=0.0.0.0/0.0.0.0:5555, bind interface=/127.0.0.1
test [sender=192.168.0.23:5555]
test [sender=192.168.0.23:5555]
3.웹 애플리케이션 클러스터링
웹 애플리케이션의 클러스터링은 로드 밸런싱과 세션 복제 두 가지 기능이 있다. 일반적인 구성은 다음 그림과 같다.

그림 4. 웹 애플리케이션의 클러스터링 구성
로드 밸런싱
웹 애플리케이션에서 로드 밸런싱은 웹 서버에서 요청을 여러 대의 웹 애플리케이션 서버로 분배하는 기능이다. 이러한 방법으로 여러 서버로 부하를 분산하여, 특정 서버에만 부하가 많아지지 않도록 한다. 또, 설정을 통해 특정 서버 노드에만 부하를 더 주는 것도 가능하다. JBoss EAP 6에서는 웹 서버에서 사용할 수 있는 두 가지 로드 밸런싱 방법이 제공된다.
-
mod_jk 커넥터
mod_jk는 웹 서버에 설치하는 로드 밸런싱 모듈이다. 애플리케이션 서버와 통신에 AJP 프로토콜을 사용한다.
-
mod_cluster 커넥터
mod_cluster는 jboss.org에서 개발되고 있는 Apache 웹 서버와 함께 구성하는 로드 밸런싱 방법이다. 옵션을 웹 서버가 아닌 JBoss에서 설정할 수 있다.
mod_jk 커넥터와 mod_cluster 커넥터에 대한 상세한 내용은 뒷장에서 설명한다.
세션 복제
로드 밸런서는 효율적인 세션의 관리를 위해 스티키(Sticky) 세션을 사용한다. 최초로 접속한 서버에 세션을 저장하고 계속 해당 서버로만 요청을 한다. 장애가 발생하여 접속한 애플리케이션 서버가 정지해 버리면, 로드밸런스는 다른 서버로 요청을 다시 전송한다. 이때, 요청을 받은 서버에 장애가 발생한 서버에서 생성된 세션 정보가 없으면 더 이상 처리할 수 없다. 일반적으로 세션에는 로그인 정보가 포함되어 있는데, 페일오버 되었을 경우 세션 정보가 없으면 로그아웃된 것으로 인식한다. 이러한 경우를 대비하여 세션 정보를 미리 다른 서버에 전송하고 동기화한다. 이런 기능이 세션 복제이다.
세션 복제 시 주의점
- 클러스터의 SPOF(Single Point Of Failure)를 방지하려면 세션을 하나 이상의 다른 서버에 복제해야 한다.
- HTTP 세션에 저장되는 값은 직렬화(Serializable)된 값이어야 한다.
- 멀티캐스트 주소가 같으면 같은 클러스터로 묶이게 된다. 서로 다른 서비스는 서로 다른 멀티캐스트 주소를 사용해야 한다.
- 성능을 위해서는 내부 클러스터링용으로 별도의 NIC를 사용하는 것이 좋다.
세션 복제 설정 방법
웹 애플리케이션에서 세션 클러스터링을 구성할 때 목적에 따라 적합한 로드 밸런스 모듈과 세션 복제 방법을 결정해야 한다.
| 구분 | 설명 |
|---|---|
| mod_jk를 이용한 로드 밸런싱 | 로드밸런싱은 기본적으로 웹 서버에서 제공되는 기술이다. mod_jk 로드 밸런싱을 사용하려면, JBoss EAP 6에서는 AJP 커넥터 설정만 하면 된다. ha, full-ha 프로파일에 AJP 커넥터가 설정되어 있다. mod_jk는요청 수나 세션 수를 기반으로 로드 밸런스할 수 있고, Cookie를 이용한 부하분산 설정도 가능하다. 또, 세션유지 관리를 위한 스티키(Sticky) 세션 기능도 제공한다. |
| mod_cluster를 이용한 로드 밸런싱 | mod_cluster 로드밸런싱을 사용하려면, 웹 서버의 설정뿐만 아니라 JBoss EAP 6의 mod_cluster도 설정해야 한다. ha, full-ha 프로파일에 modcluster 서브시스템이 설정되어 있다. mod_cluster는 CPU 부하나 메모리 상황 등에 따라 동적으로 로드 밸런싱 할 수 있다. JBoss 인스턴스 자동 등록, 동적으로 부하를 계산하여 로드 밸런싱하는 등 클라우드 환경를 지원하기 위한 많은 기능을 제공한다. mod_cluster와 애플리케이션 서버간 통신에는 AJP 프로토콜뿐만 아니라 HTTP, HTTPS 프로토콜도 사용할 수 있고, 스티키(Sticky) 세션도 지원한다. |
표 2. 로드 밸런싱 모듈 비교
ha, full-ha 프로파일에는 세션이 복제되도록 설정되어 있기 때문에, 이 프로파일을 사용하는 JBoss EAP 6 인스턴스를 여러 개 기동하면, 자동으로 클러스터를 구성하여 세션을 복제한다.
22:55:56,248 INFO [org.jboss.as.clustering.infinispan] (ServerService Thread Pool -- 56) JBAS010281: Started default-host/session cache from web container
22:55:56,255 INFO [org.jboss.as.clustering.infinispan] (ServerService Thread Pool -- 55) JBAS010281: Started repl cache from web container
22:55:56,264 INFO [org.jboss.as.clustering] (MSC service thread 1-2) JBAS010238: Number of cluster members: 2
실제 세션이 복제되려면, 웹 애플리케이션에 세션을 복제하겠다는 설정이 필요하다. 웹 애플리케이션의 설정이 없으면 ha 프로파일을 사용하여 클러스터링이 구성되어 있어도, 세션은 복제되지 않는다. 웹 애플리케이션에 세션을 복제하겠다는 설정은 web.xml 파일에 <distributable/> 태그를 추가하면 된다.
다음은 web.xml에 <distributable/>을 추가한 예이다.
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>session</display-name>
<distributable/>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
이외에는 일반 웹 애플리케 이션을 작성하는 방법과 같다.
세션 복제 상세설정
WEB-INF/jboss-web.xml 파일에서 세션 복제에 대한 상세한 설정을 지정할 수 있다. 다음은 세션 설정의 예이다.
<jboss-web>
<context-root>/</context-root>
<replication-config>
<cache-name>custom-session-cache</cache-name>
<replication-trigger>SET</replication-trigger>
<replication-granularity>ATTRIBUTE</replication-granularity>
<use-jk>false</use-jk>
<max-unreplicated-interval>30</max-unreplicated-interval>
<snapshot-mode>INSTANT</snapshot-mode>
<snapshot-interval>1000</snapshot-interval>
<session-notification-policy>com.example.CustomSessionNotificationPolicy</session-notification-policy>
</replication-config>
</jboss-web>
세션이 언제 복제될 것인지를 <replication-trigger>를 사용하여 설정할 수 있다. 사용할 수 있는 옵션은 다음과 같다.
- SET : 세션이 설정될 때 복제
- SET_AND_GET : 세션을 읽기만 해도 복제
- SET_AND_NON_PRIMITIVE_GET : 세션이 설정될 때와 Java의 Primitive 타입이 아닌 타입은 읽을 때도 복제. 기본 설정값.
또, <replication-granularity>를 사용하여 세션 복제 범위를 지정할 수 있다. 기본값은 SESSION으로 세션에 보관된 객체 전체를 복제한다. 애트리뷰트 (attribute)를 사용하면 세션 객체 중 변경된 애트리뷰트 (attribute)만 복제하기 때문에 세션 복제 속도를 크게 향상할 수 있다.
세션 타임아웃 설정
HTTP 프로토콜은 연결되지 않은 상태로 통신하기 때문에 브라우저의 쿠키와 서버의 세션을 사용하여 서로의 상태를 유지한다. 연결되지 않은 상태이기 때문에 사용자가 웹 애플리케이션을 계속 사용하고 있는지 판단할 수 없다. 그래서 지정된 시간 동안 세션을 사용하지 않으면, 그 세션을 삭제하는 세션 타임아웃 기능을 사용한다. 웹 애플리케이션의 세션 타임아웃은 web.xml 파일의 <session-config>에서 설정한다. jboss-web.xml 파일에서도 세션 타임아웃값을 다음과 같이 설정할 수 있다.
<jboss-web>
<session-config>
<session-timeout>120</session-timeout>
</session-config>
</jboss-web>
세션 Passivation
세션에 너무 많은 데이터가 들어 있으면 어떻게 될까? 세션은 기본적으로 메모리, 즉 Java의 Heap메모리를 사용하기 때문에 OutOfMemory 오류가 발생할 수 있다. 그래서 기본적으로 세션에는 최소한의 값만 저장하는 것이다.
하지만 이미 개발된 애플리케이션을 수정하기 어렵다면 이런 방법을 사용할 수 있다.
패시베이션(Passivation)은 자주 사용되지 않는 세션을 메모리에서 삭제하고 디스크에 저장하여 메모리를 효율적으로 사용하는 방법이다. 반대로 액티베이션(Activation)은 디스크에 저장된 데이터를 메모리에 읽어 들이는 것을 말한다.
HTTP 세션의 패시베이션은 다음 3가지 상황에서 발생한다.
- 새로운 세션을 만들려고 할 때, 이미 최대 액티브 세션 수를 넘었기 때문에 서버는 세션 일부를 디스크에 저장하고 새 세션을 만든다.
- 주기적으로 백그라운드 작업을 통해 세션을 디스크에 저장한다.
- 웹 애플리케이션이 배포되어 있고 새로 배포되는 웹 애플리케이션의 세션 관리자가 다른 서버의 세션 백업 본을 가져오는 경우에 세션이 패시베이션 될 수 있다.
세션 패시베이션 설정
세션 패시베이션은 애플리케이션 WEB_INF/jboss-web.xml 파일에 설정한다.
<jboss-web>
<max-active-sessions>20</max-active-sessions>
<passivation-config>
<use-session-passivation>true</use-session-passivation>
<passivation-min-idle-time>60</passivation-min-idle-time>
<passivation-max-idle-time>600</passivation-max-idle-time>
</passivation-config>
</jboss-web>
세션 패시베이션 설정 항목들은 다음과 같다.
| 구분 | 설명 | 기본값 |
|---|---|---|
<max-active-sessions> | 허용되는 세션의 최대 수. 패시베이션을 사용할 때 세션 수가 이 값을 초과하면 설정된 <passivation-min-idle-time>을 초과한 세션들이 저장된다. 그래도 허용 세션 수를 제한을 초과하면 새로운 세션을 만들지 못한다. | -1 (제한없음) |
<use-session-passivation> | 세션 패시베이션을 사용할 것인지 설정 | false |
<passivation-min-idle-time> | 최대 세션 수를 유지하기 위해 패시베이션될 때 이 시간만큼 사용되지 않은 세션이 대상이 된다. | -1 |
<passivation-max-idle-time> | 지정된 시간 이상 사용되지 않은 세션이 패시베이션 된다. 최대 세션 수와 상관없이 지정된 시간이 되면 패시베이션 된다. web.xml의 <session-timeout> 설정보다 작은 값으로 설정해야 한다. | -1 |
표 3. 패시베이션 설정 항목
쿠키 도메인
쿠키 도메인은 애플리케이션을 사용하는 클라이언트의 웹 브라우저에서 쿠키를 읽을 수 있는 호스트를 지정하는 방법이다. 쿠키 도메인의 기본값은 ‘/’ 이다. 기본적으로 쿠키를 만든 호스트에서만 쿠키의 내용을 읽을 수 있다. 다른 호스트에서도 쿠키의 내용을 읽을 수 있게 하려고 쿠키 도메인을 설정한다.
예를 들어 SSO(Single Sign On)을 사용하여 로그인 정보를 공유하기 위해 SSO 밸브를 사용하여 쿠키 도메인을 설정하는 방법을 살펴보자. 다음 설정은 다른 서버에서 실행되는 서로 다른 애플리케이션이 http://app1.opennaru.com 와 http://app2.opennaru.com 에서 SSO 컨텍스트를 공유할 수 있는 설정이다.
쿠키 도메인 설정 예
<Valve className="org.jboss.web.tomcat.service.sso.ClusteredSingleSignOn"
cookieDomain="opennaru.com"/>
TCP 클러스터링 방법
jgroups 서브시스템의 default-stack을 tcp로 변경하면 멀티캐스트가 아닌 TCP를 사용한다고 설명했다. 하지만 멀티캐스트가 전혀 동작하지 않는 아마존 웹 서비스(AWS)와 같은 환경에서는 이 설정만으로는 동작하지 않는다.
그 이유는 tcp 스택으로 변경하더라도 tcp 스택에 클러스터 멤버를 찾기 위한 PING 프로토콜로 멀티캐스트를 사용하는 MPING을 사용하도록 설정되어 있기 때문이다.
<protocol type="MPING" socket-binding="jgroups-mping"/>
멀티캐스트를 사용하지 않는 PING 프로토콜로 변경해야 한다. 멀티캐스트를 사용하지 않는 경우에는 TCPPING, FILE_PING, S3_PING, TCPGOSSIP, JDBC_PING등 다양한 PING 프로토콜들이 있다. 이 방법 중 다음에서 TCPPING 설정방법을 살펴보자.
다음과 같이 TCPPING의 initial_hosts 프로퍼티로 호스트의 IP와 포트를 지정하면 된다. 시스템 프로퍼티로 값을 변경할 수 있도록 값을 설정하였다.
<subsystem xmlns="urn:jboss:domain:jgroups:1.1" default-stack="tcp">
… 생략 …
<stack name="tcp">
<transport type="TCP" socket-binding="jgroups-tcp"/>
<protocol type="TCPPING">
<property name="initial_hosts">${jgroups.tcpping.initial_hosts:192.168.0.11[7600],192.168.0.11[7700], 192.168.0.12[7600],192.168.0.12[7700]}</property>
<property name="port_range">0</property>
<property name="timeout">3000</property>
<property name="num_initial_members">3</property>
</protocol>
<protocol type="MERGE2"/>
<protocol type="FD_SOCK" socket-binding="jgroups-tcp-fd"/>
<protocol type="FD"/>
<protocol type="VERIFY_SUSPECT"/>
<protocol type="pbcast.NAKACK"/>
<protocol type="UNICAST2"/>
<protocol type="pbcast.STABLE"/>
<protocol type="pbcast.GMS"/>
<protocol type="UFC"/>
<protocol type="MFC"/>
<protocol type="FRAG2"/>
<protocol type="RSVP"/>
</stack>