IBM®
메인 컨텐츠로 가기
    Korea [국가변경]    이용약관
 
 
   
        제품    서비스 & 솔루션    고객지원 & 다운로드    회원 서비스    
한국 developerWorks   >   Open developerWorks  > developerworks

테라코타를 이용한 톰캣 세션 클러스터링



장윤기
장윤기 tingle@hanmail.net

직장 생활 9년 차의 개발자로, 초기엔 유닉스 C 프로그램을 했고 1999년부터 본격적으로 자바를 이용한 개발을 수행했다. 하이텔 자바동호회 활동을 시작으로 마이크로소프트웨어, 프로그램세계 등의 잡지에 자바 관련 각종 기고를 한바 있다.


난이도 : 초급
2007년 12월 31일


[오픈 디벨로퍼웍스]는 여러분이 직접 필자로 참가하는 코너입니다 .이번 기사에서는 대용량 서비스를 위한 클러스터링에 대하여 고민해 보겠습니다.

자주 바뀌는 GUI일수록 단위 테스트가 필요하다

지난 “아파치와 톰캣을 활용한 대용량 웹서비스 운영” 기사가 나간 이후로 많은 독자들의 문의를 받았다. 사실 아파치와 톰캣을 연동한다는 것은 이미 많은 자료와 웹 사이트에 소개된 바 있고 점점 더 손쉽게 이를 적용할 수 있도록 톰캣이 발전하고 있다. 하지만 대용량 서비스를 위해서는 단순한 연동뿐만 아니라 로드밸런싱, 클러스터링 및 서비스에 대한 자원 사이징 그리고 모니터링 등 다양한 방식의 접근이 필요하다. 이번 기사에서는 이 중에서 클러스터링에 대하여 좀더 고민해 보겠다.

   소셜 북마크

   mar.gar.in mar.gar.in
    digg Digg
    del.icio.us del.icio.us
    Slashdot Slashdot

톰캣 세션 클러스터링

지난 기사에서는 톰캣에서 기본 제공되는 세션 클러스터링 기능을 설명하였지만 사실 해당 기능을 그리 권장해 주고 싶지는 않다. 물론 없는 것보다는 괜찮긴 하지만 세션 복제가 제대로 이루어지지 않는 경우도 발생하며 설령 복제되더라도 그 속도가 느려 이미 클라이언트가 다른 톰캣으로 붙었을 때는 세션 정보가 하나도 남아 있지 않은 경우가 발생하기도 한다.
결국 제대로 된 세션 클러스터링을 하려면 다소 무모한 방법이라고 생각할 수도 있으나 여러 톰캣 인스턴스가 동일한 세션 정보를 바라보도록 하는 방법이 필요하다. 즉 하나의 세션 저장소를 바라보고 이를 톰캣 인스턴스들이 공유해 사용하는 것이다.
그렇다면 이제 필요한 것은 세션을 저장할 저장소인데 일반적으로 생각할 수 있는 것이 파일 서버와 데이터베이스일 것이다. 필자가 두 가지 경우를 두고 테스트한 것에 대한 결과는 다음과 같다.

  • 파일 서버: 파일 서버에 세션 객체를 저장해 사용하고 이를 공유해서 사용하는 경우는 세션을 공유하지 않고 메모리에 올려 사용할 때보다 10배 정도 속도 저하가 생겼다. 특히 요청이 늘어나면 디스크 I/O 증가로 인해 디스크 병목 현상이 생겨 서비스 중단 사태도 일어났다.
  • 데이터베이스: 데이터베이스에 세션 아이디 별로 레코드를 만들어 블롭(blob) 파일에 저장하는 방식이다. 이 방식은 처음에는 괜찮은 성능을 보이는 듯 했으나 요청이 늘어나면서 데이터베이스의 특정 테이블에 대한 과다한 ISUD가 일어났고 이로 인한 성능 저하가 심각하게 나타났다.
위의 두 가지 경우에 대한 해결책으로 테스트한 것이 분산 객체 캐시 서비스다.


분산 객체 캐시 서비스

