SW/Container

[Docker] RabbitMQ 클러스터 구성하기

yeit 2025. 3. 3. 17:27
728x90

 

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 동적 포트 (클러스터 내 통신)

 

 

끝!

728x90