티스토리 뷰

Developer

Sesstion Clustering

rocksea 2012. 6. 1. 11:24

JBOSS 관련해서 Session Clustering을 해야하는 과제가 주어져서 조사를 해보았습니다.

Session Clustering이란?

HA ( High Availability ) 서버 환경을 구축하기 위해 여러대의 JBOSS를 하나로 묶음으로 Client 관점에서는 마치 한대의 서버에서 처리되는 듯한 효과를 볼 수 있도록 구축하는 방식 입니다.

즉 Session Clustering을 하기 위한 목적으로는

아래의 두가지 목적으로 구현하게 됩니다.

1. 고가용성

2. 부하분산

실제로 어떻게 적용 되는지 알아보도록 하겠습니다.

 

 

[ 그림 1 ] HA Server Architecture

1. Quick Start

일단 다섯가지 조건이 전제되어야 합니다.

- 각노드는 socket에 바인딩하는 주소를 결정 해야한다.

- 멀티캐스트가 보장되어야 한다.

- 각 Node는 Unique한 Int형의 ServerPeerID 를 정한다.

- Unique한 cluster 명을 선택한다.

- Unique한 멀티캐스트 주소를 사용한다.

 

 

Step1. Server 환경 셋팅

JBOSS가 설치되었다는 전제하에 진행 합니다. 

all 에 포함되어있는 clustering 셋팅을 사용하기 위해 복사를 하여 두개의 노드를 생성합니다.

cd $HOME/jboss/server

cp -r all node1

cp -r all node 2

 

Step2. 서버 구동

Jboss options 
-c configuration 을 설정하는 것 입니다. all 을 통해 복사한 node1, node2 를 각 인스턴스별로 설정합니다.
-g 클러스터 이름을 설정합니다. (그냥 자기가 좋아하는 이름을 지정하면 될 것 같습니다.)
-u 내부 클러스터 통신을 위한 멀티캐스트 주소를 설정합니다.
-b 소켓에 바운딩될 아이피 주소를 설정합니다.
 
System properties 
-Djboss.messaging.ServerPeerID
 각 노드마다 지정되는 유니크한 정수 값 입니다. 1부터 순차적으로 증가하면 될 것 같습니다.
-Djboss.service.binding.set ServiceBindingManager 포트 설정을 위한 프로퍼티입니다. 시스템별 첫번째 인스턴스에는 ports-default 로 설정하고 그 다음 인스턴스부터는 ports-01, ports-02 ... 과 같이 설정을 합니다. 기본적으로 JBoss 의 포트가 8080 이고 AJP 1.3 포트가 8009 라면 ports-default 는 8080, 8009 로 바인딩 되고, ports-01 은 8180, 8109 로 바인딩 됩니다.

Senario 1 :  Two Servers, One Node

물리적으로 다른 두대의 머신 각각에 node를 띄운경우.

Node1

  Server1 $ cd $HOME/jboss/bin

  Server1 $ ./run.sh -c all -g CluseringTest -u 239.1.1.1 -b 192.168.0.101 -Djboss.messaging.ServerPeerID=1

Node2

  Server2 $ cd $HOME/jboss/bin

  Server2 $ ./run.sh -c all -g CluseringTest -u 239.1.1.1 -b 192.168.0.102 -Djboss.messaging.ServerPeerID=2

 

Senario 2 :  one server, two nodes , two ip address

물리적으로 한대의 머신에 2개의 network interface를 가지고 2개의 node를 띄운경우

Node1

  Server1 $ cd $HOME/jboss/bin

  Server1 $ ./run.sh -c node1 -g CluseringTest -u 239.1.1.1 -b 192.168.0.101 -Djboss.messaging.ServerPeerID=1

Node2

  Server2 $ cd $HOME/jboss/bin

  Server2 $ ./run.sh -c node2 -g CluseringTest -u 239.1.1.1 -b 192.168.0.102 -Djboss.messaging.ServerPeerID=2

 

Senario 3 :  one server, two nodes

물리적으로 한대의 머신에 하나의 ip address 를 가지고 2개의 node를 띄운경우

Node1

  Server1 $ cd $HOME/jboss/bin

  Server1 $ ./run.sh -c node1 -g CluseringTest -u 239.1.1.1 -b 192.168.0.101 -Djboss.messaging.ServerPeerID=1 -Djboss.service.binding.set=ports-default

Node2

  Server2 $ cd $HOME/jboss/bin

  Server2 $ ./run.sh -c node2 -g CluseringTest -u 239.1.1.1 -b 192.168.0.101 -Djboss.messaging.ServerPeerID=2 -Djboss.service.binding.set=ports-01

여기까지 하면 서버에 대한 clustering 셋팅은 끝났습니다.

 

2. Webapplication Clustering Quick Start

이제 Clustering을 위해 Webapplcation 단에서 처리해줘야 할 부분에 대한 셋팅이다.

web.xml

<web-app id="WebApp_9" version="2.4" 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_2_4.xsd">
  <display-name>jbossCluster</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>

<servlet>
        <servlet-name>rocksea</servlet-name>
        <servlet-class>com.rocksea.servlet.TestServlet</servlet-class>
</servlet>

<servlet-mapping>
        <servlet-name>rocksea</servlet-name>
        <url-pattern>/rocksea</url-pattern>
</servlet-mapping>

<distributable/>
</web-app>

jboss-web.xml

<!DOCTYPE jboss-web
  PUBLIC "-//JBoss//DTD Web Application 5.0//EN"
  "http://www.jboss.org/j2ee/dtd/jboss-web_5_0.dtd">

<jboss-web>
  <context-root>/jbossCluster</context-root>
  <replication-config>
       <replication-trigger>SET</replication-trigger>
       <replication-granularity>SESSION</replication-granularity>
  </replication-config>
</jboss-web>

replication-trigger

SET
 setAttribute() 시 세션이 변경된 것으로 간주
 
SET_AND_NON_PRIMITIVE_GET
 setAttribute() 뿐만 아니라 변경 가능한 object에 대한 getAttribute() 시 세션이 변경된 것으로 간주. 디폴트 설정
 
SET_AND_GET
 setAttribute() 뿐만 아니라 getAttribute() 시에도 세션이 변경된 것으로 간주
 
ACCESS
 HTTP 요청이 있을 때 마다 session이 변경된 것으로 간주

 

replication-granularity

SESSION
 세션을 통째로 복제
 
ATTRIBUTE
 세션에서 변경된 attribute만을 복제
 
FIEDLD
 attribute object의 변경된 필드만을 복제

 

deploy/jboss-web-cluster.sar/META-INF/jboss-service.xml

<attribute name="SnapshotMode">instant</attribute>
<attribute name="SnapshotInterval">2000</attribute>

SnapshotMode

Instance
 세션의 변경 사항을 즉시 복제

Interval
 세션을 일정시간으로 복제

<attribute name="CacheMode">REPL_ASYNC</attribute>

 CacheMode

REPL_SYNC
 동기방식으로 ACK를 받을때까지 기다린다.

REPL_ASYNC
 비동기 방식으로 큐에넣어두고 별도의 쓰레드에서 전송을 처리한다.

 

이상 JBOSS Session Clustering에 대한 포스팅을 마치도록 하겠습니다.

by rocksea.

 

댓글