r1 - 2013-11-08 - 05:37:29 - SungJehoYou are here:Foswiki>Docs Web>RabbitMQ
editattachsettingsACLs

add
print raw
historyrenamedelete
children new

먼저 이 페이지의 내용은 참고만 하고, 실제의 내용은 홈페이지의 메뉴얼을 참조하도록 하자. 어떤경우라도 메뉴얼은 진리에 수렴한다. 메뉴얼은 비 정상적인 조작을 막아주고, 정석적인 조작을 유도함으로써, 장애의 요소를 최소한으로 줄여주고, 트러블슈팅에 유용하다. 경험으로 얻어진 산물을 무시할 수는 없겠지만, tricky 한 설정은 언젠가는 누구도 이해하지 못하고 건들지 못하는 legacy가 되어, 결국엔 독이 된다고 믿고 있다. 가능하면 소프트웨어와 함께 배포되는 메뉴얼을 세밀하게 탐독하고, 이를 바탕으로 구성하기를 권한다.

또한, 이 메뉴얼은 되도록이면 "2 pass" 로 읽기를 권한다. 보면서 직접 수정하지 말고, 한번 읽어본 후에 참조하는 형태로 진행하면 실수가 적을것이다.

RabbitMQ

RabbitMQ 는 AMQP(Advanced Message Queuing Protocol) 라는 공개된 프로토콜을 활용하는 Message Queue Manager 이다. 쉽게 생각하면, 다른 어플리케이션들에게 메세지를 중간에서 신뢰성있게 전달하는 브로커 역할을 수행한다.

  • Message flow from producers to consumers:
    producer-consumer.png

이를 생산자-소비자 문제로 환원시켜 본다면, 메세지큐는 마치 택배서비스로 상상할 수 있는데, 생산자는 택배서비스를 통해 메세지를 받거나, 보낼 수 있으며, 소비자측도 마찬가지로 택배서비스를 통해 메세지를 받거나 보낼 수 있다. 상호 직접 연결된것이 아닌, 택배서비스를 매개로 자료를 교환한다고 생각할 수 있다.

종래 어플리케이션도 직접 서버로 연결해서 뭔가를 요청하고 받는 형태의 서버-클라이언트 관계가 될 수 있지만, 중간에 메세지큐를 위치함으로써 다수의 생산자-소비자 간의 라우터 역할을 수행한다. 메세지큐에게 메세지의 전송에 관한 모든것을 일임하고 어플리케이션과 서버는 느슨한 관계를 유지할 수 있는데, 다수의 어플리케이션간의 메세지를 전달해보려 시도해 보았다면, 이것이 얼마나 손이 많이 가는 일인지 알 수 있을것이다.

RabbitMQ 는 멀티프로세서에서 강력한 성능을 보이는 Erlang 언어로 작성되었으며, 때문에 동작시 반드시 Erlang 이 설치되어 있어야 한다. 또한 다수의 설정관례가 Erlang 의 그것을 따라가기 때문에, 다소 어색한 부분이 있다. (고급의 설정을 원한다면, 아마도 Erlang 문서를 참조해야 할지 모른다)

RabbitMQ Installtion

  • 아래의 사양에서 작업하였다.
    OS CentOS 6 x64

  • 구성 시나리오는 다음과 같다.
    prac01.test.platform.gsenext.com v3.0.4 Cluster v3.2.4 Cluster
    prac02.test.platform.gsenext.com
    prac03.test.platform.gsenext.com
    prac{01..03} 까지 구성되며, 각각 RabbitMQ v3.0.4 와 v3.2.4 버전의 클러스터 2개가 구성된다. (물론 실제로는 이렇게 쓸일은 없을것이다, 테스트용.)

  • 시스템적인 구성을 건들이지 않고, 모든 작업은 홈 디렉토리에서 작업하였다.

