Tomcat 5에서의 클러스터링과 로드 밸런싱, Part 2 上편
- 공유 링크 만들기
- X
- 이메일
- 기타 앱
04/14/2004
번역 허태명
이 글은 톰캣 5 서버에서 클러스터링과 로드 밸런싱에 관한 시리즈의 두번째 파트이다. 파트 1에서 필자는 확장성과 고가용성을 위한 시스템을 디자인할 때 고려해야할 다양한 요소와 Large-scale J2EE 시스템 디자인의 개괄에 대해 얘기했다. 또한 클러스터링, 로드 밸런싱, 결함 허용, 세션 복제 능력에 대한 톰캣의 지원에 대해서도 논했다. 이번 파트에서 우리는 제시된 클러스터 설정의 아키텍쳐와 클러스터를 배치할 때(다수의 톰캣 서버 인스턴스를 운영함으로써)의 설치와 설정의 세세한 부분에 대해 다룰 것이다.
Figure 1. Tomcat cluster architecture diagram
Figure 2. Cluster application class diagram
주 : 필자는 밸런서와 예제 웹 어플리케이션만 남기고 톰캣 설치본에 포함된 다른 모든 웹 어플리케이션(jsp-examples, 등등)은 제거했다.
Figure 3. Cluster application sequence diagram (큰 화면으로 보기 위해 그림을 클릭하시오)
번역 허태명
이 글은 톰캣 5 서버에서 클러스터링과 로드 밸런싱에 관한 시리즈의 두번째 파트이다. 파트 1에서 필자는 확장성과 고가용성을 위한 시스템을 디자인할 때 고려해야할 다양한 요소와 Large-scale J2EE 시스템 디자인의 개괄에 대해 얘기했다. 또한 클러스터링, 로드 밸런싱, 결함 허용, 세션 복제 능력에 대한 톰캣의 지원에 대해서도 논했다. 이번 파트에서 우리는 제시된 클러스터 설정의 아키텍쳐와 클러스터를 배치할 때(다수의 톰캣 서버 인스턴스를 운영함으로써)의 설치와 설정의 세세한 부분에 대해 다룰 것이다.
제시된 클러스터 설정
아래 목록은 제시된 톰캣 클러스터에서 필자가 달성하기 원하는 주 목적들이다:- 클러스터는 고도의 확장성이 있어야 한다.
- 클러스터는 결함 허용을 지원해야 한다.
- 클러스터는 동적으로 설정가능해야 하며, 그것은 클러스터를 프로그램적(자바 코드의 변경)으로 보다는 선언적(설정 파일의 변경)으로 관리하기 쉬워야 한다는 것을 의미한다.
- 클러스터는 자동 클러스터 멤버 감지 기능을 제공해야만 한다.
- 세션 데이터를 위한 메모리 세션 상태 복제 기능을 갖고 있는 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
톰캣 인스턴스의 설치 & 설정
Table 1. 톰캣 클러스터링을 설정하는데 사용된 머신의 하드웨어/소프트웨어 스펙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 |
클러스터 프레임워크의 주요 요소들
자바 클래스
이 클래스는 커스텀 Rule 클래스에 일반적인 룰 로직을 캡슐화하기 위해 생성된 추상 클래스이다. 예제 웹 어플리케이션에서 사용된 커스텀 로드 밸런싱 룰은 이 베이스 클래스를 확장한 것이다.BaseLoadBalancingRule
이 클래스는 랜덤한 방법으로 사용가능한 서버에 웹 리퀘스트를 포워드하는 로직을 정의한다. 난수를 생성하기 위한 시드(seed)로 현재의 시스템 시간을 사용한다.RandomRedirectRule
이 클래스는 라운드 로빈 룰에 의거한 로드 밸런싱 룰을 정의한다. 리퀘스트가 올 때 이 클래스는 리퀘스트를 목록의 다음 멤버에게 포워딩한다. 다음 사용가능한 클러스터 멤버를 추적하고 매 새로운 리퀘스트마다 값을 하나씩 증가시키기 위해 정적 변수를 사용한다.RoundRobinRule
이 클래스는 특정 클러스터 노드가 리퀘스트를 받을 수 있도록 사용가능한지 아닌지를 체크하기 위해 만들어진 유틸리티 클래스이다. 이 클래스는 클러스터 멤버가 그룹을 떠났는지 검사하기 위해ServerUtil
McastService
(org.apache.catalina.cluster.mcast
패키지) 클래스를 사용한다.
Figure 2. Cluster application class diagram
설정 파일
이 파일은 톰캣 서버 인스턴스의 클러스터링을 설정하기 위해 사용된다. 톰캣 설치본에 포함되어 있는 버전은 파일에 자세한 설정이 되어 있지만 주석처리되어 있다.server.xml
이 설정 파일은 웹 어플리케이션 세션 데이터가 복제될 필요있다는 것을 규정하기 위해 사용된다.web.xml
이 파일은 커스텀 로드 밸런싱 룰을 정의하기 위해 사용된다. 이 파일은 우리가 클러스터 멤버 사이의 부하를 분배하기 위해 어떤 로드 밸런싱 룰을 사용하기 원하는지 규정하기 위해 사용하는 파일이다.rules.xml
스크립트
서버 상태를 체크하기 위해 사용하는 간단한 테스트 JSP 스크립트이다. test.jsp 파일이 실행된 시스템 시간과 톰캣 인스턴스의 이름을 보여준다.test.jsp
이 파일은 우리의 예제 웹 어플리케이션의 시작 페이지이다. HTML 리다이렉트를 사용하여 로드 밸런서 필터로 웹 리퀘스트를 포워딩한다.testLB.jsp
이 스크립트는 어떤 1개의 클러스터 노드가 다운됐을 때 세션 데이터의 손실이 없다는 것을 검증하기 위해 사용된다. 세션의 자세한 정보와 또한 HTTP 세션 객체를 조작하는 HTML 필드를 보여준다.sessiondata.jsp
Ant 빌드 스크립트가 톰캣 인스턴스의 시작과 중지 작업을 자동화하기 위해 사용된다.(이 스크립트를 실행하기 위해 Ant 1.6.1 최신 버전이 사용됐다.) 톰캣 인스턴스가 성공적으로 구동되면, IP 주소와 포트 번호를 정함으로써 어떤 톰캣 인스턴스가 실행되는지 검증하기 위해build.xml
test.jsp
를 호출할 수 있다. JSP 페이지는 현재 시스템 시간과 톰캣 인스턴스의 이름을 보여준다.(여러분은 자신의 환경에서 스크립트를 실행하기 위해build.properties
파일에 정의된 톰캣 서버의 홈 디렉토리를 변경할 필요가 있다.)
- 특정 톰캣 인스턴스를 구동하기 위해
start.tomcat5x
타겟을 호출하라. (예:tomcat50
) - 특정 톰캣 인스턴스를 중지하기 위해
stop.tomcat5x
타겟을 호출하라. - 실행되고 있는 모든 톰캣 인스턴스를 중지하기 위해
stop.alltomcats
타겟을 호출하라.
예제 코드
이 글에서 사용된 예제 코드는 tomcatclustering.zip에서 구할 수 있다. 톰캣 서버 인스턴스들을 설치한 후에(4개가 필요하다.), 톰캣 디렉토리에 zip 파일의 압축을 풀어라. 제공된 예제 코드는 로드 밸런싱 정책으로RoundRobinRule
방식을 사용한다. 만약 랜덤 리다이렉트 정책을 사용하고 싶다면, "tomcat50/webapps/balancer/WEB-INF/config" 디렉토리에 위치한 rules.xml
파일을 변경하라.RoundRobinRule
룰 엘리먼트를 주석처리하고, RandomRedirectRule
룰 엘리먼트의 주석을 제거하라. 또한 클러스터의 톰캣 인스턴스를 3개가 아닌 2개로 사용하고 싶다면, 세번째 룰을 주석처리하고 maxServerInstances
의 값을 3에서 2로 변경해라.주 : 필자는 밸런서와 예제 웹 어플리케이션만 남기고 톰캣 설치본에 포함된 다른 모든 웹 어플리케이션(jsp-examples, 등등)은 제거했다.
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까지 반복한다. 또한 데이터의 손실없이 클러스터 멤버로 세션 정보가 복사되었는지 체크해 본다.
Figure 3. Cluster application sequence diagram (큰 화면으로 보기 위해 그림을 클릭하시오)
- 공유 링크 만들기
- X
- 이메일
- 기타 앱
댓글