'lb'에 해당되는 글 3건
- 2008.01.28 Tomcat 5에서 클러스터링과 로드밸렁싱-실전적용
- 2008.01.28 Tomcat 5에서의 클러스터링과 로드 밸런싱, Part 2
- 2008.01.28 Tomcat 5에서의 클러스터링과 로드 밸런싱, Part 1
- Tomcat 5에서 클러스터링과 로드밸렁싱-실전적용
- PROGRAM/JAVA
- 2008. 1. 28. 09:00
실 전산에서 적용한 방법으로 Fail-Over도 지원이 된다.
가중치 라운드 로빈방식으로 할당비중치를 줄수 있으나 다만 문제는 톰켓이 완전히 죽지 않은 상태... 즉 웹 어플리케이션이 GC나 스타팅이 되지 않은 상태에도 할당이 된다....
PS)당연하겠지만.. 톰켓자체가 죽지 않는 상태이니 그럴꺼란 생각이 든다
Apache2.0 + Tomcat 5.5.27 + jk-connect
1.workers.properties
# workers.properties
worker.list=tomcatlb,tomcat6,tomcat7
worker.tomcatlb.type=lb
worker.tomcatlb.balanced_workers=tomcat6,tomcat7
worker.tomcatlb.sticky_session=1
worker.tomcatlb.local_worker_only=1
worker.tomcat6.port=1901
worker.tomcat6.host=localhost
worker.tomcat6.type=ajp13
worker.tomcat6.lbfactor=1
worker.tomcat6.local_worker=1
worker.tomcat6.socket_timeout=60
worker.tomcat6.socket_keepalive=true
#worker.tomcat6.cachesize=10
# END workers.properties
#tomcat7.tomcat-test.com
worker.tomcat7.port=1902
worker.tomcat7.host=localhost
worker.tomcat7.type=ajp13
worker.tomcat7.lbfactor=1
worker.tomcat7.local_worker=1
worker.tomcat7.socket_timeout=60
worker.tomcat7.socket_keepalive=true
2.http.conf
ServerAdmin root@tomcat-test.com
DocumentRoot $APACHE2/htdocs
#ErrorDocument 404 /jsp/base/404.jsp
ServerName tomcat6.tomcat-test.com
ErrorLog "|/usr/local/sbin/cronolog $APACHE2/logs/%Y%m/tomcat6.tomcat-test.com-error_log-%Y%m%d"
CustomLog "|/usr/local/sbin/cronolog $APACHE2/logs/%Y%m/tomcat6.tomcat-test.com-access_log-%Y%m%d" common
JkMount /jsp/* tomcatlb
JkMount /servlet/* tomcatlb
JkMount /admin/* tomcatlb
JkMount /manager/* tomcatlb
JkMount /probe/* tomcat6
JkMount /probe2/* tomcat7
#JkMount /otherworker/*.jsp remoteworker
클러스터링 스케줄링
1)라운드-로빈(round-robin)
라운드-로빈 방식은 로드밸런서에 들어오는 요청 패킷들을 차례대로 실제 서버에 할당하는 방식이 다. 이 방식에서 실제 서버의 현재 부하 상황 등은 고려되지 않는다. 단지 차례대로 할당할 뿐이다. 하지만, 이렇게 하더라도 로드밸런싱을 위해 이전에 사용되던 라운드-로빈 DNS 방식에 의해 서버를 할당하는 방식에 비해서는 우수한데, DNS의 경우는 한번 서버가 지정되면 해당 서버에 수많은 요청 패킷이 몰릴 수 있기 때문이다.
2)가중 라운드-로빈(weighted round-robin)
가중 라운드-로빈 방식은 기본적으로 라운드-로빈 방식인데, 각 서버에 서로 다른 가중치를 주어서 할당하는 방식이다. 이 방식을 사용해야 하는 경우는 실제 서버들이 CPU의 수와 성능, 메모리 용량 등 서로 다른 성능을 가지고 있어서, 각 서버를 동등하게 취급할 수 없는 경우이다.
3)최소 연결(least connection)
최소 연결 방식은 실제 서버들 중에서 현재 가장 적은 수의 요청을 처리하고 있는 서버를 선택하여 요청 패킷을 할당하는 방식이다. 이 방식은 실제 서버의 현재 부하 상황을 동적으로 판단하여 요청을 처리하기 때문에, 앞의 두 방식에 비해서 동적으로 우수한 부하 분산 효과를 얻을 수 있다.
4)가중 최소 연결(weighted least connection)
가중 최소 연결 방식은 기본적으로 최소 연결 방식인데, 가중 라운드-로빈 방식과 마찬가지로 각 서버에 서로 다른 가중치를 주어서 할당하는 방식이다.
- Tomcat 5에서의 클러스터링과 로드 밸런싱, Part 2
- PROGRAM/JAVA
- 2008. 1. 28. 08:58
Tomcat 5에서의 클러스터링과 로드 밸런싱, Part 2
by Srini Penchikala04/14/2004
번역 허태명
제시된 클러스터 설정
-
클러스터는 고도의 확장성이 있어야 한다.
-
클러스터는 결함 허용을 지원해야 한다.
-
클러스터는 동적으로 설정가능해야 하며, 그것은 클러스터를 프로그램적(자바 코드의 변경)으로 보다는 선언적(설정 파일의 변경)으로 관리하기 쉬워야 한다는 것을 의미한다.
-
클러스터는 자동 클러스터 멤버 감지 기능을 제공해야만 한다.
-
세션 데이터를 위한 메모리 세션 상태 복제 기능을 갖고 있는 Fail-over와 로드 밸런싱 기능
-
플러그인/설정가능한 로드 밸런싱 정책
-
클러스터 멤버가 합류하거나 그룹에서 떠날 때 그룹 멤버쉽 공지 기능
-
멀티캐스트를 통한 메세지 전송의 손실이 없어야 한다.
-
클러스터링은 웹 어플리케이션과 서버에 잘 연계되어야 한다. 클러스터는 클라이언트와 서버 양쪽에 투명성을 제공해야 한다. 클라이언트 투명성은 클라이언트가 클러스터링된 서비스나 클러스터가 어떻게 설정됐는지 모른다는 의미이다. 클러스터는 각각의 서비스들 보다는 단일한 것으로써 확인되고 접근되어야 한다. 서버 투명성은 서버의 어플리케이션 코드는 그것이 클러스터 내에 있는지 몰라야 한다는 것을 의미한다. 어플리케이션 코드는 다른 클러스터 멤버와 통신할 수 없다.
-
로드 밸런서: 1개의 톰캣 인스턴스가 클러스터 노드들 사이에서 트래픽을 분배하기 위해 설정되었다. 이 인스턴스는 TC-LB라는 코드명을 갖는다.
-
클러스터링: 3개의 톰캣 서버 인스턴스가 클러스터의 일부로서 운영된다. 이 인스턴스들의 코드명은 TC01, TC02, TC03 이다.
-
세션 영속성: 메모리 세션 복제가 세션 영속성 메카니즘으로 선택되었다. 세션 객체가 변경될 때마다 세션 데이터는 3개의 모든 클러스터 멤버들에게 복사된다.
-
Fail-Over: 톰캣 설치본에 포함되어 있는 밸런서 어플리케이션은 fail-over를 다루도록 설계되지 않았다. 필자는 어떤 리퀘스트라도 서버에 포워딩하기전에 서버의 상태를 체크하는
ServerUtil
이라는 유틸리티 클래스를 작성하였다.ServerUtil
은 클러스터 노드의 상태를 검증하는 2개의 메소드를 가지고 있다. 첫번째 메소드에서는 특정 서버 인스턴스가 현재 돌아가고 있는지 아닌지 체크하기 위해McastService
를 사용한다. 두번째 메소드는 파라미터로써 전달된 웹 페이지 URL에 의거하여 URL 객체를 생성함으로써 클러스터 노드의 사용가능성을 검증한다. 이 클래스를 사용하기 위해catalina-cluster.jar
(%TOMCAT_HOME%/server/lib 디렉토리에 위치)와commons-logging-api.jar
(%TOMCAT_HOME%/bin 디렉토리에 위치) 파일이 클래스패쓰에 잡혀있는지 확인하라.
Figure 1. Tomcat cluster architecture diagram
톰캣 인스턴스의 설치 & 설정
Processor | HP Pavilion Pentium III 800 MHz |
Memory | 512 MB RAM |
Hard Disk | 40 GB |
Operating System | Windows 2000 server with Service Pack 4 |
JDK 버전 | 1.4.0_02 (주: 톰캣 클러스터링을 사용하기 위해서는 JDK 1.4 이상의 버전이 필요하다.) |
Tomcat 버전 | 5.0.19 |
사용된 툴 | Ant 1.6.1, Log4J, JMeter, JBuilder |
클러스터 프레임워크의 주요 요소들
자바 클래스
BaseLoadBalancingRule
이 클래스는 커스텀 Rule 클래스에 일반적인 룰 로직을 캡슐화하기 위해 생성된 추상 클래스이다. 예제 웹 어플리케이션에서 사용된 커스텀 로드 밸런싱 룰은 이 베이스 클래스를 확장한 것이다.RandomRedirectRule
이 클래스는 랜덤한 방법으로 사용가능한 서버에 웹 리퀘스트를 포워드하는 로직을 정의한다. 난수를 생성하기 위한 시드(seed)로 현재의 시스템 시간을 사용한다.RoundRobinRule
이 클래스는 라운드 로빈 룰에 의거한 로드 밸런싱 룰을 정의한다. 리퀘스트가 올 때 이 클래스는 리퀘스트를 목록의 다음 멤버에게 포워딩한다. 다음 사용가능한 클러스터 멤버를 추적하고 매 새로운 리퀘스트마다 값을 하나씩 증가시키기 위해 정적 변수를 사용한다.ServerUtil
이 클래스는 특정 클러스터 노드가 리퀘스트를 받을 수 있도록 사용가능한지 아닌지를 체크하기 위해 만들어진 유틸리티 클래스이다. 이 클래스는 클러스터 멤버가 그룹을 떠났는지 검사하기 위해McastService
(org.apache.catalina.cluster.mcast
패키지) 클래스를 사용한다.
Figure 2. Cluster application class diagram
설정 파일
server.xml
이 파일은 톰캣 서버 인스턴스의 클러스터링을 설정하기 위해 사용된다. 톰캣 설치본에 포함되어 있는 버전은 파일에 자세한 설정이 되어 있지만 주석처리되어 있다.web.xml
이 설정 파일은 웹 어플리케이션 세션 데이터가 복제될 필요있다는 것을 규정하기 위해 사용된다.rules.xml
이 파일은 커스텀 로드 밸런싱 룰을 정의하기 위해 사용된다. 이 파일은 우리가 클러스터 멤버 사이의 부하를 분배하기 위해 어떤 로드 밸런싱 룰을 사용하기 원하는지 규정하기 위해 사용하는 파일이다.
스크립트
test.jsp
서버 상태를 체크하기 위해 사용하는 간단한 테스트 JSP 스크립트이다. test.jsp 파일이 실행된 시스템 시간과 톰캣 인스턴스의 이름을 보여준다.testLB.jsp
이 파일은 우리의 예제 웹 어플리케이션의 시작 페이지이다. HTML 리다이렉트를 사용하여 로드 밸런서 필터로 웹 리퀘스트를 포워딩한다.sessiondata.jsp
이 스크립트는 어떤 1개의 클러스터 노드가 다운됐을 때 세션 데이터의 손실이 없다는 것을 검증하기 위해 사용된다. 세션의 자세한 정보와 또한 HTTP 세션 객체를 조작하는 HTML 필드를 보여준다.build.xml
Ant 빌드 스크립트가 톰캣 인스턴스의 시작과 중지 작업을 자동화하기 위해 사용된다.(이 스크립트를 실행하기 위해 Ant 1.6.1 최신 버전이 사용됐다.) 톰캣 인스턴스가 성공적으로 구동되면, IP 주소와 포트 번호를 정함으로써 어떤 톰캣 인스턴스가 실행되는지 검증하기 위해test.jsp
를 호출할 수 있다. JSP 페이지는 현재 시스템 시간과 톰캣 인스턴스의 이름을 보여준다.(여러분은 자신의 환경에서 스크립트를 실행하기 위해build.properties
파일에 정의된 톰캣 서버의 홈 디렉토리를 변경할 필요가 있다.)
- 특정 톰캣 인스턴스를 구동하기 위해
start.tomcat5x
타겟을 호출하라. (예:tomcat50
) - 특정 톰캣 인스턴스를 중지하기 위해
stop.tomcat5x
타겟을 호출하라. - 실행되고 있는 모든 톰캣 인스턴스를 중지하기 위해
stop.alltomcats
타겟을 호출하라.
예제 코드
RoundRobinRule
방식을 사용한다. 만약 랜덤 리다이렉트 정책을 사용하고 싶다면, "tomcat50/webapps/balancer/WEB-INF/config" 디렉토리에 위치한 rules.xml
파일을 변경하라. RoundRobinRule
룰 엘리먼트를 주석처리하고, RandomRedirectRule
룰 엘리먼트의 주석을 제거하라. 또한 클러스터의 톰캣 인스턴스를 3개가 아닌 2개로 사용하고 싶다면, 세번째 룰을 주석처리하고 maxServerInstances
의 값을 3에서 2로 변경해라.HTTP Request 흐름
- 시작 페이지 호출 (http://localhost:8080/balancer/testLB.jsp).
- JSP는 밸런서 필터로 리퀘스트를 리다이렉트 시킨다. (URL: http://localhost:8080/balancer/LoadBalancer).
- 로드 밸런서(TC-LB)로서 실행되는 톰캣 서버는 웹 리퀘스트를 인터셉트하고 설정 파일에 정의된 로드 밸런싱 알고리즘에 의거하여 다음 사용 가능한 클러스터 멤버(TC01, TC02, TC03)로 리다이렉트 시킨다.
- 선택된 클러스터 멤버의 JSP 스크립트
sessiondata.jsp
("clusterapp" 웹 어플리케이션에 위치한)가 호출된다. - 만약 세션이 변경되었다면
ClusterAppSessionListener
에 있는 세션 리스너 메소드가 세션 변경 이벤트를 기록하기 위해 호출된다. sessiondata.jsp
는 웹 브라우저에 세션의 자세한 데이터를 보여준다.(세션 ID, 마지막 접근 시간, 등등)- 랜덤하게 하나 또는 2개의 클러스터 노드를 중지시킨다.(Ant 스크립트의 "
stop.tomcat5x
" 타겟을 호출함으로써) - 사용가능한 클러스터 멤버중의 하나로 리퀘스트 fail over가 발생하는지 살펴보기 위해 위의 단계 1부터 7까지 반복한다. 또한 데이터의 손실없이 클러스터 멤버로 세션 정보가 복사되었는지 체크해 본다.
클러스터 설정
MulticastNode
라는 예제 자바 프로그램을 실행하거나 또는 멀티캐스트 서버와 클라이언트 프로그램을 작성하는 법에 관해 자바 소프트 웹 사이트에서 구할 수 있는 예제 튜토리얼을 참조하라.Figure 4. 클러스터에서 멤버가 추가되거나 제거됐을 때의 로그 메세지
-
세션에 저장할 모든 객체는
java.io.Serializable
인터페이스를 구현해야 한다. -
server.xml
파일의Cluster
요소의 주석을 제거하라.Cluster
요소의useDirtyFlag
와replicationMode
는 빈도수와 세션 복제 메카니즘의 최적화를 위해 사용된다. -
server.xml 파일의
Valve
요소의 주석을 제거함으로써ReplicationValve
를 활성화시켜라. 만약 세션이 웹 클라이언트에 의해 변경된다면ReplicationValve
는 HTTP 리퀘스트를 인터셉트하고 클러스터 멤버들 사이의 세션 데이터를 복제하기 위해 사용된다.Valve
요소는 세션을 변경할 수 없는 리퀘스트(HTML 페이지나 이미지 파일과 같은)를 걸러내기 위해 사용할 수 있는 "filter" 속성을 가지고 있다. -
단일 머신에서 3개의 톰캣 인스턴스가 실행되고 있기 때문에,
tcpListenPort
속성은 각 톰캣 인스턴스에 대해 유니크하게 설정된다. mcastXXX로 시작하는 속성들 (mcastAddr
,mcastPort
,mcastFrequency
,mcastDropTime
)은 클러스터 멤버쉽 IP 멀티캐스트 핑을 위한 것이고, tcpXXX로 시작하는 속성들(tcpThreadCount
,tcpListenAddress
,tcpListenPort
,tcpSelectorTimeout
)은 TCP 세션 복제를 위한 것이라는 것을 아는 것은 중요하다. (아래의 "클러스터링 설정 파라미터" 테이블은 클러스터링을 사용하기 위해 톰캣 서버 인스턴스들의 설정이 어떻게 다른지 보여준다.) -
web.xml
메타 파일(clusterappWEB-INF 디렉토리에 위치)은<distributable/>
요소를 가져야 한다. 특정 웹 어플리케이션에 대해 세션 상태 복제를 하기 위해,distributable
요소는 어플리케이션을 위해 정의될 필요가 있다. 이것은 세션 복제를 필요로 하는 웹 어플리케이션이 하나 이상이라면, 모든 웹 어플리케이션의web.xml
파일에distributable
를 추가할 필요가 있다는 것을 의미한다. Tomcat: The Definitive Guide 책의 톰캣 클러스터링 챕터는 이 주제에 대해 매우 훌륭하게 설명하고 있다.
Configuration Parameter | Instance 1 | Instance 2 | Instance 3 | Instance 4 |
---|---|---|---|---|
Instance Type | Load Balancer | Cluster Node 1 | Cluster Node 2 | Cluster Node 3 |
Code name | TC-LB | TC01 | TC02 | TC03 |
Home Directory | c:/web/tomcat50 | c:/web/tomcat51 | c:/web/tomcat52 | c:/web/tomcat53 |
Server Port | 8005 | 9005 | 10005 | 11005 |
Connector | 8080 | 9080 | 10080 | 11080 |
Coyote/JK2 AJP Connector | 8009 | 9009 | 10009 | 11009 |
Cluster mcastAddr | 228.0.0.4 | 228.0.0.4 | 228.0.0.4 | 228.0.0.4 |
Cluster mcastPort | 45564 | 45564 | 45564 | 45564 |
tcpListenAddress | 127.0.0.1 | 127.0.0.1 | 127.0.0.1 | 127.0.0.1 |
Cluster tcpListenPort | 4000 | 4001 | 4002 | 4003 |
127.0.0.1
).CATALINA_HOME
환경 변수를 설정하지 말아라. 이 변수가 설정되면, 모든 인스턴스는 톰캣 인스턴스를 구동하기 위해 같은 디렉토리(CATALINA_HOME
변수에 정의된)를 사용하려고 할 것이다. 그러한 결과로, 오직 최초의 인스턴스만 성공적으로 구동되고 나머지 인스턴스들은 포트가 이미 사용되고 있다는 바인드 익셉션 메세지와 함께 구동에 실패할 것이다: "java.net.BindException: Address already in use: JVM_Bind:8080
".로드 밸런서 설정
RoundRobinRule
과 RandomRedirect
) 이 룰들은 라운드 로빈과 랜덤 리다이렉트와 같은 로드 밸런싱 알고리즘에 의거한다. 여러분들도 가중치 기반, 마지막 접속 시간 등과 같은 다른 요소들을 기반으로 하는 비슷한 커스텀 로드 밸런싱 룰을 작성할 수 있다. 톰캣 로드 밸런서는 파라미터 기반의 로드 밸런싱 룰을 예제로 제공한다. 이것은 HTTP 리퀘스트의 파라미터에 따라 웹 리퀘스트를 다른 URL로 리다이렉트 시킨다.server.xml
의 cluster와 valve 요소는 주석을 제거하지 말아라.테스팅 설정
세선 영속성 테스팅
sessiondata.jsp
페이지는 세션의 자세한 정보를 보여주기 위해 사용됐다. 이 스크립트는 또한 세션 속성을 추가/변경/제거 하기 위한 HTML 텍스트 필드를 제공한다. HTTP 세션에 몇 가지 속성을 추가한 후에, 필자는 랜덤하게 클러스터 노드를 중지시키고 나머지 사용가능한 클러스터 멤버에서 세션 데이터를 체크했다.부하 테스팅
- 로드 밸런서와 톰캣 서버의 클러스터 인스턴스들을 구동한다.
- 시작 JSP 스크립트를 구동한다. (
testLB.jsp
). - 랜덤한 간격으로 하나 또는 그 이상의 서버를 중지시켜서 서버 다운을 시뮬레이트한다.
- 부하 분배 패턴을 체크한다.
- 절차 1부터 4를 100번 반복한다
tomcat_cluster.log
(tomcat50/webapps/balancer 디렉토리에 위치) 라고 불리는 텍스트 파일에 기록된다. 시퀀스 다이어그램(Figure 2)에서 보여준 모든 웹 객체에 대한 응답 시간이 Log4J 메세지를 사용하여 기록되었다. 경과시간(밀리세컨드) 자료들이 수집되고 테이블 3에 자료로 나타나 있다. 필자는 테스트동안 응답 시간을 수집하는데 Designing Performance Testing Metrics into Distributed J2EE Apps에 기술된 것과 비슷한 방법론을 따랐다.RoundRobinRule
을 사용)의 경과시간과 부하 분배율 (RandomRedirectRule
을 사용) 보여준다.# | Scenario | testLB.jsp (ms) |
RoundRobinRule (ms) |
sessiondata.jsp (ms) |
Total (ms) |
---|---|---|---|---|---|
1 | 3개의 모든 서버 인스턴스가 실행중 | 54 | 76 | 12 | 142 |
2 | 2개의 서버 인스턴스가 실행중 (TC02은 중지상태) | 55 | 531 | 14 | 600 |
3 | 1개의 서버 인스턴스만 실행중 (TC01, TC02 중지상태) |
56 | 1900 | 11 | 1967 |
# | Scenario | TC01 (%) | TC02 (%) | TC03 (%) |
---|---|---|---|---|
1 | 3개의 모든 서버 인스턴스가 실행중 | 30 | 46 | 24 |
2 | 2개의 서버 인스턴스가 실행중 (TC02은 중지상태) | 56 | 0 | 44 |
결론
ServerUtil
클래스를 사용하여) 필자가 사용한 메카니즘은 가장 빠른 방법은 아니다. 더욱 복잡하고 견고한 fail-over 테크닉들이 실세계의 시나리오에서 사용되어야 할 것이다.server.xml
과 rules.xml
)을 조작함으로써 수동으로 이루어 졌다. 자카르타 그룹이 클러스터링과 로드 밸런싱 설정을 관리하기 위해 필요로 하는 설정의 변경을 수행할 수 있는 웹 기반의 클러스터 관리 GUI 툴을 제공한다면 매우 도움이 될 것이다.참고 자료
- Tomcat 5 Home Page
- Clustering Home Page on Tomcat site
- Load Balancer Home Page on Tomcat site
- Tomcat: The Definitive Guide by Jason Brittain and Ian F. Darwin
- Java Performance Tuning, 2nd Edition by Jack Shiraji
- Creating Highly Available and Scalable Applications Using J2EE, The Middleware Company, EJB Essentials Training Class Material
- Tomcat 5에서의 클러스터링과 로드 밸런싱, Part 1
- PROGRAM/JAVA
- 2008. 1. 28. 08:58
Tomcat 5에서의 클러스터링과 로드 밸런싱, Part 1
by Srini Penchikala03/31/2004
번역 허태명
Large-Scale 시스템 디자인
클러스터링
톰캣에서의 클러스터링
ping
메세지를 사용하여 서로 통신한다. 각 톰캣 인스턴스는 세션 복제를 위한 IP 주소와 TCP 리스너 포트를 전파하는 메세지를 전송할 것이다. 만약 한 인스턴스가 주어진 시간 단위안에 메세지를 받지 못하면, 그 인스턴스는 다운된 것으로 간주될 것이다.로드 밸런싱
- Round-robin
- Random
- Weight-based
- Minimum load
- Last access time
- Programmatic parameter-based (로드 밸런서는 입력 인자에 따라 서버를 선택할 수 있다)
톰캣에서의 로드 밸런싱
mod_proxy
와 mod_rewrite
를 아파치 2와 사용, 그리고 balancer 웹 어플리케이션의 사용이다. 이 글에서 우리는 클러스터 내에서 웹 리퀘스트를 다른 노드들로 리다이렉트 시키는 balancer 웹 어플리케이션을 사용하는 세번째 옵션을 설명하는데 중점을 둘 것이다. 로드 밸런서 어플리케이션은 클러스터 내의 다음 이용가능한 멤버로 웹 리퀘스트를 리다이렉트 시키는 서블릿 필터 메카니즘을 사용하는 룰 기반의 어플리케이션이다. 서블릿 필터는 서블릿 2.3 스펙에서 소개되었다. 이 필터는 웹 어플리케이션의 JAAS 인증, 암호화, 로깅, 감사(auditing), 데이터 압축, XML 컨텐츠를 변환하는 XSLT 필터 등과 같은 다양한 작업에 사용된다. 톰캣 밸런서 웹 사이트에 언급된 것과 같이, 밸런서 어플리케이션은 다른 견고한 로드 밸런싱 메카니즘을 대체하기 위해 디자인된 것은 아니다. 그보다 톰캣 밸런서 어플리케이션은 다수의 서버 사이에서 트래픽을 조절하는 단순하고 확장가능한 방법이다. 여러가지 룰을 사용하여 로드 밸런싱이 다양한 방법으로 어떻게 구현되는지 이해하기 위하여 밸런서 어플리케이션에 제공되는 샘플 자바 클래스를 살펴보라.RuleChain
을 체크한다. Rule
이 기준에 맞으면, 필터는 검사를 중단하고 리퀘스트를 해당하는 룰에 정의된 URL로 리다이렉트시킨다.결함 허용(Fault Tolerance)
톰캣에서의 결함 허용
-
Request-level fail over: 만약 클러스터 내의 서버 중의 하나가 다운된다면, 그 이후의 모든 리퀘스트들은 클러스터 내의 나머지 다른 서버로 리다이렉트되야만 한다. 이것은 서버 상태를 추적하고 응답하지 않는 서버에 리퀘스트를 보내는 것을 피하기 위해 heartbeat 메카니즘을 사용하는 것을 포함한다. 우리의 클러스터 설정에서 로드 밸런서로서 사용되는 톰캣 인스턴스는 웹 리퀘스트를 클러스터 내의 다른 노드로 포워딩함으로써 Request-level fail over를 수행할 수 있다.
-
Session-level fail over: 웹 클라이언트는 HTTP 서버에 의해 유지되는 세션을 가질 수 있다. Session-level fail over에서 클러스터 내의 서버 중의 하나가 다운된다면, 클러스터 내의 다른 서버가 최소한의 연속성 손실만으로 최초의 서버에 의해 다뤄진 세션을 가지고 계속 작업을 수행할 수 있어야 한다. 이것은 클러스터 내에 서버간의 세션 데이터의 복제를 포함한다. 세션 복제 능력을 가지고 있는 톰캣 클러스터는 session-level fail over를 수행할 수 있다.
세선 상태 영속성(Session State Persistence)
- Memory-to-memory replication
- File System session persistence, 중앙집중화된 파일 시스템에 세션 정보가 read/write 된다.
- Database session persistence, 세션 데이터가 JDBC 데이터 저장소에 저장된다.
HttpSession
내의 객체는 상태가 변할 때마다 개별적으로 백업 서버에 직렬화 된다. 반면에 데이터베이스 세션 영속성(Database session persistence)에서 세션에 저장된 객체는 객체들중 어느 하나의 상태가 변할 때 함께 직렬화 된다.HttpSession
에 저장할 때 확장성이 제한된다는 것이다. 유저가 HttpSession
에 객체를 추가할 때마다, 세션 내의 모든 객체들은 직렬화되고 데이터베이스타 공유된 파일 시스템에 저장된다.톰캣에서의 세션 복제
- 톰캣 5(server/lib/catalina-cluster.jar)에 내장되어 있는
SimpleTcpCluster
(org.apache.catalina.cluster.tcp 패키지)과 함께 메모리 복제에서의 사용. - 공유된 데이터베이스(
org.apache.catalina.session.JDBCStore
)에 세션을 저장하는 세션 영속성의 사용. - 공유된 파일 시스템(catalina-optional.jar의 일부인
org.apache.catalina.session.FileStore
)에 세션 상태 저장하기
J2EE 클러스터를 구현하는데 있어서 고려해야 할 요소
클러스터링
- 어떤 종류의 클러스터가 구현되야만 하는가: 수직 확장 또는 수평 확장인가?
- 어떤 티어에서 클러스터링이 구현되야만 하는가: 웹서버, 서블릿을 위한 서블릿 컨테이너, JSP, HTTP 세션 객체; 또는 EJB, JMS, JNDI 객체를 위한 어플리케이션 서버 또는 데이터베이스 클러스터링?
로드 밸런싱
- 서버가 선택될 때(예, 활용성? : affinity): 매 리퀘스트마다, 매 트랜잭션마다, 또는 매 세션마다?
- 어떻게 서버가 선택되는가(예, 로드 밸런싱 정책): 무작위, 라운드-로빈(round-robin), 가중치 기반(weight-based), 가장 덜 부하가 걸린 서버(least loaded server), 또는 어플리케이션에 의해?
- 로드 밸런싱이 어디서 이루어 지는가: 한 곳 또는 여러 곳, 클라이언트 단 또는 서버 단?
결함 허용(Fault Tolerance)
- 어떻게 서버가 문제를 감지하는가?
- fail over하고 다른 서버로 리퀘스트를 시도할 적당한 시간은 언제인가?
- 문제가 생긴 노드의 시스템과 어플리케이션의 상태는 어떻게 할 것인가?
세션 상태 영속성(Session State Persistence)
- 상태는 어떻게 통신되는가?
- 얼마나 자주 통신하는가?
- 객체의 상태는 어떻게 구체화(materialize)되는가?
- 상태 영속성 메카니즘은 효율적인가?
- 복제된 상태의 일관성이 있는가?
- 세션 상태를 복제하는데 있어서 어떤 네트웍 제한요소가 있는가?
제안된 클러스터 설정
- 클러스터는 고도의 확장성이 있어야 한다.
- 클러스터는 결함 허용이 가능해야 한다.
- 클러스터는 동적으로 설정이 가능해야 한다. 그것은 클러스터를 프로그램적으로(자바 코드를 변경) 보다는 선언적으로(설정 파일을 변경) 관리하기 쉽다는 것을 의미한다.
- 클러스터는 자동 클러스터 멤버 감지 기능을 제공해야 한다.
- 클러스터는 메모리 세션 상태 복제를 위해 fail over와 로드 밸런싱 기능을 가지고 있어야 한다.
- 클러스터는 플러그인 방식/설정하기 쉬운 로드 밸런싱 정책을 가지고 있어야 한다.
- 클러스터는 클러스터 멤버가 그룹에 합류하거나 떠날 때 그룹 멤버쉽 공지를 수행해야 한다.
- 멀티캐스트를 통하는 동안 메세지 전송의 손실이 없어야 한다.
- 클러스터링은 웹 어플리케이션과 서버에 함께 연동되어야 한다. 클라이언트와 서버 양쪽에 투명성을 제공해야 한다. 클라이언트 투명성은 클라이언트가 클러스터링된 서비스나 클러스터가 어떻게 설정되었는지 모르는 것을 의미한다. 클러스터는 각각의 서비스들로 보다는 한 개의 것으로서 확인되고 접속되어야 한다. 서버 투명성은 서버의 어플리케이션 코드가 클러스터 내에 있는지 모르는 것을 의미한다. 어플리케이션 코드는 다른 클러스터 멤버와 통신할 수 없다.
Recent comment