선행작업

  1. 호스트네임을 설정할것
    클러스터로 동작하는 특성탓에, 호스트네임에 굉장히 민감하다. RabbitMQ 는 상호 노드의 인지를 아이피가 아닌 짧은 호스트네임(도메인이 붙지않은)으로 구별하는데, DNS 등의 시설이 확보되지 않은 상황이라면 테스트시에는 /etc/hosts 에 미리 클러스터로 구성될 각 노드의 정보를 입력하도록 한다. 예를 들면 다음과 같다.
    [s_jeho@prac02 ~]$ cat /etc/hosts
    ...(중략)...
    10.xx.xxx.133      prac01  prac01.test.platform.gsenext.com
    10.xx.xxx.134      prac02  prac02.test.platform.gsenext.com
    10.xx.xxx.135      prac03  prac03.test.platform.gsenext.com
           
    물론 당연한 말이겠지만, hosts 파일을 직접 편집할때는 클러스터를 구성하는 모든 노드의 /etc/hosts 를 편집해야 한다. 만약 이 정보가 빠지는 노드가 있으면 클러스터 구성이 이루어 지지 않고, 디버그하기가 어렵다. 2. *사용하는 포트정보*
    내부 네트워크에서 사용하는 목적이라면 큰 상관은 없지만, 관리화면같은경우는 외부에서도 접근할 일이 있으므로 다음의 포트정보를 기억해두도록 한다.
    5672 RabbitMQ
    55672 Management-plugin
    15672 Management-plugin(deprecated)
    참고로, 15672 포트는 예전 구형버전에서 관리페이지의 포트로 쓰였는데 v3.0 으로 들어오면서 55672 로 변경됐다. 기존 환경과의 호환성을 위해 자동으로 15672 로 재지정(redirection) 될 수 있으며, 이를 막고싶다면 설정에서 포트를 고정해주어야 한다.
       # etc/rabbitmq/rabbitmq.config 의 예시
    
       {rabbitmq_management, [
           {listener,[{port, 55672}]},
           {redirect_old_port, false}
       ]}
           

erlang 의 설치

앞서 언급했듯이, RabbitMQ 는 erlang 으로 작성되어 있다. 따라서, erlang 해석기가 설치되어 있어야 하며, 이는 CentOS 에서 기본으로 제공되지는 않기 때문에 이를 위해 EPEL 저장소 를 추가해야 한다. 다음과 같은 방식으로 추가할 수 있다.

yum install http://mirror.premi.st/epel/6/i386/epel-release-6-8.noarch.rpm

EPEL 저장소의 추가가 끝난후에는, yum 으로 erlang 패키지를 설치하면 된다.

sudo yum install erlang

설치가 끝나고 erlang 이 정상적으로 실행되는지 확인하면 된다.

[s_jeho@prac02 ~]$ erl
Erlang R14B04 (erts-5.8.5) [source] [64-bit] [smp:2:2] [rq:2] [async-threads:0] [kernel-poll:false]

Eshell V5.8.5  (abort with ^G)
1> (빠져나오려면 ctrl+c 두번입력)

RabbitMQ 바이너리의 설치

본 튜토리얼에서는 3.0.x 버전을 기준으로 설치를 진행한다. 현재 최신버전은 3.2.x 이며, 보통 RabbitMQ 홈페이지에서 받을 수 있겠으나, 구 버전의 경우 Older Versions 에서 찾아야 할것이다.

주의할것은, rabbitmq-server-generic-unix-<버전>.tar.gz 를 다운받도록 한다. 미리 컴파일이 된 버전이라, 다운받고 바로 사용할 수 있다. 비슷한 파일로 rabbitmq-server-<버전>.tar.gz 가 있는데, 이것은 컴파일이 필요한 소스코드이다.

wget http://www.rabbitmq.com/releases/rabbitmq-server/v3.0.4/rabbitmq-server-generic-unix-3.0.4.tar.gz
tar xvf rabbitmq-server-generic-unix-3.0.4.tar.gz

이 시점에서 rabbitmq-server-3.0.4 디렉토리가 생성되었을 것이다. 앞으로는 이 디렉토리가 RabbitMQ 의 홈 디렉토리로 가정하며, 특별한 언급이 없다면 하위 언급되는 모든 경로의 기본경로로 가정한다.

RabbitMQ 의 설정

사실, 별도의 설정을 하지 않고도 RabbitMQ 은 기본값으로 실행된다. 다만, 문제가 발생했을때, 혹은 재구성할때 다음의 내용을 이해하지 않고는 조작이 어려우므로, 가능하면 읽고 넘어가는것이 좋겠다.

이 문서에서 설명하는 부분은 다음과 같다.

  1. 시스템 환경변수 설정 - etc/
  2. erlang 스타일의 rabbitmq.config 설정파일 수정 - sbin/
  3. 실행시 적용되는 매개변수와 정책들

RabbitMQ 가 실행되는 당시의 쉘 환경을 제어하여 설정을 조절할 수 있고, 보통의 프로그램처럼 conf 파일을 통해 적용해야 할 부분이 있다. 이 두 부분의 설정이 사실상 RabbitMQ 설정이라고 봐도 좋을것이라 생각된다.

어쨌든, RabbitMQ 의 설정을 위해서는(덧붙여 트러블슈팅을 위해서는) 설정파일이 어떻게 동작하는지 이해할 필요가 있다.

RabbitMQ 의 시스템 환경변수의 설정

