반응형
해당 글에서는 Docker Compose를 이용하여 RabbitMQ의 브로커의 노드들을 클러스터링 하는 방법에 대해 알아봅니다.
💡 [참고] RabbitMQ에 대해 궁금하시면 아래의 글을 참고하시면 도움이 됩니다.
분류 | 링크 |
Spring Boot AMQP RabbitMQ -1 : 구조 및 종류 이해하기 | https://adjh54.tistory.com/284 |
Spring Boot AMQP RabbitMQ -2 : 로컬 환경 구성하기 | https://adjh54.tistory.com/285 |
Spring Boot AMQP RabbitMQ -3 : Java 환경 구축 및 간단 예시 | https://adjh54.tistory.com/292 |
Spring Boot AMQP RabbitMQ -4 : Exchange 종류 별 이해 및 사용예시 | https://adjh54.tistory.com/497 |
Spring Boot AMQP RabbitMQ -5 : TTL 및 데드 레터링 사용예시 | https://adjh54.tistory.com/501 |
Spring Boot AMQP RabbitMQ -6 : 메시지 큐 종류, 큐 우선순위 | https://adjh54.tistory.com/518 |
Docker : Docker를 이용하여 RabbitMQ 구축하기 | https://adjh54.tistory.com/496 |
Docker : Docker Compose를 이용하여 RabbitMQ Node Cluster 구축하기 | https://adjh54.tistory.com/517 |
API Document : QueueBuilder API Document | https://adjh54.tistory.com/505 |
API Document : ExchangeBuilder API Document | https://adjh54.tistory.com/506 |
API Document : MessageProperties, MessagePropertiesBuilder, MessageBuilderSupport | https://adjh54.tistory.com/508 |
Spring Boot AMQP RabbitMQ Github : Event Producer | https://github.com/adjh54ir/blog-codes/tree/main/spring-boot-rabbitmq |
Spring Boot AMQP RabbitMQ Github : Event Consumer | https://github.com/adjh54ir/blog-codes/tree/main/spring-boot-rabbitmq-consumer |
1) RabbitMQ
💡 RabbitMQ
- 오픈 소스 기반 메시지 브로커 소프트웨어로 분산 시스템에서 ‘메시지나 데이터’를 전달하기 위한 중간 매개체로 사용됩니다.
- AMQP(Advanced Message Queuing Protocol)를 기반으로 하며 다양한 프로그래밍 언어와 플랫폼에서 사용할 수 있습니다.
- 메시지 큐를 사용하여 메시지의 생산자와 소비자 사이에 '비동기적인 통신'함으로써 메시지는 큐에 저장되어 생산자와 소비자가 독립적으로 작동할 수 있습니다. 또한 RabbitMQ를 이용하여 메시지를 안전하게 전달하고 처리하는데 중점을 둡니다.
2) RabbitMQ 노드 클러스터링
💡 RabbitMQ 노드 클러스터링
- 여러 RabbitMQ 노드를 연결하여 단일 서비스처럼 동작하도록 하는 과정입니다.
- 클러스터링은 메시지를 처리하는 능력을 증가시키고, 시스템의 내결함성을 향상합니다. 이는 노드 중 하나가 실패하더라도 시스템이 계속 작동하도록 합니다.
- 클러스터링은 여러 노드가 같은 메시지를 처리하지 않도록 메시지를 각 노드에 분산시키는 역할을 합니다. 이를 통해 전체적인 시스템 성능을 향상하고, 메시지 처리를 보다 효율적으로 수행할 수 있습니다.
3) RabbitMQ 노드 클러스터링 예시 -1 : 구성 방법
1. 폴더 구조 확인
💡 폴더 구조 확인
- docker compose를 구성하기 위해 simple-docker-compose-rabbitmq-cluster 폴더를 구성하고, 폴더 내에 compose.yml 파일을 구성하였습니다.
💡 [참고] 아래의 github에서 확인이 가능합니다.
2. compose.yml
💡 compose.yml
- 해당 Docker Compose 파일 내에서는 rabbitmq-1, rabbitmq-2, rabbitmq-3 이름의 RabitMQ 서비스를 구성합니다.
- 각각 서비스에는 동일한 rabbitmq:3.13.3-management 이미지를 사용하고 환경 설정으로 RABBITMQ_ERLANG_COOKIE를 통해서 노드들 간의 동일한 쿠키 값을 가지고 서로 통신이 가능하게 합니다.
- rabitmq-1에서 관리 인터페이스에 대한 포트(15672)와 AMQP 프로토콜에 대한 포트(5672)를 지정하며, rabbitmq-2, rabbitmq-3에서는 depends_on을 통해서 서비스 시작순서를 정의하여 rabbitmq-1 서비스가 실행되면 이후 rabbitmq-2, rabbitmq-3 서비스가 실행되도록 지정하였습니다.
services environment | 설명 |
RABBITMQ_ERLANG_COOKIE | RabbitMQ 클러스터의 보안을 위한 설정으로, 클러스터의 모든 노드들이 동일한 Erlang 쿠키 값을 가지고 있어야 합니다. |
RABBITMQ_DEFAULT_USER | RabbitMQ의 기본 사용자 이름을 설정하는데 사용됩니다. |
RABBITMQ_DEFAULT_PASS | RabbitMQ의 기본 사용자 패스워드를 설정하는데 사용됩니다. |
services:
rabbitmq-1:
image: rabbitmq:3.13.3-management
container_name: rabbitmq-1
hostname: rabbitmq-1
environment:
- RABBITMQ_ERLANG_COOKIE=rabbitmqCookie
- RABBITMQ_DEFAULT_USER=admin
- RABBITMQ_DEFAULT_PASS=1234
ports:
- 15672:15672
- 5672:5672
rabbitmq-2:
image: rabbitmq:3.13.3-management
container_name: rabbitmq-2
hostname: rabbitmq-2
depends_on:
- rabbitmq-1
environment:
- RABBITMQ_ERLANG_COOKIE=rabbitmqCookie
- RABBITMQ_DEFAULT_USER=admin
- RABBITMQ_DEFAULT_PASS=1234
rabbitmq-3:
image: rabbitmq:3.13.3-management
container_name: rabbitmq-3
hostname: rabbitmq-3
depends_on:
- rabbitmq-1
environment:
- RABBITMQ_ERLANG_COOKIE=rabbitmqCookie
- RABBITMQ_DEFAULT_USER=admin
- RABBITMQ_DEFAULT_PASS=1234
[ 더 알아보기 ]
💡environment의 RABBITMQ_ERLANG_COOKIE는 무엇을 의미할까?
- RabbitMQ 클러스터의 보안을 위한 설정입니다. 클러스터의 모든 노드들이 동일한 Erlang 쿠키 값을 가지고 있어야 합니다.
- 이 쿠키는 노드간 통신을 위한 인증 메커니즘이며, 동일한 쿠키 값을 가지고 있는 노드들만 서로 통신이 가능합니다.
3. docker compose 실행
# 1. 구성한 폴더로 이동합니다.
$ cd simple-docker-compose-rabbitmq-cluster
# 2. docker compose를 실행합니다.
$ docker compose up -d
# 3. 구성된 docker 컨테이너 상태를 확인합니다.
$ docker compose ps
💡 docker compose가 실행됨을 확인하였습니다.
4. 컨테이너 생성 확인
💡 Docker Desktop를 통해 생성된 컨테이너를 확인하였습니다.
5. RabbitMQ Management 확인
💡 RabbitMQ Management 확인
- http://localhost:15672/ 로 접속하여 생성된 관리페이지를 확인하고, 지정한 admin / 1234 값을 통해서 접근합니다.
6. Docker 노드 클러스터링 과정
💡 Docker Node 클러스터링 과정
1. rabbitmqctl stop_app 명령어
- Docker 컨테이너의 애플리케이션을 중지합니다. 클러스터에 조인하기 전에 안전하게 중단합니다.
2. rabbitmqctl reset 명령어
- Docker 애플리케이션을 재설정합니다.
3. rabbitmqctl join_cluster rabbit@rabbitmq-1 명령어
- rabbitmq-2, rabbitmq-3 컨테이너를 rabbitmq-1에 조인합니다.
4. rabbitmqctl start_app 명령어
- 컨테이너에서 애플리케이션을 재시작합니다. 클러스터를 조인한 상태에서 애플리케이션을 다시 시작하여 정상작동하게 합니다.
docker exec -it rabbitmq-2 rabbitmqctl stop_app
docker exec -it rabbitmq-2 rabbitmqctl reset
docker exec -it rabbitmq-2 rabbitmqctl join_cluster rabbit@rabbitmq-1
docker exec -it rabbitmq-2 rabbitmqctl start_app
docker exec -it rabbitmq-3 rabbitmqctl stop_app
docker exec -it rabbitmq-3 rabbitmqctl reset
docker exec -it rabbitmq-3 rabbitmqctl join_cluster rabbit@rabbitmq-1
docker exec -it rabbitmq-3 rabbitmqctl start_app
7. Docker 클러스터링 확인
💡 Docker 클러스터링 확인
- 메인노드 rabbitmq-1을 기준으로 rabbitmq-2, rabbitmq-3로 클러스터링 되었습니다.
8. 큐 확인
💡 큐 확인
- 구성된 쿼럼 큐 내에 Leader와 Members들이 구성되어 있습니다.
4) RabbitMQ 노드 클러스터링 예시 -2 : 제외 방법
1. 클러스터링 내에서 제외를 하는 방법
💡 클러스터링 내에서 제외를 하는 방법
- 메인 노드인 rabbitmq-1는 필수적으로 존재해야 하기에 rabbitmq-2를 노드 클러스터링 내에 제외를 수행합니다.
# rabbitmq-2 애플리케이션 중지
$ docker exec -it rabbitmq-2 rabbitmqctl stop_app
# rabbitmq-2 애플리케이션 초기화
$ docker exec -it rabbitmq-2 rabbitmqctl reset
💡 아래와 같이 클러스터링 내에서 rabbitmq-2가 제외됨을 확인하였습니다.
2. 클러스터링 내에 제외된 노드를 다시 추가방법
# rabbitmq-2 애플리케이션을 클러스터에 추가
$ docker exec -it rabbitmq-2 rabbitmqctl join_cluster rabbit@rabbitmq-1
# rabbitmq-2 애플리케이션 재시작
$ docker exec -it rabbitmq-2 rabbitmqctl start_app
오늘도 감사합니다😀
반응형
'Docker > 환경설정 및 구성' 카테고리의 다른 글
[Docker] Dockerfile을 이용한 RabbitMQ 환경 구성 및 실행방법 (0) | 2024.05.28 |
---|---|
[Docker] Dockerfile을 이용한 Redis 환경 구성 및 실행방법 (0) | 2024.03.16 |
[Docker] Dockerfile을 이용한 Spring Boot App 환경 구성 및 실행방법 (1) | 2024.02.05 |
[Docker] Dockerfile을 이용한 React App 배포 환경 구성 및 실행방법 (0) | 2024.02.03 |
[Docker] Dockerfile을 이용한 Vault 배포 환경 구성 및 실행방법 (0) | 2024.02.03 |