티스토리 뷰
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 셋팅을 사용하기 위해 복사를 하여 두개의 노드를 생성합니다.
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 $ ./run.sh -c all -g CluseringTest -u 239.1.1.1 -b 192.168.0.101 -Djboss.messaging.ServerPeerID=1
Node2
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 $ ./run.sh -c node1 -g CluseringTest -u 239.1.1.1 -b 192.168.0.101 -Djboss.messaging.ServerPeerID=1
Node2
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 $ ./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 $ ./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
<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="SnapshotInterval">2000</attribute>
SnapshotMode
Instance
세션의 변경 사항을 즉시 복제
Interval
세션을 일정시간으로 복제
CacheMode
REPL_SYNC
동기방식으로 ACK를 받을때까지 기다린다.
REPL_ASYNC
비동기 방식으로 큐에넣어두고 별도의 쓰레드에서 전송을 처리한다.
이상 JBOSS Session Clustering에 대한 포스팅을 마치도록 하겠습니다.
by rocksea.
'Developer' 카테고리의 다른 글
[ Cache Server ] Infinispan quick start guide (0) | 2012.06.07 |
---|---|
[ Error ] java.lang.IllegalArgumentException: Wrong arguments. new for target java.lang.reflect.Constructor expected=[java.net.URI] actual=[java.io.File] (0) | 2012.06.05 |
[ mylyn + eclipse ] mylyn + eclipse 연동 (0) | 2012.05.15 |
[ non-block ] non-block server 구현 (0) | 2012.05.10 |
애자일(Agile) 개발 기법 (0) | 2012.05.08 |
- Total
- Today
- Yesterday
- Python Django
- 여행
- 영문법
- Python
- k8s
- redis
- memcached
- 도덕경
- PostgreSQL
- Business English
- it
- JBOSS
- 가정법
- 해외여행
- maven
- NGINX
- 비지니스 영어
- 다낭
- 베트남
- 영작
- AWS
- nodejs
- 조동사
- 스페인 여행
- 대명사 구문
- 비교구문
- mongoDB
- hadoop
- hdfs
- ubuntu
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |