개발자의 노트
반응형

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

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}" />


profile

개발자의 노트

@곽코딩

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!