RabbitMQ 3.6 클러스터링

클러스터링 설정

서버 중 일부에 장애가 발생해도, 정상적으로 동작하려면 클러스러팅 환경을 구축해야 한다.

여기서는, 3 대의 머신에서 한다고 가정하고, 각 각의 IP는 192.168.199.128, 129, 130이다.

3 대의 머신 모두 .erlang.cookie 파일에 있는 값이 동일해야 한다.

scp 명령어로 나머지 두 대의 머신에 .erlang.cookie파일을 복사

1
2
3
4
5
6
7
$ scp /var/lib/rabbitmq/.erlang.cookie root@192.168.199.130:/var/lib/rabbitmq/
The authenticity of host '192.168.199.130 (192.168.199.130)' can't be established.
ECDSA key fingerprint is a8:e8:dc:f9:b8:53:39:f0:f2:0e:5d:8f:fb:a2:7d:72.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.199.130' (ECDSA) to the list of known hosts.
root@192.168.199.130's password:
.erlang.cookie                                                                                                                                 100%   20     0.0KB/s   00:00

서버간 연결할 때, HOSTNAME을 이용해야 한단다.

DNS 서버나, /etc/hosts 파일에 

각 서버의 IP와 HOSTNAME을 등록해 두자.

1
2
3
4
5
6
7
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.199.128   rabbitmq1
192.168.199.129   rabbitmq2
192.168.199.130   rabbitmq3
 
# 테스트는 ping rabbitmq1

/etc/sysconfig/network 파일에 호스트 이름을 설정해야 한다

1
2
3
$ vi /etc/sysconfig/network
# Created by anaconda
HOSTNAME=rabbitmq1

1
2
# 호스트이름을 변경한 후에는 리부팅을 해야, rabbitmq 클러스터링 설정이 가능하더라.
$ reboot

rabbitmqctl cluster_status 명령으로, 노드의 이름이 rabbit@호스트이름 으로 정상적으로 변경되었는지 확인

1
2
3
4
5
6
7
$ rabbitmqctl cluster_status
Cluster status of node rabbit@rabbitmq2 ...
[{nodes,[{disc,[rabbit@rabbitmq2]}]},
 {running_nodes,[rabbit@rabbitmq2]},
 {cluster_name,<<"rabbit@rabbitmq2">>},
 {partitions,[]},
 {alarms,[{rabbit@rabbitmq2,[]}]}]

rabbitmq2, rabbitmq3을 rabbbitmq1에 합류시키기

rabbitmq2, rabbitmq3 머신에서 아래 명령을 실행

1
2
3
4
5
6
7
8
rabbitmq2$ rabbitmqctl stop_app
Stopping node rabbit@rabbitmq2 ...
 
rabbitmq2$ rabbitmqctl join_cluster rabbit@rabbitmq1
Clustering node rabbit@rabbitmq2 with rabbit@rabbitmq1 ...
 
rabbitmq2$ rabbitmqctl start_app
Starting node rabbit@rabbitmq2 ...

모든 머신에서 합류 잘했는지 확인

nodes와 running_nodes에 3대 모두 있으면 정상

1
2
3
4
5
6
7
$ rabbitmqctl cluster_status
Cluster status of node rabbit@rabbitmq3 ...
[{nodes,[{disc,[rabbit@rabbitmq1,rabbit@rabbitmq2,rabbit@rabbitmq3]}]},
 {running_nodes,[rabbit@rabbitmq1,rabbit@rabbitmq2,rabbit@rabbitmq3]},
 {cluster_name,<<"rabbit@rabbitmq1">>},
 {partitions,[]},
 {alarms,[{rabbit@rabbitmq1,[]},{rabbit@rabbitmq2,[]},{rabbit@rabbitmq3,[]}]}]


클러스터 노드 군에서 노드 빼기

빼려는 노드는 실행 중이 아니어야 한다.

1
2
3
4
5
6
7
8
9
10
$ rabbitmqctl forget_cluster_node rabbit@rabbitmq2
Removing node rabbit@rabbitmq2 from cluster ...
# 확인 해보기
$ rabbitmqctl cluster_status
Cluster status of node rabbit@rabbitmq1 ...
[{nodes,[{disc,[rabbit@rabbitmq1,rabbit@rabbitmq3]}]},
 {running_nodes,[rabbit@rabbitmq1]},
 {cluster_name,<<"rabbit@rabbitmq1">>},
 {partitions,[]},
 {alarms,[{rabbit@rabbitmq1,[]}]}]


미러링 설정

여기서는 큐를 모든 노드에 미러링 시키도록 설정했다.

미러링 될 노드 개수 또는 노드 이름을 지정할 수 있다.

1
2
# 서버 한 곳에서만 설정해도 모든 서버에 설정이 공유된다.
$ rabbitmqctl set_policy ha-all "^ha\." '{"ha-mode":"all"}'

RabbitMQ 3.6 설치법 보기