자바의 캐시 서비스는 여러 가지가 있다. 대표적으로 웹 개발자들에게 많이 쓰이는 것이 오픈 소스 제품으로 opensymphony의 oscache, JBoss의 JBoss Cache 등이 있으며 상용 WAS 벤더들의 경우 WAS 내부에 혹은 별도 제품 형태로 객체 캐시 기능을 제공한다. 대부분의 캐시 서비스는 형태와 구조가 비슷하지만 몇 가지 특징을 분류해 보면 다음과 같다.

  • 분산 환경 지원 여부: 분산 환경을 지원하지 않고 오직 같은 JVM 내에서만 캐시를 제공하는 경우가 있다. 즉, 하나의 라이브러리 정도의 기능만이 제공된다.
  • 특정 벤더 종속성 여부: 특정 벤더에서 나온 캐시 서비스는 해당 벤더에서 제공하는 WAS에서만 사용이 가능한 경우가 있다.
  • 개발 편의성 여부: 캐시 서비스를 위해 별도 API를 이용해야만 하는 경우나 환경 설정만으로도 캐시 서비스가 가능한지 여부다. 별도 API를 이용해야 한다면 이를 적용하기 위하여 애플리케이션을 변경해야 하는 상황이 생기며 심지어 적용 자체가 불가능한 경우가 발생할 수도 있다.
  • 모니터링 여부: 캐시도 결국 JVM의 메모리에 올려서(별도 JVM이든 동일 JVM이든 상관 없이) 서비스를 하는 것이기에 캐시의 힙 메모리 상태, 쓰레드 상태 등을 모니터링하는 기능이 필요하다.
  • 64비트 지원 여부: 현재 사용하는 JVM은 대부분 32비트이며 32비트 JVM은 최대 2GB의 메모리를 사용할 수 있다. 이로 인해 캐시 서비스에 부하가 많이 걸릴 경우 메모리 오버플로우 에러가 날 수도 있다. 64비트를 지원하면 훨씬 더 많은 메모리를 활용할 수 있다.
  • 이외에도 많은 선택 판단 조건이 존재하므로 실제 분산 객체 캐시 서비스를 이용할 때에 여러 가지 경우를 가지고 테스트해 보고 선택할 필요가 있다.
    이 글에서는 자바와 분산 환경을 지원하고 특정 벤더에 종속되지 않는 오픈 소스 제품인 테라코타를 이용하겠다(주의: 테라코타 역시 정답은 아니다. 앞서 말했듯이 자신의 서비스 환경에 맞게 충분한 테스트 후 결정해야 한다).
시스템 구성도
그림 1. 시스템 구성도

그림 1은 이 글에서 사용하는 시스템 구성이다. 애플리케이션 서버가 톰캣에 해당되며 로드 발란서는 아파치 웹 서버, 그리고 세션 복제 저장소로 테라코타 서버를 이용한다. 다만 애플리케이션 서버에도 테라코타와 연결하기 위하여 테라코타가 설치되어 있어야 한다. 애플리케이션 서버에 설치되는 테라코타는 서버 데몬으로 실행되는 것은 아니고 테라코타 서버에 접속하기 위한 라이브러리 활용 용도로만 사용한다.
여기서 톰캣을 설치할 때 주의할 점은 윈도우 사용자의 경우 윈도우 설치본으로 설치해서는 안 된다는 것이다. 테라코타와 톰캣을 연동하려면 톰캣의 실행 셸 파일을 수정해야 하는데 윈도우 설치본에는 해당 셸 파일이 존재하지 않기 때문이다. 그러므로 윈도우 사용자라도 일반 바이너리 버전으로 설치를 하도록 하자.
아파치 웹 서버와 톰캣에 대한 자세한 설정은 이전 글을 참고하기 바라며 여기서는 톰캣과 테라코타를 연동하는 방법을 설명하겠다.



위로



톰캣과 테라코타 연동

테라코타의 가장 큰 장점 중 하나는 별도 API를 사용하지 않고 환경 설정만으로 자바 객체를 공유할 수 있다는 점이다. 이것이 장점이 되는 이유는 우리가 복제하고 공유하려는 세션 객체는 개발자가 그 내용 및 기능을 변경하는 것이 불가능하기 때문이다. 즉 해당 세션 객체 자체에 캐시와 연동하는 API를 추가할 수 없다는 것이다. 하지만 테라코타를 이용하면 설정만으로도 공유가 가능해 세션을 공유할 수 있다. 톰캣과 테라코타를 연동하는 절차는 다음과 같다.

  • 테라코타 설정 파일 작성
  • 테라코타 데몬 실행
  • 톰캣 실행 파일 수정
  • 톰캣 실행

위의 네 단계 절차에 따라 연동되는데 여기서 가장 중요한 것이 테라코타용 설정 파일을 만드는 것이다. 또한 이렇게 만들어진 설정 파일은 테라코타 서버와 테라코타 클라이언트 모두에서 사용되므로 둘간의 관계를 고려해 작성해야 한다.



