2008/10/13

아파치에서 톰캣을 부하 분산되도록 구성하는 방법

Apache 2.x + Tomcat 4.x + Load Balancing (or Private JVMs)

아파치에서 톰캣을 사용하는 경우 복수개의 톰캣 엔진을 이용하는 경우 부하 분산을 하는 방식을 다룬 방법입니다.
하나의 톰캣 엔진이 멀티스레드를 지원하기 때문에, 굳이 복수개의 엔진을 사용해야 하는 이유가 있을까 하고 생각이 들 수도 있습니다만,  단일 페이지에 대해서 다량의 웹 히트가 발생하게 되면, 동일 엔진으로 하여금 처리를 하게되는 현상이 발생합니다.

톰캣에서 이러한 경우 캐쉬를 이용해서 속도를 가속화하는 기능이 있는 것으로 알고 있습니다만, 만약 캐쉬를 하지 않는다면, 톰캣엔진은 동일 페이지를 여러개의 스레드가 실행되어야 하므로, 메모리 병목을 유도하게 됩니다. 특히, 썬마이크로시스템즈의 CMT와 같은 하드웨어 기반의 멀티스레드 장비(멀키코어 포함)에서는 효율이 급격히 떨어질 수 있게 됩니다.

따라서, 어쩔 수 없이 캐쉬를 사용하지 않는 경우이면서 복수 코어를 가진 프로세서(특히, CMT)를 사용해야 하는 경우라면 톰캣 엔진을 복수개로 올리는 것이 바람직한 접근입니다. 엔진이 분산됨으로써 메모리 병목을 원천차단할 수 있을테니까요.

특히, 위와 같은 apache + tomcat stack을 솔라리스용으로 사용하는 경우에는 사용하고자 하는 바이너리가 설치 플랫폼용으로 최적화된 컴파일이 되어 있는 지 확인하는 것이 매우 중요합니다. CMT용 바이너리는 여기에서 찾을 수 있습니다.

http://cooltools.sunsource.net/coolstack/

댓글 4개:

Jay Lee :
작성자가 댓글을 삭제했습니다.
Jay Lee :

톰캣 앞단에 아파치를 둠으로써 static 한 객체들(html 들이나 gif, jpg 등의 이미지 파일, css 파일 등) 로 인한 부담을 덜어주기 위해서 저런 구성을 쓰기도 하고 아니면 비싼 L4 대신에 아파치로 로드밸런싱을 할 용도로 많이 쓰이기도 하는 것 같습니다. 가끔 아파치와 뒷단 WAS 간의 연결을 담당하는 AJP에 병목 때문에 Load Test 시 문제가 발생 하기도 하지만요 ^^;

라이프Of솔라리스 :

AJP의 병목 ? 어떤 현상이 발생하는 데 ?

Jay Lee :

module 때문에 문제가 무수히 많았죠. JBOSS 4.0 대 같은 경우에 high load 에서 keepalive 버그 때문에 hang이 걸리기도 하고 OC4J 에도 버그가 꽤 있었구요. AJP Listener 가 Java Request 를 Queue 에 쌓아서 처리하기 때문에 WAS 가 직접 받아서 처리 하는거 보다는 tier 가 한단계 더 생겼다고 볼 수 있으니까요. 저는 보통 Load Test 할때에는 앞단에 Apache 를 빼고 테스트 합니다만 다른 사람들은 잘 모르겠네요 ^^;