기본적인 설치 개념은 아래 문서 참고

http://www.rabbitmq.com/clustering.html

http://www.rabbitmq.com/ha.html

 

본 구성은 active-active 구성이다.

(active-passitive 구성을 원한다면 http://www.rabbitmq.com/pacemaker.html 참고)


호스트네임을 각각의 서버에 맞게 설정

192.168.0.204  호스트명: rabbitmq1

192.168.0.205  호스트명: rabbitmq2

 

# vi /etc/hosts

192.168.0.204   rabbitmq1

192.168.0.205   rabbitmq2

# vi /etc/sysconfig/network

#HOSTNAME=localhost.localdomain

HOSTNAME=rabbitmq1

# hostname rabbitmq1

# service network restart

 

rabbitmq 설정파일에 자신의 HOSTNAME, NODENAME 설정

# vi /usr/local/rabbitmq/etc/rabbitmq/rabbitmq-env.conf

# Host Name

HOSTNAME=rabbitmq1

# Node Name

NODENAME=tone@rabbitmq1

 

각 서버에 tone.config 파일 설정

(NODENAME에 도메인이 붙었다고 해서 tone@도메인명.config가 되는건 아님)

 

특히 가장 중요한 rabbitmq node들의 포트는 실행시마다 동적으로 결정되기 때문에, 이 포트를 정해줄 필요가 있다.

고정하지 않으면, 클러스터링도 안되구, rabbitmqctl -n tone@rabbitmq2 status 를 해보면 

Error: unable to connect to node tone@rabbitmq1: nodedown 라는 메시지와 함께 

rabbitmq를 재구동할때마다 node의 포트가 계속 바뀐다.

hosts, their running nodes and ports:

- rabbitmq1: [{tone,57120}]

어쨌든.. node 포트를 35197로 고정시키자. (inet_dist_listen_min, inet_dist_listen_max)


 

또한 클러스터될 노드의 정보를 cluster_nodes를 이용해 선언한다.

클러스터 노드의 정보를 config 파일을 이용하지 않고, 동적으로도 가능하다.

(http://www.rabbitmq.com/clustering.html 참고) 

# vi /data/rabbitmq/tone.config

[

        {kernel,

                 [

                        {inet_dist_listen_min, 35197},

                        {inet_dist_listen_max, 35197}

                 ]

        },

        {mnesia, [

                        {dump_log_write_threshold, 1000}

                 ]

        },

        {rabbit, [

                        {cluster_nodes, {['tone@rabbitmq1', 'tone@rabbitmq2'], disc}},

                        {tcp_listeners, [6938]}

                 ]

        }

].

 

Rabbitmq1 서버의 .erlang.cookie 쿠키 정보를 다른 서버에 동일하게 복사.

(매뉴얼에는 /var/lib/rabbitmq/.erlang.cookie 위치에 있다고 하나, 확인해본 결과 ~/.erlang.cookie 에 있음)

# cd ~

# ls -al | grep .erlang.cookie

# vi .erlang.cookie

 여기 뭔값이 있는데 이걸 다른 서버에도 동일하게 복사


방화벽 오픈

# iptables -I INPUT -m tcp -p tcp --dport 4369 -j ACCEPT

# iptables -I INPUT -m tcp -p tcp --dport 35197 -j ACCEPT

# /sbin/service iptables save

# /sbin/service iptables restart

 

모든 서버를 아래 순서대로 내리고

# rabbitmqctl stop_app

# rabbitmqctl reset

# rabbitmqctl stop

 

모든 서버를 다시 올린다.

# rabbitmq-server –detached

 

두 서버의 클러스터 상태를 확인해보자.


rabbitmq1 서버

# rabbitmqctl cluster_status

Cluster status of node tone@rabbitmq1 ...

[{nodes,[{disc,[tone@rabbitmq1,tone@rabbitmq2]}]},

 {running_nodes,[tone@rabbitmq2,tone@rabbitmq1]},

 {partitions,[]}]

...done.


rabbitmq2 서버

# rabbitmqctl cluster_status

Cluster status of node tone@rabbitmq2 ...

[{nodes,[{disc,[tone@rabbitmq1,tone@rabbitmq2]}]},

 {running_nodes,[tone@rabbitmq1,tone@rabbitmq2]},

 {partitions,[]}]

...done.


클러스터링을 구성하면 각 노드들의 데이터나 상태는 모두 복제가 된다.

하지만 message queue만큼은 복제가 되지 않는다. (다른 노드에서 접근할 수는 있다)

따라서 message queue의 복제를 위해서는 HA를 고려한 mirrored queue를 설정해야한다.

(http://www.rabbitmq.com/ha.html 참고)

 

Spring 설정에서 queue 선언에서 x-ha-policy를 all로 설정하도록 한다 

<rabbit:queue name="큐이름" durable="true">

             <rabbit:queue-arguments>

                     <entry key="x-ha-policy" value="all" />

             </rabbit:queue-arguments>

</rabbit:queue>


또한 클러스터된 서버의 정보는 복수개이므로, 

단일 서버의 정보를 설정하는 host와 port 어트리뷰트 대신 addresses 어트리뷰트를 사용하자

<rabbit:connection-factory id="rabbitConnectionFactory" 

           addresses="192.168.0.204:6938, 192.168.0.205:6938" 

           channel-cache-size="${tone.rabbitmq.channelCacheSize}" />


CentOS 5 버전 기준..


먼저 EPEL (Extra Packages for Enterprise Linux ) 설치

# rpm -Uvh http://ftp.neowiz.com/fedora-epel//5/i386/epel-release-5-4.noarch.rpm

 

Erlang yum으로 설치 (RabbitMQ Erlang으로 만들어져있음)

# wget -O /etc/yum.repos.d/epel-erlang.repo http://repos.fedorapeople.org/repos/peter/erlang/epel-erlang.repo

# yum install erlang

 

Erlang를 소스로 설치할 경우엔 아래 의존성 패키지 설치 (소스 설치는 생략)

# yum install gcc* ncurses* openssl*

 

# wget http://www.rabbitmq.com/releases/rabbitmq-server/v2.8.7/rabbitmq-server-generic-unix-2.8.7.tar.gz

# tar zxvf rabbitmq-server-generic-unix-2.8.7.tar.gz

# cp -Rf  rabbitmq_server-2.8.7/ /usr/local/rabbitmq

 

설정을 하자. (포트 변경, 로그 파일 위치 등…)

 

 

/usr/local/rabbitmq/etc/rabbitmq 폴더에 rabbitmq-env.conf 파일을 만들고

# cd ../rabbitmq/

# mkdir -p /data/rabbitmq

# mkdir -p /log/rabbitmq

# cd etc/rabbitmq

# vi rabbitmq-env.conf

# Node Name

NODENAME=abcd

# Config file location

CONFIG_FILE=/data/rabbitmq/abcd

# MNESIA DB data file location

MNESIA_BASE=/data/rabbitmq

# Log file location

LOG_BASE=/log/rabbitmq

 

설정파일 지정시 .config는 빼고 적고. /data/rabbitmq/abcd)

실제 설정파일명은 abcd.config 처럼 .config 붙여서 생성하면 됨.

# cd /data/rabbitmq/

# vi abcd.config

[

        {mnesia, [

                        {dump_log_write_threshold, 1000}

                 ]

        },

        {rabbit, [

                        {tcp_listeners, [6938]}

                 ]

        }

].

마지막에 . 붙이는거 빼먹지 말기..

 

RABBITMQ_HOME 셋팅

# vi /etc/profile

RABBITMQ_HOME=/usr/local/rabbitmq

export RABBITMQ_HOME

PATH=$PATH:$RABBITMQ_HOME/sbin

export PATH

# source /etc/profile

 

서버 실행

# rabbitmq-server –detached


설정 변경된거 확인

# rabbitmqctl environment

.

{error_logger,{file,"/log/rabbitmq/tone.log"}},

 {tcp_listeners,[6938]},

.

 

WebUI 관리 플러그인 설정하기

# rabbitmq-plugins list

[ ] amqp_client                       3.0.0

[ ] cowboy                            0.5.0-rmq3.0.0-git4b93c2d

[ ] eldap                             3.0.0-gite309de4

[ ] mochiweb                          2.3.1-rmq3.0.0-gitd541e9a

[ ] rabbitmq_auth_backend_ldap        3.0.0

[ ] rabbitmq_auth_mechanism_ssl       3.0.0

[ ] rabbitmq_consistent_hash_exchange 3.0.0

[ ] rabbitmq_federation               3.0.0

[ ] rabbitmq_federation_management    3.0.0

[ ] rabbitmq_jsonrpc                  3.0.0

[ ] rabbitmq_jsonrpc_channel          3.0.0

[ ] rabbitmq_jsonrpc_channel_examples 3.0.0

[ ] rabbitmq_management               3.0.0

[ ] rabbitmq_management_agent         3.0.0

[ ] rabbitmq_management_visualiser    3.0.0

[ ] rabbitmq_mochiweb                 3.0.0

[ ] rabbitmq_mqtt                     3.0.0

[ ] rabbitmq_old_federation           3.0.0

[ ] rabbitmq_shovel                   3.0.0

[ ] rabbitmq_shovel_management        3.0.0

[ ] rabbitmq_stomp                    3.0.0

[ ] rabbitmq_tracing                  3.0.0

[ ] rabbitmq_web_stomp                3.0.0

[ ] rabbitmq_web_stomp_examples       3.0.0

[ ] rfc4627_jsonrpc                   3.0.0-git7ab174b

[ ] sockjs                            0.3.3-rmq3.0.0-git92d4ba4

[ ] webmachine                        1.9.1-rmq3.0.0-git52e62bc

# rabbitmq-plugins enable rabbitmq_management

The following plugins have been enabled:

  mochiweb

  webmachine

  rabbitmq_mochiweb

  amqp_client

  rabbitmq_management_agent

  rabbitmq_management

Plugin configuration has changed. Restart RabbitMQ for changes to take effect.

 

포트 개방 (6938, 15672)

# iptables -I INPUT -m tcp -p tcp --dport 6938 -j ACCEPT

# iptables -I INPUT -m tcp -p tcp --dport 15672 -j ACCEPT

# /sbin/service iptables save

# /sbin/service iptables restart


몇가지 환경설정을 하자.

기본적으로 guest/guest 계정의 사용자를 가지고 있으나, 삭제하고 새로 만들자.

# rabbitmqctl list_users

Listing users ...

guest      [administrator]

...done.

# rabbitmqctl delete_user guest

Deleting user "guest" ...

...done.

아이디 test, 비밀번호 1234로 새로운 사용자 추가

# rabbitmqctl add_user test 1234

Listing users ...

test       []

...done.

test 사용자의 권한을 administrator로 준다.

# rabbitmqctl set_user_tags test administrator

Setting tags for user "test" to [administrator] ...

...done.

 

서버 상태 보기

# rabbitmqctl status


브라우저에서 확인해볼 수 있다. (계정은 위에서 새로 생성한 test/1234)

http://192.168.0.204:15672/


rabbitmq 를 설치하고 나면, (/usr/local/rabbitmq 에 소스 설치를 예로 들어서..)


# vi /etc/profile 해서

RABBITMQ_HOME=/usr/local/rabbitmq
export RABBITMQ_HOME
PATH=$PATH:$RABBITMQ_HOME/sbin
export PATH

# source /etc/profile

해주기..


 

별도의 환경설정을 하기 위해 (포트 변경, 로그 파일 위치 등…)

/usr/local/rabbitmq/etc/rabbitmq 폴더에 rabbitmq-env.conf 파일을 만들고,
해당 정보 기입… ( 자세한 설정값은 http://www.rabbitmq.com/configure.html )


우리는 서비스 포트(5672->6938) / 로그파일 위치 / mnesia db 데이터파일 위치를 변경해보자.

# mkdir -p /tuc/data/rabbitmq
# mkdir -p /tuc/log

# cd /usr/local/rabbitmq/etc/rabbitmq
# vi rabbitmq-env.conf

# Node Name
NODENAME=tuc
# Config file location
CONFIG_FILE=/tuc/data/rabbitmq/tuc
# MNESIA DB data file location
MNESIA_BASE=/tuc/data/rabbitmq
# Log file location
LOG_BASE=/tuc/log/rabbitmq

설정파일 지정시 .config는 빼고 적고. (/tuc/data/rabbitmq/tuc)
실제 설정파일명은 tuc.config 처럼 .config 붙여서 생성하면 됨.


이제 설정파일을 만들고, 설정하자.

# cd /tuc/data/rabbitmq
# vi tuc.config

[
{mnesia, [{dump_log_write_threshold, 1000}]},
{rabbit, [{tcp_listeners, [6938]}]}
].
# rabbitmq-server -detached

변경된거 확인

# rabbitmqctl environment

.
.
{sasl_error_logger,{file,”/tuc/log/rabbitmq/tuc-sasl.log”}}
.
.
{tcp_listeners,[6938]},
.
.
이렇게 되어있을 것이다.


# cd /tuc/data/rabbitmq
혹은
# cd /tuc/log
폴더로 가서 확인해볼 것..

+ Recent posts