위로



테라코타 설정 파일 작성

그럼 설정 파일을 만들어 보겠다.

리스트 1. tc-config.ml
  

<?xml version="1.0" encoding="UTF-8"?>
    <tc:tc-config xsi:schemaLocation="http://www.terracotta.org/schema/terracotta-4.xsd" 
        xmlns:tc="http://www.terracotta.org/config" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
        <servers>
            <server host="10.52.31.49" name="session">
                <data>data/server-data</data>
                <logs>logs/server-logs</logs>
            </server>
        </servers>
        <clients>
            <logs>logs/client-logs/%(webserver.log.name)</logs>
            <modules>
                <module name="clustered-apache-struts-1.1" version="1.1.0"/>
            </modules>
        </clients>
        <application>
        <dso>
            <instrumented-classes>
                <include>
                    <class-expression>*..*</class-expression>
                </include>
                <exclude>org.apache.coyote..*</exclude>
                <exclude>org.apache.catalina..*</exclude>
                <exclude>org.apache.jasper..*</exclude>
                <exclude>org.apache.tomcat..*</exclude>
            </instrumented-classes>
            <web-applications>
                <web-application>Cart</web-application>
            </web-applications>
        </dso>
    </application>
</tc:tc-config>
                                        

위의 설정 파일에서 주의 깊게 봐야 할 부분은 server 태그와 dso 태그다. server 태그에는 테라코타 서버의 위치를 지정한다. 예를 들어 테라코타가 10.52.31.49에서 9520 포트로 서비스하고 있다면 host 속성을 “10.52.31.49:9520”으로 작성한다. dso 태그는 테라코타를 이용해 공유할 객체 목록을 나타낸다. 즉 공유하려는 태그는 <include>로, 제외하고자 하는 객체는 <exclude> 태그에 기입하면 된다. 특히 모든 웹 애플리케이션이 아니라 특정 웹 애플리케이션만 공유하고자 할 경우 <web-application> 태그에 웹 애플리케이션 컨텍스트를 기입하면 된다. 자세한 설정 파일 정보는 테라코타 홈페이지를 참조하자. 위의 설정 파일은 테라코타 클라이언트와 서버 모두 사용하도록 만든 것이다. 그러므로 두 가지 정보가 모두 한 설정 파일에 존재한다. 물론 클라이언트용과 서버용을 별도로 만들어도 상관 없다. 이렇게 작성된 환경설정 파일을 애플리케이션 서버와 테라코타 서버에 복사하자.


위로



톰캣 실행 파일 수정

테라코타에 연결하는 데 별도 API를 이용하는 것이 아니며 JVM을 실행할 때 테라코타 라이브러리를 참조하여 실행하면 된다. 이때 테라코타는 특정 운영체제에 맞게 별도의 테라코타 라이브러리를 참조하는데 운영체제에 맞는 dso 라이브러리를 만들려면 make-boot-jar 명령을 수행하면 된다.
톰캣의 경우 JAVA_OPTS 환경 변수에서 톰캣을 실행하고자 하는 각종 옵션을 적용할 수 있다. JAVA_OPTS 환경 변수에 테라코타의 dso 부트 라이브러리를 적용하면 된다. 유닉스 사용자의 경우 Catalina.sh 파일 중에서 JAVA_OPTS 설정 부분을 다음과 같이 수정하자. 이때 반드시 dso-boot.jar 파일의 정확한 이름을 확인하고서 기입하기 바라며 또한 서비스하고자 하는 테라코타 서버의 아이피와 포트도 환경에 맞게 변경해 적용한다.

  

JAVA_OPTS=$JAVA_OPTS -Xbootclasspath/p:"$TC_HOME/lib/dso-boot/dso-boot-hotspot_
<운영체제명>.jar" -Dtc.install-root="$TC_HOME/bin/.." -Dtc.config=10.52.31.49:9510
                                        

윈도우 사용자의 경우 Catalina.bat 파일을 다음과 같이 수정하며 이때 유닉스 설정과 마찬가지로 dso 부트 라이브러리 파일 이름과 테라코타 서버의 아이피 및 포트를 적절하게 변경해 작성하자.

  

set JAVA_OPTS=%JAVA_OPTS% -Xbootclasspath/p:"%TC_HOME%\lib\dso-boot\dso-boot-
hotspot_<운영체제명>.jar" -Dtc.install-root="%TC_HOME%\bin\.." -Dtc.config=10.52.31.49:9510
                                        


위로



테스트

그럼 다음 명령을 이용해 테라코타 서버를 실행하자.

  