sbin/ 디렉토리 내의 파일들은 쉘 스크립트의 형태를 띄고 있고, 쉘 환경변수를 조작하여 프로그램의 실행시 적절한 값을 넘겨줄 수 있다. 상기 언급된 링크에서 사용 가능한 자세한 환경변수들을 확인할 수 있다. (그러나 모두를 사용하지는 않을것이고, 큰 변경은 없을것이다.)

sbin/rabbitmq-server

  • 프로그램의 시작은 sbin/rabbitmq-server 스크립트 부터 시작된다.
    [s_jeho@prac02 sbin]$ cat rabbitmq-server 
    #!/bin/sh
    
    ...(중략)...
    
    . `dirname $0`/rabbitmq-env
    
    ...(후략)...
          

여기서부터는 스크립트간 상호를 어떻게 호출하는가 면밀하게 살펴볼 필요가 있다. 사실 쉘에서 source 한다는것은, 기능상으로는 하나의 파일에 두들겨 넣는것과 하등 차이가 없으나, 의미와 목적에 따라 설정을 분할하여 관리할 수 있다는 면에 있어서 좋은 예제가 된다.

rabbitmq-server 스크립트가 시작되면, 제일 먼저 동일 디렉토리 내의 rabbitmq-env 를 source 한다. 이렇게 함으로써 rabbitmq-server 가 수행되는 동안 필요한 환경변수가 설정된다.

sbin/rabbitmq-env

  • rabbitmq-env 스크립트는 rabbitmq-server 가 사용할 환경변수들을 설정한다.
    1. SCRIPT_PATH
      이 스크립트가 실제로 위치하는가를 판단한다. 만약 이 스크립트가 다른 스크립트에 의해 호출된것이라면, 이 값은 호출자의 위치가 된다.
    2. SCRIPT_DIR
      상기 언급된 SCRIPT_PATH 가 위치한 디렉토리가 값이 되며, 보통 sbin/ 디렉토리의 위치이다
    3. RABBITMQ_HOME
      RabbitMQ 의 홈 디렉토리이다. 보통 SCRIPT_DIR 의 바로 하위 디렉토리가 홈 디렉토리로 취급된다.
    4. NODENAME
      클러스터를 구성할때 구분할 수 있는 노드네임이 된다. 하기의 코드를 보면 이해하기가 조금 쉽다.
{
[ "x" = "x$HOSTNAME" ] && HOSTNAME=`env hostname`
[email protected]${HOSTNAME%%.*}
}
${HOSTNAME%%.*}는 FQDN 중 짧은 호스트네임만을 취하게 되며, 상기 예제의 prac01.test.platform.gsenext.com 에서 실행했다면, NODENAME 은 [email protected] 이 될 것이다. 만약 동일한 호스트에 여러개의 RabbitMQ 를 띄우고 싶다면, 기본으로 설정된 rabbit 이라는 이름은 각각 다른이름으로 바꿔야 한다.

  • 이 스크립트의 중간에서, sbin/rabbitmq-defaults 스크립트를 source 한다.
    ## Set defaults
    . ${SCRIPT_DIR}/rabbitmq-defaults
              

sbin/rabbitmq-defaults

  • sbin/rabbitmq-defaults 은 기본 환경변수를 정의한다. 일일이 설명하는것도 어려우니, 다음의 코드를 직접 보는것이 이해가 빠르리라 생각된다.
    #!/bin/sh
    
    # ... (저작권 정보 생략) ...
    
    ### next line potentially updated in package install steps
    SYS_PREFIX=${RABBITMQ_HOME}
    
    ## Set default values
    
    CONFIG_FILE=${SYS_PREFIX}/etc/rabbitmq/rabbitmq
    LOG_BASE=${SYS_PREFIX}/var/log/rabbitmq
    MNESIA_BASE=${SYS_PREFIX}/var/lib/rabbitmq/mnesia
    ENABLED_PLUGINS_FILE=${SYS_PREFIX}/etc/rabbitmq/enabled_plugins
    
    PLUGINS_DIR="${RABBITMQ_HOME}/plugins"
    
    CONF_ENV_FILE=${SYS_PREFIX}/etc/rabbitmq/rabbitmq-env.conf
              

사실 이 부분이 설정의 핵심부분의 단서를 가지고 있다. CONFIG_FILE 환경변수와 CONF_ENV_FILE 환경변수를 잘 눈여겨 보도록 하자.

CONF_ENV_FILE 은, 기본설정을 override 하는 역할을 한다. 즉, 지금까지 설명했던 rabbitmq-{env,defaults} 파일과 같이 기본설정을 제공하는 파일을 직접 뜯어고치는것이 아니라, CONF_ENV_FILE 파일에 기존에 존재하는 환경변수 설정을 덮어쓰는(override) 방식으로 진행하는 것이다.

