RabbitMQ란?
오픈 소스 메시지 브로커로, AMQP(Advanced Message Queuing Protocol)를 기반으로 프로그램들이 서로 메시지를 주고받을 수 있도록 도와주는 메시지 큐 시스템이다. 애플리케이션 간 비동기 메시징을 가능하게 하며, 분산 환경에서 효율적인 데이터 처리를 지원한다.
추가로, 이를 클러스터 구성하면 여러 개의 노드들을 하나의 시스템처럼 묶어서 함께 동작하도록 할 수 있다. 여러 노드를 연결해 하나의 클러스터를 만들면 메시지를 분산 처리하거나 특정 노드가 장애가 나도 다른 노드가 대신 역할을 수행할 수 있기때문에 안정성이 높아진다.

RabbitMQ 클러스터 구성 방법
0. 구성 환경 (네이버 클라우드)
- OS : Rocky Linux 8.10
- test1 서버 : rabbitmq1
- test2 서버 : rabbitmq2 클러스터 구성
1. Docker, Docker Compose설치
1-1. Docker 레포 파일 추가
$ sudo tee /etc/yum.repos.d/docker-ce.repo <<EOF
[docker-ce-stable]
name=Docker CE Stable - \$basearch
baseurl=https://download.docker.com/linux/centos/8/x86_64/stable/
enabled=1
gpgcheck=1
gpgkey=https://download.docker.com/linux/centos/gpg
EOF
1-2. Docker 패키지 설치
$ sudo dnf clean all
$ sudo dnf makecache
$ sudo dnf install -y docker-ce docker-ce-cli containerd.io
1-3. Docker 서비스 활성화
$ sudo systemctl enable --now docker
$ docker --version #확인
1-4. Docker Compose 설치
$ sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose
$ docker-compose --version #확인
2. RabbitMQ 클러스터 구성
2-1. rabbitmq.yaml 작성
test1 서버에서는 아래와 같이 YAML 파일을 작성하고, test2 서버에서는 rabbitmq1을 rabbitmq2로 변경하여 작성해야 한다.
[root@test1 ~]# vi /root/test/app/rabbitmq/rabbitmq.yaml
version: '3.9'
services:
rabbitmq:
image: rabbitmq:3.9-management
container_name: rabbitmq-server1
hostname: rabbitmq1
ports:
- "5672:5672"
- "15672:15672"
- "4369:4369"
- "25672:25672"
volumes:
- /test/app/rabbitmq/lib/:/var/lib/rabbitmq
- /test/app/rabbitmq/log/:/var/log/rabbitmq
environment:
RABBITMQ_ERLANG_COOKIE: "RabbitMQ-Cluster-Cookie"
RABBITMQ_DEFAULT_USER: "admin"
RABBITMQ_DEFAULT_PASS: "rabbitpassword" #RabbitMQ 콘솔 ID/PW
restart: always
extra_hosts:
- "rabbitmq2:<test2서버 사설 IP>"
[root@test2 ~]# vi /root/test/app/rabbitmq/rabbitmq.yaml
version: '3.9'
services:
rabbitmq:
image: rabbitmq:3.9-management
container_name: rabbitmq-server2
hostname: rabbitmq2
ports:
- "5672:5672"
- "15672:15672"
- "4369:4369"
- "25672:25672"
volumes:
- /test/app/rabbitmq/lib/:/var/lib/rabbitmq
- /test/app/rabbitmq/log/:/var/log/rabbitmq
environment:
RABBITMQ_ERLANG_COOKIE: "RabbitMQ-Cluster-Cookie"
RABBITMQ_DEFAULT_USER: "admin"
RABBITMQ_DEFAULT_PASS: "rabbitpassword" #RabbitMQ 콘솔 ID/PW
restart: always
extra_hosts:
- "rabbitmq1:<test1서버 사설 IP>"
- RABBITMQ_ERLANG_COOKIE : 클러스터 통신을 위한 공통 쿠키 (모든 노드가 같아야 함)
3. RabbitMQ 컨테이너 실행
3-1. RabbitMQ 컨테이너 실행
각 서버에서 docker-compose 실행 후, 정상적으로 동작하는지 확인해 준다.
# docker-compose -f rabbitmq.yaml up -d
# docker ps

3-2. 확인
$ docker exec -it rabbitmq-server1 rabbitmqctl cluster_status

4. RabbitMQ 클러스터 설정
4-1. rabbitmq2에서 rabbitmq1에 클러스터 조인
#rabbitmq-server2의 RabbitMQ 애플리케이션 중지
$ docker exec -it rabbitmq-server2 rabbitmqctl stop_app
#rabbitmq-server2가 rabbitmq-server1 클러스터에 조인
$ docker exec -it rabbitmq-server2 rabbitmqctl join_cluster rabbit@rabbitmq1
#rabbitmq-server2 애플리케이션 다시 시작
$ docker exec -it rabbitmq-server2 rabbitmqctl start_app

4-2. 클러스터 상태 확인
$ docker exec -it rabbitmq-server1 rabbitmqctl cluster_status

4-3. RabbitMQ HA 설정
RabbitMQ의 메시지를 모든 노드에 복제하려면 HA Policy 설정이 필요하다.
$ docker exec -it rabbitmq-server1 rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all","ha-sync-mode":"automatic"}'
$ docker exec -it rabbitmq-server1 rabbitmqctl list_policies #설정 확인

5. RabbitMQ 관리 UI 접속
브라우저에서 http://<공인IP>:15672로 접속하여, Clusters 메뉴에서 rabbitmq1와 rabbitmq2가 정상적으로 표시되는지 확인한다.

추가) 방화벽
| 포트 | 사용 목적 |
| 5672 | AMQP (애플리케이션 연결) |
| 15672 | RabbitMQ 관리 UI |
| 4369 | Erlang 노드 검색 |
| 25672 | 클러스터 노드 간 통신 |
| 35197~65535 | 동적 포트 (클러스터 내 통신) |
끝!