$TC_HOME/bin/start-tc-server.sh –f tc-config.xml
                                        

테라코타 서버가 에러 없이 정상으로 실행되었으면 이제 톰캣을 실행해 보자. 톰캣을 실행했을 때 다음과 같은 메시지가 나타나면 연결이 성공한 것이다.

  

2007-12-03 14:25:02,765 INFO - Terracotta 2.4.4, as of 20071003-131030 (Revision 5783 by cruise@WXPMO0 from 2.4)
2007-12-03 14:25:03,406 INFO - Configuration loaded from the server at “10.52.31.50:9510'.
                                        

톰캣 1과 톰캣 2 모두를 실행하고 아파치 웹 서버를 통해 접속해 보면 세션이 정상으로 공유되고 있음을 확인할 수 있다.
그럼 세션이 공유되고 있는 상태를 한번 확인해 보자. 테라코타는 JMX 기반으로 모니터링 화면을 제공한다. 테라코타 모니터링 화면은 admin.sh 명령을 수행하면 GUI 화면이 실행되고 모니터링 하려는 테라코타 아이피와 포트를 입력하면 공유되고 있는 세션 수, 객체 수 등을 실시간으로 확인할 수 있다.

테라코타 모니터링 화면
그림 2. 테라코타 모니터링 화면



위로



추가 고려 사항

위와 같은 구성을 서비스에 적용하려면 몇 가지 추가로 테스트해 볼 것이 있으며 그 내용은 다음과 같다.

  • 테라코타 서버가 비정상 종료되었을 경우: 테라코타 역시 소프트웨어이기에 오류나 장애가 발생할 수 있다. 테라코타 서버가 종료되면 공유하고 있던 모든 톰캣 서버에 장애가 생긴다. 그러므로 이를 해결하기 위해 테라코타 서버 역시 클러스터링을 하는 등의 대책이 필요하다.
  • 서버 실행 순서: 눈치 챘을 수도 있지만 톰캣을 먼저 실행하고 테라코타를 실행하면 서비스가 이루어지지 않는다. 이는 결국 장애가 발생하여 테라코타를 재시작하게 되면 톰캣 역시 재시작해야 한다는 문제가 있다.
  • 테라코타 서버에 연결할 톰캣 인스턴스 수: 수많은 톰캣 인스턴스를 하나의 테라코타에 연결하면 테라코타의 과부하로 인해 톰캣에 영향을 미칠 수 있다. 이를 위해 톰캣에 대한 적절한 그루핑 역시 필요하다.
이 기사의 서두에서도 말했듯이 테라코타가 꼭 세션 클러스터링을 하는 데 있어 가장 좋은 대안은 아니다. 그러므로 반드시 자신의 서비스에 맞는 다양한 환경 요소에 맞는 테스트가 선행될 필요가 있다.



위로



마치며

이상으로 분산 객체 캐시 서비스를 이용해 세션 클러스터링을 하는 것에 대해 알아보았다. 필자는 톰캣을 이용해 서비스를 제공하면서 많은 시행 착오를 거쳤다. 서비스 실행 상태에서의 수정된 애플리케이션 배포, 부하 분산, 시스템 모니터링 등에 대한 것이었으며 그 중에서 가장 힘겨운 것이 바로 세션 클러스터링 부분이었다. 아무쪼록 이 문서가 다양한 세션 클러스터링 방법에 접근해 보고 테스트하는 과정에서 자신만의 가장 최선의 방법을 선택할 수 있는 단서가 되길 바란다.



이제 전문가의 글을 단순히 ‘보는 것’에서, 직접 여러분이 developerWorks의 필자가 될 수 있습니다. IBM developerWorks를 통해 공유하고 싶은 지식이 있으신 분들은 원고 기획안을 접수해주세요. 채택되신 분께는 소정의 원고료를 드립니다.



[지난 Open dW 보기]

사이트 여행

dW 커뮤니티
포럼 | 블로그 | Spaces
dW Student Community

로컬 컨텐츠

행사 및 세미나

기획 기사

개발자 입문

튜토리얼 및 교육

TOP 10 인기자료

SW 다운로드

RSS 피드

뉴스레터
  
자바스크립트가 작동이 중지되었습니다. 이 기능을 수행하시려면 브라우저에서 자바스크립스트를 작동시켜 주시거나 이곳을 클릭해주세요.
Special offers
IBM SOA Sandbox 시험판
dW Student Community
로보코드
코드 트레이닝


    IBM 소개 개인정보 보호정책 문의