Tomcat 5에서의 클러스터링과 로드 밸런싱, Part 2 上편


Tomcat 5에서의 클러스터링과 로드 밸런싱, Part 2 上편
04/14/2004
번역 허태명
이 글은 톰캣 5 서버에서 클러스터링과 로드 밸런싱에 관한 시리즈의 두번째 파트이다. 파트 1에서 필자는 확장성과 고가용성을 위한 시스템을 디자인할 때 고려해야할 다양한 요소와 Large-scale J2EE 시스템 디자인의 개괄에 대해 얘기했다. 또한 클러스터링, 로드 밸런싱, 결함 허용, 세션 복제 능력에 대한 톰캣의 지원에 대해서도 논했다. 이번 파트에서 우리는 제시된 클러스터 설정의 아키텍쳐와 클러스터를 배치할 때(다수의 톰캣 서버 인스턴스를 운영함으로써)의 설치와 설정의 세세한 부분에 대해 다룰 것이다.

제시된 클러스터 설정

아래 목록은 제시된 톰캣 클러스터에서 필자가 달성하기 원하는 주 목적들이다:
  • 클러스터는 고도의 확장성이 있어야 한다.
  • 클러스터는 결함 허용을 지원해야 한다.
  • 클러스터는 동적으로 설정가능해야 하며, 그것은 클러스터를 프로그램적(자바 코드의 변경)으로 보다는 선언적(설정 파일의 변경)으로 관리하기 쉬워야 한다는 것을 의미한다.
  • 클러스터는 자동 클러스터 멤버 감지 기능을 제공해야만 한다.
  • 세션 데이터를 위한 메모리 세션 상태 복제 기능을 갖고 있는 Fail-over와 로드 밸런싱 기능
  • 플러그인/설정가능한 로드 밸런싱 정책
  • 클러스터 멤버가 합류하거나 그룹에서 떠날 때 그룹 멤버쉽 공지 기능
  • 멀티캐스트를 통한 메세지 전송의 손실이 없어야 한다.
  • 클러스터링은 웹 어플리케이션과 서버에 잘 연계되어야 한다. 클러스터는 클라이언트와 서버 양쪽에 투명성을 제공해야 한다. 클라이언트 투명성은 클라이언트가 클러스터링된 서비스나 클러스터가 어떻게 설정됐는지 모른다는 의미이다. 클러스터는 각각의 서비스들 보다는 단일한 것으로써 확인되고 접근되어야 한다. 서버 투명성은 서버의 어플리케이션 코드는 그것이 클러스터 내에 있는지 몰라야 한다는 것을 의미한다. 어플리케이션 코드는 다른 클러스터 멤버와 통신할 수 없다.
클러스터링 환경을 설정하기 위해 4개의 톰캣 서버 인스턴스가 설치되었다. 톰캣은 로드 밸런싱과 클러스터링 양쪽의 요구사항을 위해 사용되었다. 클러스터 설정은 수직 확장 방법 (단일 머신에 다수의 톰캣 서버 인스턴스 운영)을 사용하였다. 1개의 서버 그룹과 2개의 복제본이 클러스터에 설정되었다.(서버 그룹은 어플리케이션 서버의 논리적 표시이다.) 복제본은 세션 복제를 최적화하기 위해 서버 그룹과 설정(웹 어플리케이션의 디렉토리 구조와 컨텐츠를 의미)을 완전히 똑같이 한다. 다음은 제시된 클러스터 설정의 주요 컴포넌트들이다:
  • 로드 밸런서: 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의 어플리케이션 아키텍쳐 다이어그램은 클러스터의 주요 컴포넌트를 보여준다.
Figure 1
Figure 1. Tomcat cluster architecture diagram

톰캣 인스턴스의 설치 & 설정

Table 1. 톰캣 클러스터링을 설정하는데 사용된 머신의 하드웨어/소프트웨어 스펙
ProcessorHP Pavilion Pentium III 800 MHz
Memory512 MB RAM
Hard Disk40 GB
Operating SystemWindows 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의 클래스 다이어그램에 나타나 있다.
Figure 2
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 타겟을 호출하라.

예제 코드

이 글에서 사용된 예제 코드는 tomcatclustering.zip에서 구할 수 있다. 톰캣 서버 인스턴스들을 설치한 후에(4개가 필요하다.), 톰캣 디렉토리에 zip 파일의 압축을 풀어라. 제공된 예제 코드는 로드 밸런싱 정책으로 RoundRobinRule 방식을 사용한다. 만약 랜덤 리다이렉트 정책을 사용하고 싶다면, "tomcat50/webapps/balancer/WEB-INF/config" 디렉토리에 위치한 rules.xml 파일을 변경하라.RoundRobinRule 룰 엘리먼트를 주석처리하고, RandomRedirectRule 룰 엘리먼트의 주석을 제거하라. 또한 클러스터의 톰캣 인스턴스를 3개가 아닌 2개로 사용하고 싶다면, 세번째 룰을 주석처리하고 maxServerInstances의 값을 3에서 2로 변경해라.
주 : 필자는 밸런서와 예제 웹 어플리케이션만 남기고 톰캣 설치본에 포함된 다른 모든 웹 어플리케이션(jsp-examples, 등등)은 제거했다.

HTTP Request 흐름

예제 클러스터 환경에서의 웹 리퀘스트의 흐름은 다음과 같다:
  1. 시작 페이지 호출 (http://localhost:8080/balancer/testLB.jsp).
  2. JSP는 밸런서 필터로 리퀘스트를 리다이렉트 시킨다. (URL: http://localhost:8080/balancer/LoadBalancer).
  3. 로드 밸런서(TC-LB)로서 실행되는 톰캣 서버는 웹 리퀘스트를 인터셉트하고 설정 파일에 정의된 로드 밸런싱 알고리즘에 의거하여 다음 사용 가능한 클러스터 멤버(TC01, TC02, TC03)로 리다이렉트 시킨다.
  4. 선택된 클러스터 멤버의 JSP 스크립트 sessiondata.jsp("clusterapp" 웹 어플리케이션에 위치한)가 호출된다.
  5. 만약 세션이 변경되었다면 ClusterAppSessionListener에 있는 세션 리스너 메소드가 세션 변경 이벤트를 기록하기 위해 호출된다.
  6. sessiondata.jsp는 웹 브라우저에 세션의 자세한 데이터를 보여준다.(세션 ID, 마지막 접근 시간, 등등)
  7. 랜덤하게 하나 또는 2개의 클러스터 노드를 중지시킨다.(Ant 스크립트의 "stop.tomcat5x" 타겟을 호출함으로써)
  8. 사용가능한 클러스터 멤버중의 하나로 리퀘스트 fail over가 발생하는지 살펴보기 위해 위의 단계 1부터 7까지 반복한다. 또한 데이터의 손실없이 클러스터 멤버로 세션 정보가 복사되었는지 체크해 본다.
Figure 3은 웹 리퀘스트 흐름을 시퀀스 다이어그램으로 보여준다.
Click for larger view
Figure 3. Cluster application sequence diagram (큰 화면으로 보기 위해 그림을 클릭하시오)

댓글

이 블로그의 인기 게시물

4,5,6 띠 저항의 색띠를 읽는 법(띠저항 값)

수지에서 인천공항 리무진 버스 (인천공항버스정보)(2022년3월업데이트)

수지에서 김포공항 리무진 버스 ( 2022년 3월 업데이트 )