이렇게 하면, CONF_ENV_FILE 파일을 잘 보존하는 것만으로도 환경을 그대로 유지할 수 있게된다.

CONFIG_FILE 파일은 서버설정이 담긴 파일인데, 기본적으로는 해당 파일이 없으므로 이 경로에 파일을 생성해야 한다.

다시 sbin/rabbitmq-env

  • ${SCRIPT_DIR}/rabbitmq-defaults 을 source 한 이후에는 다음과 같은 과정을 거친다.
    # ... ( 이전 내용 생략 ) ...
    
    ## Common defaults
    SERVER_ERL_ARGS="+K true +A30 +P 1048576 \
      -kernel inet_default_connect_options [{nodelay,true}]"
    
    # warn about old rabbitmq.conf file, if no new one
    if [ -f /etc/rabbitmq/rabbitmq.conf ] && \
       [ ! -f ${CONF_ENV_FILE} ] ; then
        echo -n "WARNING: ignoring /etc/rabbitmq/rabbitmq.conf -- "
        echo "location has moved to ${CONF_ENV_FILE}"
    fi
    
    ## Get configuration variables from the configure environment file
    [ -f ${CONF_ENV_FILE} ] && . ${CONF_ENV_FILE}
              

CONFIG_FILECONF_ENV_FILE 를 다루는 방식이 조금 다른데, CONFIG_FILE 은 파일이 없을 경우 경고를 내뱉는 형태이고, CONF_ENV_FILE 같은경우는 직접 source 시킨다.

이것으로 미루어볼때, CONF_ENV_FILE 은 쉘 환경변수의 형태로 입력해야 함을 알 수 있다.

다시 sbin/rabbitmq-server

이제서야 rabbitmq-server 가 진행되는 동안 필요한 모든 환경변수에 대한 설정이 끝났다. 이후에는 어떤식으로 나머지 설정이 이루어지는 직접 확인하길 바란다.

시스템 환경변수의 설정시 주의할 점

다시한번 당부하지만, 직접 환경설정을 뜯어고칠 생각은 말자. 가능하면 CONF_ENV_FILE 을 수정함으로써, 기존 설정을 override 하는 방식으로 진행하기를 바란다. 그편이 훨씬 관리가 쉬워진다.

CONF_ENV_FILE ( etc/rabbitmq/rabbitmq-env.conf ) 수정 예시

방식은 간단하다. 상기 언급된 환경변수의 스타일대로, 그대로 붙여넣으면 된다. 가령 클러스터를 구성할 계획이라, 노드의 이름이 각각 달라야 하는데, 노드의 이름을 수정한다면 다음과 같다.

  • etc/rabbitmq/rabbitmq-env.conf
    NODENAME=304@${HOSTNAME%%.*}
          

sbin/rabbitmq-env 의 내용중, NODENAME 설정부분을 그대로 복사해놓고, 일부 수정하였다. 순서상, CONF_ENV_FILE 파일이 항상 맨 나중에 source 되므로, 기존의 설정을 덮어써지게 된다.

RabbitMQ 의 플러그인 설정

RabbitMQ Management Plugin

가장 많이 쓰는 플러그인은 RabbitMQ Management 플러그인이다. 웹기반으로 제공되는 관리페이지이며, REST API를 제공한다.

[s_jeho@prac02 rabbitmq_server-3.0.4]$ ./sbin/rabbitmq-plugins enable rabbitmq_management

The following plugins have been enabled:
  mochiweb
  webmachine
  rabbitmq_web_dispatch
  amqp_client
  rabbitmq_management_agent
  rabbitmq_management
Plugin configuration has changed. Restart RabbitMQ for changes to take effect.

RabbitMQ 의 설정파일의 편집

rabbitmq.config 설정파일은 RabbitMQ 서버와, 얼랭 서비스, RabbitMQ 의 플러그인 설정이 담겨있다. 이 파일은 표준 얼랭 설정파일 스타일을 따르며, 이 형식에 관해서는 Erlang Config Man Page 를 참조할 수 있다.

변경된 설정을 적용하기 위해서는 RabbitMQ 를 재시작 하여야 한다.

기본적인 설정의 예제는 docs/rabbitmq.config.example 에서 참조할 수 있겠으나, 제공되지 않을때는 홈페이지에 있는 내용을 참고하도록 한다.

