기본적인 설치 개념은 아래 문서 참고
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}" />