본문으로 건너뛰기

16.7 mod_cluster 커넥터

mod_cluster개요

JBoss HTTP 커넥터인 mod_cluster는 JBoss EAP의 지능형 부하 분산 솔루션이다. JBoss mod_cluster 커뮤니티 프로젝트에서 개발하고 있다. 전통적인 HTTP 기반 로드 밸런서들의 단점을 보완하기 위해서 시작한 프로젝트이다.

mod_clustermod_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에 설정하는 방법을 살펴보자.

작업 절차

따라하기

  1. 웹 서버 커넥터 다운로드
  2. HTTPD 모듈 디렉터리에 *.so 파일 복사
  3. mod_cluster.conf 파일 작성
  4. httpd.conf 수정
  5. 웹 서버 시작
  6. standalone-ha.xml 파일에서 multicast-address 변경
  7. JBoss EAP 인스턴스 실행
  8. mod_cluster_manager에서 연결상태 확인
  1. 웹 서버 커넥터 다운로드

    • 레드햇 고객 포탈(http://access.redhat.com)에 접속하여 설치할 OS 플랫폼에 맞는 JBoss EAP 6 의 웹 서버 커넥터 네이티브 패키지를 다운로드한다.

  2. HTTPD 모듈 디렉터리에 *.so 파일 복사

    • 다운로드한 웹 커넥터 네이티브 패키지 압축을 푼다.

      $ cd /EAP6book/jboss

      $ unzip ~/Downloads/jboss-eap-native-webserver-connectors-6.2.0-RHEL6-x86_64.zip
      Archive: /home/admin/Downloads/jboss-eap-native-webserver-connectors-6.2.0-RHEL6-x86_64.zip
      creating: 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.so
      inflating: jboss-eap-6.2/modules/system/layers/base/native/lib64/httpd/modules/mod_manager.so
      inflating: jboss-eap-6.2/modules/system/layers/base/native/lib64/httpd/modules/mod_advertise.so
      inflating: jboss-eap-6.2/modules/system/layers/base/native/lib64/httpd/modules/mod_proxy_cluster.so
      inflating: jboss-eap-6.2/modules/system/layers/base/native/lib64/httpd/modules/mod_slotmem.so
      inflating: 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/
  3. 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 used
    LoadModule proxy_cluster_module modules/mod_proxy_cluster.so
    LoadModule slotmem_module modules/mod_slotmem.so
    LoadModule manager_module modules/mod_manager.so
    LoadModule advertise_module modules/mod_advertise.so

    MemManagerFile /var/cache/mod_cluster

    <IfModule manager_module>
    Listen 6666

    <VirtualHost 127.0.0.1:6666>
    <Directory />
    Order deny,allow
    Allow from all
    </Directory>

    ServerAdvertise on
    AdvertiseGroup 224.0.1.105:23364
    EnableMCPMReceive
    ErrorLog logs/modcluster.log
    LogLevel info

    <Location /mod_cluster_manager>
    SetHandler mod_cluster-manager
    Order deny,allow
    Allow from all
    </Location>
    </VirtualHost>
    </IfModule>

    NameVirtualHost *:80

    <VirtualHost *:80>
    ProxyPass /* balancer://mycluster/* stickysession=JSESSIONID|jsessionid nofailover=On
    ProxyPassMatch ^/.*\.(jsp|do|mvc)$ balancer://mycluster/
    <Location />
    Order Deny,Allow
    Allow from All
    </Location>
    <Location /mod_cluster_manager>
    SetHandler mod_cluster-manager
    Order deny,allow
    Allow from all
    </Location>
    </VirtualHost>
    • 앞 절에서 설정한 mod_jk.conf 파일이 있으면, mod_jk.conf.bak 으로 이름을 변경한다.
  4. httpd.conf 수정

    • conf 디렉터리로 이동한다.

      $ cd $HTTPD_HOME/conf*
      $ vi httpd.conf*
    • httpd.conf 파일의 proxy_balancer_module을 사용하지 않도록 주석 처리되어 있는지 확인한다.

      ##LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
  5. 웹 서버 시작

    mod_cluster.conf 파일을 작성한 후 웹 서버를 시작한다.

    $ cd $HTTPD_HOME/sbin

    $ sudo ./apachectl stop

    $ sudo ./apachectl start
  6. standalone-ha.xml 파일에서 multicast-address 변경

    • 다른 클러스터와 충돌을 피하려고 standalone-ha.xml을 수정하여 기존 멀티캐스트 주소를 변경한다. modcluster 소켓 바인딩에서 ${변수명:기본값} 형식을 사용할 수 있도록 다음과 같이 변경한다. server1, server2standalone-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 인스턴스가 있으면 이 설정을 꼭 사용해야 한다.

  1. JBoss EAP 인스턴스 실행

    • 첫 번째 JBoss 인스턴스 실행 – port-offset=0

      $ cd $JBOSS_HOME/server1

      $ ./server1.sh
    • 두 번째 JBoss 인스턴스 실행– port-offset=100

      $ cd $JBOSS_HOME/server2

      $ ./server2.sh
  2. 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가 사용하는 파일을 저장하는 위치를 지정한다. 공유 메모리 사용을 위한 키나 락 파일이 이 위치에 저장된다. 절대 경로를 사용해야 한다. 공유 디렉터리를 사용하지 말고 로컬 디스크의 위치를 사용하는 것이 좋다.
Maxcontext100mod_cluster가 사용할 컨텍스트의 최댓값이다.
Maxnode20mod_cluster가 사용할 워커 노드의 최댓값이다.
Maxhost20mod_cluster가 사용할 호스트의 최댓값이다. 로드 밸런서 최대 개수이다.
Maxsessionid0저장되는 세션 ID의 최댓값이다. 5분 이내에 세션에서 받은 정보가 없으면 세션이 활성화되어 있지 않다고 판단한다. 기본값은 0 으로 비활성화 상태이다.
ManagerBalancerNamemycluster워커 노드가 로드 밸런서의 이름을 지정하지 않은 경우에 사용하는 로드 밸런서의 이름이다. 기본값은 mycluster 이다.
PersistSlotsoffon으로 설정하면 노드 이름과 컨텍스트가 파일에 저장된다.
CheckNonceonon으로 설정하면 세션 ID가 이전에 사용된 적이 있는지 확인한다.
SetHandlera핸들러를 정의하면 클러스터의 워커 노드에 대한 정보를 표시하는 웹 페이지를 사용할 수 있다.
<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
항목기본값설명
CreateBalancers2웹 서버의 가상 호스트에서 로드 밸런서를 만드는 방법을 정의한다. * 0 – 웹 서버에 정의된 모든 가상 호스트에 대해서 로드밸런서를 만든다. * 1 - 밸런서를 만들지 않는다. * 2 - 메인 서버만 만든다. 기본값이다.
UseAlias0정의된 이름이 ServerName과 같은지 확인한다.. * 0 - 확인하지 않는다. 기본값이다. * 1 - 일치하는지 확인한다.
LBstatusRecalTime5 초워커 노드의 상태를 계산하는 시간 간격을 정의한다.

표 . 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
구분기본값기본값
ServerAdvertiseAdvertise하는 메커니즘을 정의한다.\n * On으로 설정하면, 멀티캐스트를 사용하여 워커 노드에 프록시 상태 정보를 보낸다. * ServerAdvertise On http://hostname:port/ 에서 호스트 이름과 포트를 지정할 수 있다. 이름 기반의 가상 호스트를 사용하거나 가상 호스트를 사용하지 않는 경우에 지정한다.Off
AdvertiseGroup멀티캐스트 주소를 정의한다. * AdvertiseGroup_주소:포트로 설정한다. * JBoss EAP의 mod_cluster가 사용하는 멀티캐스트 IP, 포트와 같은 값을 지정한다.224.0.1.105:23364
AdvertiseFrequency멀티캐스트 메시지 전송 간격을 설정한다.10초
AdvertiseSecurityKeyJBoss 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/