상기 CONFIG_FILE 환경변수에서 언급했지만, 이 파일을 기본적으로 참조하려는 위치는 ${SYS_PREFIX}/etc/rabbitmq/rabbitmq 인데, 추후 이 설정파일을 끌고올때는 etc/rabbitmq/rabbitmq.config 를 불러온다. (주의!), 따라서 etc/rabbitmq/rabbitmq.conf 에 설정을 작성해야 한다.

다음은 간단하게 설정해본 설정파일의 예시이다.
  • etc/rabbitmq/rabbitmq.conf
     [
       {mnesia, [{dump_log_write_threshold, 1000}]},
       {rabbit, [
           {tcp_listeners, [5672]},
            {log_levels, [{connection, info}]}
       ]},
       {rabbitmq_management, [
           {listener,[{port, 55672}]},
           {redirect_old_port, false}
       ]}
     ].
          

RabbitMQ 의 실행

  • 실행은 ./sbin/rabbitmq-server 명령으로 시작된다.
    [s_jeho@prac02 rabbitmq_server-3.0.4]$ ./sbin/rabbitmq-server 
    ** Found 0 name clashes in code paths 
    
    +---+   +---+
    |   |   |   |
    |   |   |   |
    |   |   |   |
    |   +---+   +-------+
    |                   |
    | RabbitMQ  +---+   |
    |           |   |   |
    |   v3.0.4  +---+   |
    |                   |
    +-------------------+
    AMQP 0-9-1 / 0-9 / 0-8
    Copyright (C) 2007-2013 VMware, Inc.
    Licensed under the MPL.  See http://www.rabbitmq.com/
    
    node           : 304@prac02
    app descriptor : /home/s_jeho/rabbitmq_server-3.0.4/sbin/../ebin/rabbit.app
    home dir       : /home/s_jeho
    config file(s) : (none)
    cookie hash    : fPAHSexPNBvYVQEGA38dbg==
    log            : ./sbin/../var/log/rabbitmq/304@prac02.log
    sasl log       : ./sbin/../var/log/rabbitmq/304@prac02-sasl.log
    database dir   : /home/s_jeho/rabbitmq_server-3.0.4/sbin/../var/lib/rabbitmq/mnesia/304@prac02
    erlang version : 5.8.5
    
    -- rabbit boot start
    starting file handle cache server                                     ...done
    starting worker pool                                                  ...done
    starting database                                                     ...done
    starting database sync                                                ...done
    starting codec correctness check                                      ...done
    -- external infrastructure ready
    starting plugin registry                                              ...done
    starting auth mechanism cr-demo                                       ...done
    starting auth mechanism amqplain                                      ...done
    starting auth mechanism plain                                         ...done
    starting statistics event manager                                     ...done
    starting logging server                                               ...done
    starting exchange type direct                                         ...done
    starting exchange type fanout                                         ...done
    starting exchange type headers                                        ...done
    starting exchange type topic                                          ...done
    -- kernel ready
    starting alarm handler                                                ...done
    starting node monitor                                                 ...done
    starting cluster delegate                                             ...done
    starting guid generator                                               ...done
    starting memory monitor                                               ...done
    -- core initialized
    starting management agent                                             ...done
    starting HA policy validation                                         ...done
    starting policy parameters                                            ...done
    starting exchange, queue and binding recovery                         ...done
    starting configured definitions                                       ...done
    starting empty DB check                                               ...done
    starting mirror queue slave sup                                       ...done
    starting adding mirrors to queues                                     ...done
    -- message delivery logic ready
    starting error log relay                                              ...done
    starting background garbage collection                                ...done
    starting networking                                                   ...done
    starting direct client                                                ...done
    starting notify cluster nodes                                         ...done
    
    broker running
    
    -- plugins running
    amqp_client                                                             3.0.4
    mochiweb                                            2.3.1-rmq3.0.4-gitd541e9a
    rabbitmq_management                                                     3.0.4
    rabbitmq_management_agent                                               3.0.4
    rabbitmq_web_dispatch                                                   3.0.4
    webmachine                                          1.9.1-rmq3.0.4-git52e62bc
          
  • 데몬형태로 띄우기 위해서는 -detached 옵션을 붙인다.
    ./sbin/rabbitmq-server -detached

  • init.d 스크립트는 RHEL 계열과 Debian 계열이 제공된다. 하기는 v3.0.4 기준의 init 스크립트이다.
    1. rabbitmq-server/packaging/RPMS/Fedora/rabbitmq-server.init
    2. rabbitmq-server/packaging/debs/Debian/debian/rabbitmq-server.init
Topic revision: r1 - 2013-11-08, SungJeho
 
This site is powered by FoswikiCopyright © by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding Foswiki? Send feedback