6장. 웹 애플리케이션에서 클러스터링
6.1. 세션 복제
6.1.1. HTTP 세션 복제 정보
세션 복제를 사용하면 클러스터에서 노드 페일오버로 인해 배포 가능한 애플리케이션의 클라이언트 세션이 중단되지 않습니다. 클러스터의 각 노드는 진행 중인 세션에 대한 정보를 공유하며 노드가 사라진 경우 세션을 인계받을 수 있습니다.
세션 복제는 mod_cluster, mod_jk, mod_proxy, ISAPI 및 NSAPI 클러스터가 고가용성을 제공하는 메커니즘입니다.
6.1.2. 애플리케이션에서 세션 복제 활성화
JBoss EAP HA(고가용성) 기능을 활용하고 웹 애플리케이션의 클러스터링을 활성화하려면 애플리케이션을 배포 가능하도록 구성해야 합니다. 애플리케이션이 배포 가능으로 표시되지 않으면 해당 세션은 배포되지 않습니다.
애플리케이션 배포 가능
애플리케이션
web.xml 설명자 파일의<> 요소를 추가합니다.web-app> 태그 내에 <distributable/예제: 배포 가능한 애플리케이션의 최소 구성
<?xml version="1.0"?> <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_3_0.xsd" version="3.0"> <distributable/> </web-app>다음으로 필요한 경우 기본 복제 동작을 수정합니다. 세션 복제에 영향을 미치는 값을 변경하려면 애플리케이션의
WEB-INF/jboss-web.xml 파일에서요소 내에서 이를 재정의할 수 있습니다. 지정된 요소에 대해 기본값을 재정의하려는 경우에만 포함합니다.<>jboss-web> 요소 내의 <replication-config예:
<replication-config>값<jboss-web xmlns="http://www.jboss.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.jboss.com/xml/ns/javaee http://www.jboss.org/j2ee/schema/jboss-web_10_0.xsd"> <replication-config> <replication-granularity>SESSION</replication-granularity> </replication-config> </jboss-web>
<replication-granularity> 매개변수는 복제된 데이터의 세분성을 결정합니다. 기본적으로 SESSION 이지만 대부분의 속성이 변경되지 않은 세션에서 성능을 높이기 위해 ATTRIBUTE 로 설정할 수 있습니다.
<replication-granularity> 에 유효한 값은 다음과 같습니다.
-
세션: 기본값입니다. 속성이 더티인 경우 전체 세션 오브젝트가 복제됩니다. 이 정책은 여러 세션 특성에서 오브젝트 참조를 공유하는 경우 필요합니다. 전체 세션이 하나의 단위로 직렬화되므로 공유 오브젝트 참조는 원격 노드에서 유지됩니다. -
속성: 이는 세션의 더티 속성 및 마지막 액세스 타임스탬프와 같은 일부 세션 데이터의 경우에만 해당합니다.
변경할 수 없는 세션 속성
JBoss EAP 7의 경우 세션이 변경되거나 세션의 변경 속성에 액세스할 때 세션 복제가 트리거됩니다. 다음 중 하나가 충족되지 않는 한 세션 속성은 변경 가능으로 간주됩니다.
값은 다음과 같은 알려진 불변 값입니다.
-
null -
java.util.Collections.EMPTY_LIST,EMPTY_MAP,EMPTY_SET
-
값 유형은 알려진 불변 유형을 사용하거나 구현합니다.
-
java.lang.Boolean,문자,바이트,쇼트,정수,긴,Float -
java.lang.Class,Enum,StackTraceElement,String -
java.io.File,java.nio.file.Path -
java.math.BigDecimal,BigInteger,MathContext -
java.net.Inet4Address,Inet6Address,InetSocketAddress,URI,URL -
java.security.Permission -
java.util.Currency,Locale,TimeZone,UUID -
java.time.Clock,기간,인스턴트,LocalDateTime,LocalDateTime, monthsDay, period,Year,YearMonth,ZoneId,ZoneOffset,ZonedDateTime -
java.time.chrono.ChronoLocalDate,Chronology,Era -
java.time.format.DateTimeFormatter,DecimalStyle -
java.time.temporal.TemporalField,TemporalUnit,ValueRange,WeekFields -
java.time.zone.ZoneOffsetTransition,ZoneOffsetTransitionRule,ZoneRules
-
값 유형에는 다음과 같이 주석이 추가됩니다.
-
@org.wildfly.clustering.web.annotation.Immutable -
@net.jcip.annotations.Immutable
-
6.1.3. 세션 특성 마샬링
개별 세션 속성에 대한 복제 또는 지속성 페이로드를 최소화하면 네트워크를 통해 전송되거나 스토리지에 유지되는 바이트 수를 줄임으로써 성능을 직접 개선할 수 있습니다. 웹 애플리케이션을 사용하면 다음과 같은 방법으로 세션 속성의 마샬링을 최적화할 수 있습니다.
- JDK(Java Development Kit) 직렬화 논리를 사용자 지정할 수 있습니다.
- 사용자 지정 externalizer를 구현할 수 있습니다.
externalizer는 클래스의 마샬링을 지정하는 org.wildfly.clustering.marshalling.Externalizer 인터페이스를 구현합니다. externalizer는 개체의 상태를 직접 읽거나 입력/출력 스트림에 쓸 뿐만 아니라 다음 작업을 수행합니다.
-
애플리케이션에서
java.io.Serializable를 구현하지 않는 세션에 오브젝트를 저장할 수 있도록 합니다. 해당 상태와 함께 오브젝트의 클래스 설명자를 직렬화할 필요가 없습니다.
예제
public class MyObjectExternalizer implements org.wildfly.clustering.marshalling.Externalizer<MyObject> { @Override public Class<MyObject> getTargetClass() { return MyObject.class; } @Override public void writeObject(ObjectOutput output, MyObject object) throws IOException { // Write object state to stream } @Override public MyObject readObject(ObjectInput input) throws IOException, ClassNotFoundException { // Construct and read object state from stream return ...; } }
서비스 로더 메커니즘은 배포 중에 외부라이저를 동적으로 로드합니다. 구현 작업은 /META-INF/services/org.wildfly.clustering.marshalling.Externalizer 파일 내에서 열거해야 합니다.