16.7 mod_cluster 커넥터
mod_cluster개요
JBoss HTTP 커넥터인 mod_cluster는 JBoss EAP의 지능형 부하 분산 솔루션이다. JBoss mod_cluster 커뮤니티 프로젝트에서 개발하고 있다. 전통적인 HTTP 기반 로드 밸런서들의 단점을 보완하기 위해서 시작한 프로젝트이다.
mod_cluster는 mod_jk와 마찬가지로 웹 서버에서 클라이언트 요청을 JBoss 인스턴스로 포워딩하는 기능을 제공하는 HTTP기반 로드 밸런싱 모듈이다. mod_cluster는 Mod-Cluster Management Protocol(MCMP)라는 추가적인 채널을 제공하여 전통적인 로드 밸런서 모듈보다 좀 더 정교하고 안정적인 서비스를 제공하는 지능적인 HTTP 기반 로드 밸런서이다.
mod_jk와 같은 로드 밸런서는 웹 서버가 뒷 단의 JBoss 인스턴스들의 정보를 미리 알고 있어야 하지만, mod_cluster의 경우엔 JBoss 인스턴스를 증설할 때 기존의 웹 서버를 재시작하지 않아도 된다. mod_cluster의 동적 발견(Discovery)기능을 사용하기 때문이다. 새로운 노드를 추가하면 자동으로 웹 서버에 연동된다.
mod_cluster의 주요 특징
mod_cluster 커넥터는 여러 장점이 있다.
- Mod_Cluster Management Protocol(MCMP)는 JBoss 인스턴스와 웹 서버 사이의 연결 프로토콜이다. JBoss 인스턴스의 부하분산 요소와 생명 주기 이벤트를 웹 서버로 전송한다.
- JBoss 인스턴스를 추가할 때 웹 서버의 설정을 변경하지 않아도 된다.
- 애플리케이션 서버는 부하 분산 요소(factor)의 계산이 다른 커넥터보다 정확하다.
mod_cluster통해 애플리케이션 생명 주기를 제어할 수 있다. 웹 서버는 JBoss 인스턴스에 배포된 웹 애플리케이션 컨텍스트 정보를 알 수 있다. 즉, 애플리케이션이 배포된 JBoss 인스턴스에만 요청을 포워딩할 수 있기 때문에, 서버 중지나 애플리케이션 배포시 사용자에게 404 오류가 출력되지 않는다.- HTTP, HTTPS, AJP등 다양한 프로토콜로 포워딩할 수 있다.
mod_cluster 구성 및 설치
mod_cluster를 웹 서버와 JBoss에 설정하는 방법을 살펴보자.
작업 절차
따라하기
- 웹 서버 커넥터 다운로드
- HTTPD 모듈 디렉터리에
*.so파일 복사mod_cluster.conf파일 작성httpd.conf수정- 웹 서버 시작
standalone-ha.xml파일에서multicast-address변경- JBoss EAP 인스턴스 실행
mod_cluster_manager에서 연결상태 확인
-
웹 서버 커넥터 다운로드
-
레드햇 고객 포탈(http://access.redhat.com)에 접속하여 설치할 OS 플랫폼에 맞는 JBoss EAP 6 의 웹 서버 커넥터 네이티브 패키지를 다운로드한다.

-
-
HTTPD 모듈 디렉터리에
*.so파일 복사-
다운로드한 웹 커넥터 네이티브 패키지 압축을 푼다.
$ cd /EAP6book/jboss$ unzip ~/Downloads/jboss-eap-native-webserver-connectors-6.2.0-RHEL6-x86_64.zipArchive: /home/admin/Downloads/jboss-eap-native-webserver-connectors-6.2.0-RHEL6-x86_64.zipcreating: jboss-eap-6.2/modules/system/layers/base/native/creating: jboss-eap-6.2/modules/system/layers/base/native/etc/… 생략 …creating: jboss-eap-6.2/modules/system/layers/base/native/lib64/httpd/modules/inflating: jboss-eap-6.2/modules/system/layers/base/native/lib64/httpd/modules/mod_jk.soinflating: jboss-eap-6.2/modules/system/layers/base/native/lib64/httpd/modules/mod_manager.soinflating: jboss-eap-6.2/modules/system/layers/base/native/lib64/httpd/modules/mod_advertise.soinflating: jboss-eap-6.2/modules/system/layers/base/native/lib64/httpd/modules/mod_proxy_cluster.soinflating: jboss-eap-6.2/modules/system/layers/base/native/lib64/httpd/modules/mod_slotmem.soinflating: jboss-eap-6.2/SHA256SUM -
*.so파일을$HTTPD_HOME/modules/디렉터리로 복사한다.$ cd /EAP6book/jboss/jboss-eap-6.2/modules/system/layers/base/native/lib64/httpd/modules/$ cp *.so /EAP6book/web/jboss-ews-2.0/httpd/modules/
-
-
mod_cluster.conf파일 작성jboss-eap-native-webserver-connectors-6.2.0-RHEL6-x86_64.zip파일 내의jboss-eap-6.2/modules/system/layers/base/native/etc/httpd/conf내의mod_cluster.conf를 참조하여 Apache HTTP서버가 설치된 디렉터리의conf.d디렉터리($HTTPD_HOME/conf.d) 에mod_cluster.conf파일을 작성한다.# mod_proxy_balancer should be disabled when mod_cluster is usedLoadModule proxy_cluster_module modules/mod_proxy_cluster.soLoadModule slotmem_module modules/mod_slotmem.soLoadModule manager_module modules/mod_manager.soLoadModule advertise_module modules/mod_advertise.soMemManagerFile /var/cache/mod_cluster<IfModule manager_module>Listen 6666<VirtualHost 127.0.0.1:6666><Directory />Order deny,allowAllow from all</Directory>ServerAdvertise onAdvertiseGroup 224.0.1.105:23364EnableMCPMReceiveErrorLog logs/modcluster.logLogLevel info<Location /mod_cluster_manager>SetHandler mod_cluster-managerOrder deny,allowAllow from all</Location></VirtualHost></IfModule>NameVirtualHost *:80<VirtualHost *:80>ProxyPass /* balancer://mycluster/* stickysession=JSESSIONID|jsessionid nofailover=OnProxyPassMatch ^/.*\.(jsp|do|mvc)$ balancer://mycluster/<Location />Order Deny,AllowAllow from All</Location><Location /mod_cluster_manager>SetHandler mod_cluster-managerOrder deny,allowAllow from all</Location></VirtualHost>- 앞 절에서 설정한
mod_jk.conf파일이 있으면,mod_jk.conf.bak으로 이름을 변경한다.
- 앞 절에서 설정한
-
httpd.conf수정-
conf디렉터리로 이동한다.$ cd $HTTPD_HOME/conf*$ vi httpd.conf* -
httpd.conf파일의proxy_balancer_module을 사용하지 않도록 주석 처리되어 있는지 확인한다.##LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
-
-
웹 서버 시작
mod_cluster.conf파일을 작성한 후 웹 서버를 시작한다.$ cd $HTTPD_HOME/sbin$ sudo ./apachectl stop$ sudo ./apachectl start -
standalone-ha.xml파일에서multicast-address변경- 다른 클러스터와 충돌을 피하려고
standalone-ha.xml을 수정하여 기존 멀티캐스트 주소를 변경한다.modcluster소켓 바인딩에서${변수명:기본값}형식을 사용할 수 있도록 다음과 같이 변경한다.server1,server2의standalone-ha.xml파일을 모두 변경한다.
- 다른 클러스터와 충돌을 피하려고
<socket-binding name="modcluster" port="0" multicast-address="${jboss.modcluster.multicast.address:224.0.1.105}" multicast-port="23364"/>
mod_cluster 멀티캐스트 주소를 변경하려면 server1.sh, server2.sh 파일에 -Djboss.modcluster.multicast.address=224.10.1.1와 같이 파라미터를 추가하면 된다. 같은 네트워크에 JBoss EAP 6 인스턴스가 있으면 이 설정을 꼭 사용해야 한다.
-
JBoss EAP 인스턴스 실행
-
첫 번째 JBoss 인스턴스 실행 –
port-offset=0$ cd $JBOSS_HOME/server1$ ./server1.sh -
두 번째 JBoss 인스턴스 실행–
port-offset=100$ cd $JBOSS_HOME/server2$ ./server2.sh
-
-
mod_cluster_manager에서 연결상태 확인웹 브라우저에서
http://localhost/mod_cluster_manager에 접속하여mod_cluster를 이용한 연결상태를 확인한다.
mod_cluster 컴포넌트
설정 예제에서 보면, mod_cluster.conf 파일에서 LoadModule을 사용하여 4개의 모듈을 설정했다. 각 모듈이 어떤 역할을 하는지 살펴보자.
| 모듈명 | 설명 |
|---|---|
| mod_slotmem.so | 공유 메모리 관리 모듈 : 공유 메모리를 사용하여 워커 노드 정보를 여러 웹 서버 프로세스에서 사용할 수 있도록 한다. |
| mod_manager.so | 클러스터 관리 모듈 : 워커 노드 등록과 워커 노드 부하 데이터, 애플리케이션 생명 주기 이벤트 등의 메시지를 수신하고 모니터링 한다. |
| mod_proxy_cluster.so | 프록시 밸란서 모듈 : 클러스터 노드로 요청을 라우팅한다. 클러스터내의 각 노드 애플리케이션의 현재 상태 정보, 세션 ID에 따라 요청을 전달할 노드를 선택하여 전달 한다. |
| mod_advertise.so | 프록시 Advertisement 모듈 : UDP 멀티캐스트 메시지를 사용하여 프록시 서버의 상태를 브로드 캐스트 한다. JBoss EAP 인스턴스와 같은 멀티캐스트 IP를 사용하여 웹 서버와 JBoss 인스턴스 간의 상태 정보를 파악한다. |
표 . mod_cluster 구성 모듈
mod_manager.so
클러스터 관리 모듈인 mod_manager 는 워커 노드 등록하고 워커 노드의 부하상태에 대한 데이터, 애플리케이션 라이프 사이클 이벤트 등의 메시지를 수신한다.
LoadModule manager_module modules/mod_manager.so
mod_manager 모듈에서 설정할 수 있는 지시어는 다음과 같다. 웹 서버의 VirtualHost 지시어 안에서 사용한다.
| 구분 | 기본값 | 기본값 |
|---|---|---|
| MemManagerFile | /logs/ | mod_manager가 사용하는 파일을 저장하는 위치를 지정한다. 공유 메모리 사용을 위한 키나 락 파일이 이 위치에 저장된다. 절대 경로를 사용해야 한다. 공유 디렉터리를 사용하지 말고 로컬 디스크의 위치를 사용하는 것이 좋다. |
| Maxcontext | 100 | mod_cluster가 사용할 컨텍스트의 최댓값이다. |
| Maxnode | 20 | mod_cluster가 사용할 워커 노드의 최댓값이다. |
| Maxhost | 20 | mod_cluster가 사용할 호스트의 최댓값이다. 로드 밸런서 최대 개수이다. |
| Maxsessionid | 0 | 저장되는 세션 ID의 최댓값이다. 5분 이내에 세션에서 받은 정보가 없으면 세션이 활성화되어 있지 않다고 판단한다. 기본값은 0 으로 비활성화 상태이다. |
| ManagerBalancerName | mycluster | 워커 노드가 로드 밸런서의 이름을 지정하지 않은 경우에 사용하는 로드 밸런서의 이름이다. 기본값은 mycluster 이다. |
| PersistSlots | off | on으로 설정하면 노드 이름과 컨텍스트가 파일에 저장된다. |
| CheckNonce | on | on으로 설정하면 세션 ID가 이전에 사용된 적이 있는지 확인한다. |
| SetHandler | a | 핸들러를 정의하면 클러스터의 워커 노드에 대한 정보를 표시하는 웹 페이지를 사용할 수 있다. |
<Location /mod_cluster_manager>
SetHandler mod_cluster-manager
Order deny, allow
Deny from all
Allow from 127.0.0.1
</ Location>
표 . mod_manager 모듈의 지시어
mod_proxy_cluster.so
mod_proxy_cluster는 클러스터 노드에 요청을 라우팅한다. 클러스터내의 애플리케이션의 상태 정보, 세션 ID 등에 따라서 전달할 노드를 선택하고, 요청을 전달한다.
LoadModule proxy_cluster_module modules/mod_proxy_cluster.so
| 항목 | 기본값 | 설명 |
|---|---|---|
| CreateBalancers | 2 | 웹 서버의 가상 호스트에서 로드 밸런서를 만드는 방법을 정의한다. * 0 – 웹 서버에 정의된 모든 가상 호스트에 대해서 로드밸런서를 만든다. * 1 - 밸런서를 만들지 않는다. * 2 - 메인 서버만 만든다. 기본값이다. |
| UseAlias | 0 | 정의된 이름이 ServerName과 같은지 확인한다.. * 0 - 확인하지 않는다. 기본값이다. * 1 - 일치하는지 확인한다. |
| LBstatusRecalTime | 5 초 | 워커 노드의 상태를 계산하는 시간 간격을 정의한다. |
표 . mod_proxy_cluster의 부하 분산 관련 설정
ProxyPass
ProxyPass 는 원격 서버를 로컬 서버의 특정 주소에 맵핑하여 연결한다.
ProxyPass /requested/ http://worker.opennaru.com/
로컬 서버의 주소가 http://opennaru.com/ 을 가지고 있다면 위의 ProxyPass 지시문은 http://opennaru.com/requested/file1 의 로컬 요청을 http://worker.opennaru.com/file1 의 프록시 요청으로 변환하여 전달한다.
ProxyPass를 사용하여 JBoss EAP 인스턴스들에 요청을 전달하게 설정할 수 있다. 다음은 모든 요청을 mycluster라는 로드 밸런서로 전달하는 설정이다.
ProxyPass /* balancer://mycluster/*
백엔드 JBoss 인스턴스로 요청을 전달하지 말아야 할 경우에는 ‘!’을 사용한다. 다음은 정적인 컨텐츠가 보관된 images, js, css 디렉터리 하위의 요청을 전달하지 않도록 설정한 것이다.
ProxyPass /images !
ProxyPass /js !
ProxyPass /css !
특정 하위 디렉터리를 리버스 프록시하고 싶지 않을 때 ‘!’을 사용할 수 있다. 예를 들어, 다음의 설정은 /mirror/foo/i 를 제외한 /mirror/foo 요청을 backend.opennaru.com 에 전달한다.
ProxyPass /mirror/foo/i !
ProxyPass /mirror/foo http://backend.opennaru.com
ProxyPassMatch;
ProxyPassMatch는 정규식을 사용하여 프록시 URL 패턴을 지정할 때 사용한다.
단순한 문자열 비교가 아닌 정규식을 사용하는 것을 제외하고 ProxyPass 와 같다.
ProxyPassMatch ^(/*\.gif)$ http://backend.opennaru.com/$1
http://opennaru.com/foo/bar.gif 에 대한 요청을 내부적으로 http://backend.opennaru.com/foo/bar.gif 프록시 요청으로 변환하여 전달한다.
마찬가지로 특정 확장자 패턴에 대해서 JBoss 인스턴스로 전달하지 않도록 다음과 같이 설정할 수 있다.
ProxyPassMatch ^(/.*\.xml)$ !
ProxyPassMatch ^(/.*\.swf)$ !
mod_advertise.so
mod_advertise는 UDP 멀티캐스트 메시지를 사용하여 JBoss EAP 인스턴스와 웹 서버간의 상태를 브로드 캐스트한다. 클러스터링 멤버로 참가하고, 떠나는 것과 같은 상태 정보를 서로 알 수 있도록 설정한다.
LoadModule advertise_module modules/mod_advertise.so
| 구분 | 기본값 | 기본값 |
|---|---|---|
| ServerAdvertise | Advertise하는 메커니즘을 정의한다.\n * On으로 설정하면, 멀티캐스트를 사용하여 워커 노드에 프록시 상태 정보를 보낸다. * ServerAdvertise On http://hostname:port/ 에서 호스트 이름과 포트를 지정할 수 있다. 이름 기반의 가상 호스트를 사용하거나 가상 호스트를 사용하지 않는 경우에 지정한다. | Off |
| AdvertiseGroup | 멀티캐스트 주소를 정의한다. * AdvertiseGroup_주소:포트로 설정한다. * JBoss EAP의 mod_cluster가 사용하는 멀티캐스트 IP, 포트와 같은 값을 지정한다. | 224.0.1.105:23364 |
| AdvertiseFrequency | 멀티캐스트 메시지 전송 간격을 설정한다. | 10초 |
| AdvertiseSecurityKey | JBoss EAP의 mod_cluster를 식별하는 데 사용하는 문자열을 지정한다. | |
| AdvertiseBindAddress | 멀티캐스트 메시지를 보낼 때 사용할 바인드 주소를 정 의한다. NIC가 여러 개 있을 경우 특정 IP 주소가 Advertise멀티캐스트 메시지를 사용하도록 설정할 수 있다. 기본값은 0.0.0.0:23364 이다. |
표 . mod_advertise 설정 항목
mod_cluster 서브시스템 설정
웹 관리 콘솔에서 ‘Profile’ ‘Web’ ‘mod_cluster’에서 mod_cluster 서브 시스템을 설정할 수 있다. 기본적으로 ha 프로파일과 full-ha 프로파일에만 mod_cluster 서브 시스템이 활성화된다. 스탠드얼론 서버는 standalone-ha.xml 을 사용하여 서버를 시작해야 한다. 밸란서의 이름이나, 세션, 웹 컨텍스트, 프록시, SSL 및 네트워킹을 설정할 수 있다.

그림 8. mod_cluster 서브시스템 설정 화면
웹 컨텍스트 설정에서는 JBoss EAP 6 내부적으로 사용하는 컨텍스트들에 대해서 mod_cluster에 전달되지 않도록 설정되어 있다. 이 컨텍스트에 루트 컨텍스트(ROOT)가 포함되어 있어, 애플리케이션에서 루트 컨텍스트를 사용하려면 다음과 같이 ROOT 컨텍스트를 사용하도록 변경하여야 한다.
[standalone@localhost:9999 /] /subsystem=modcluster/mod-cluster-config=configuration:write-attribute(name="excluded-contexts",value="invoker,jbossws,juddi,console")
{
"outcome" => "success",
"response-headers" => {
"operation-requires-reload" => true,
"process-state" => "reload-required"
}
}
기본적으로 스티키 세션을 사용하도록 설정되어 있다.
mod_cluster 스티키 세션
스티키 세션을 사용하려면 JBoss EAP 뿐만 아니라 웹 서버의 mod_cluster 설정도 필요하다. 다음과 같이 ProxyPass에서 stickysession을 다음과 같이 설정한다.
ProxyPass /* balancer://mycluster/* *stickysession=JSESSIONID|jsessionid nofailover=On*
ProxyPassMatch ^/.*\.(jsp|do|mvc)$ balancer://mycluster/