RabbitMQ 클러스터 구축하기 - Linux
1. RabbitMQ 설치
- 모든 노드에 RabbitMQ, Erlang을 설치합니다.
2. RabbitMQ 서버 구성
- 각 노드의 RabbitMQ 서버 구성을 위해 해당 노드에 접속합니다.
- rabbitmq.config 파일을 열고 노드 이름, Erlang Cookie 및 클러스터링 구성을 추가합니다.
Docker Images
mirero@ADC40-TEST-03:~$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
rabbitmq 3-management 87d31604e8cf 5 weeks ago 275MB
Docker Container 실행 (RabbitMQ 서버 시작)
- Node 3개 구성합니다.
- 각 Node는 hostname, name, Port를 다르게 설정해야합니다.
docker run -d --hostname rabbit-1 --name rabbit-1 -p 15672:15672 rabbitmq:3-management
docker run -d --hostname rabbit-2 --name rabbit-2 -p 15673:15672 rabbitmq:3-management
docker run -d --hostname rabbit-3 --name rabbit-3 -p 15674:15672 rabbitmq:3-management
Container 확인
mirero@ADC40-TEST-03:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7a37803a609a rabbitmq:3-management "docker-entrypoint.s…" 3 minutes ago Up 3 minutes 4369/tcp, 5671-5672/tcp, 15671/tcp, 15691-15692/tcp, 25672/tcp, 0.0.0.0:15674->15672/tcp rabbit-3
2a888afca320 rabbitmq:3-management "docker-entrypoint.s…" 3 minutes ago Up 3 minutes 4369/tcp, 5671-5672/tcp, 15671/tcp, 15691-15692/tcp, 25672/tcp, 0.0.0.0:15673->15672/tcp rabbit-2
add10ff15bd5 rabbitmq:3-management "docker-entrypoint.s…" 3 minutes ago Up 3 minutes 4369/tcp, 5671-5672/tcp, 15671/tcp, 15691-15692/tcp, 25672/tcp, 0.0.0.0:15672->15672/tcp rabbit-1
3. Erlang Cookie 값 알아내기
- 모든 노드는 서로 통신하기 위해서 Erlang cookie라는 비밀 키를 공유해야 한다.
- Unix 시스템에서는 보통 /var/lib/rabbitmq/.erlang.cookie 에 존재한다.
- 이 Erlang cookie를 클러스터로 구성하려는 노드 중 하나를 기준으로 통일한다.
rabbit-1
노드의 Container에서 Erlang Cookie값을 확인해보자.- Erlang Cookie값 : RXSYFBBAOJTJENVUWDAK
mirero@ADC40-TEST-03:~$ docker exec -ti rabbit-1 /bin/bash
docker exec -ti rabbit-1 /bin/bash
root@rabbit-1:/# cat /var/lib/rabbitmq/.erlang.cookie
RXSYFBBAOJTJENVUWDAK
4. RabbitMQ Container 실행 시 Erlang Cookie 설정하기
- Node3개 실행합니다.
- 각 Node는 hostname, name, Port를 다르게 설정해야합니다.
- 클러스터 구성을 위해 Erlang Cookie 값은 동일하게 설정합니다.
docker run -d --hostname rabbit-1 --name rabbit-1 -p 15672:15672 -e RABBITMQ_ERLANG_COOKIE=RXSYFBBAOJTJENVUWDAK rabbitmq:3-management
docker run -d --hostname rabbit-2 --name rabbit-2 -p 15673:15672 -e RABBITMQ_ERLANG_COOKIE=RXSYFBBAOJTJENVUWDAK rabbitmq:3-management
docker run -d --hostname rabbit-3 --name rabbit-3 -p 15674:15672 -e RABBITMQ_ERLANG_COOKIE=RXSYFBBAOJTJENVUWDAK rabbitmq:3-management
5. RabbitMQ 클러스터 구성
- 클러스터 구성을 위해선 노드를 turn-off -> reset -> cluster join -> turn-on 과정이 필요합니다.
- 아래 명령어를 입력하여 Node2,3 를 Node1에 join시켜 클러스터를 구성할 수 있습니다.
# join node2 -> node1
docker exec -it rabbit-2 rabbitmqctl stop_app
docker exec -it rabbit-2 rabbitmqctl reset
docker exec -it rabbit-2 rabbitmqctl join_cluster rabbit@rabbit-1
docker exec -it rabbit-2 rabbitmqctl start_app
docker exec -it rabbit-2 rabbitmqctl cluster_status
# joing node3 -> node1
docker exec -it rabbit-3 rabbitmqctl stop_app
docker exec -it rabbit-3 rabbitmqctl reset
docker exec -it rabbit-3 rabbitmqctl join_cluster rabbit@rabbit-1
docker exec -it rabbit-3 rabbitmqctl start_app
docker exec -it rabbit-3 rabbitmqctl cluster_status
오류 발생
- 현재 테스트 Linux서버는 4369포트를 사용할 수 없어서 Clustering 하지 못합니다.
mirero@ADC40-TEST-03:~$ docker exec -it rabbit-2 rabbitmqctl join_cluster rabbit@rabbit-1
Clustering node rabbit@rabbit-2 with rabbit@rabbit-1
Error: unable to perform an operation on node 'rabbit@rabbit-1'. Please see diagnostics information and suggestions below.
Most common reasons for this are:
* Target node is unreachable (e.g. due to hostname resolution, TCP connection or firewall issues)
* CLI tool fails to authenticate with the server (e.g. due to CLI tool's Erlang cookie not matching that of the server)
* Target node is not running
In addition to the diagnostics info below:
* See the CLI, clustering and networking guides on https://rabbitmq.com/documentation.html to learn more
* Consult server logs on node rabbit@rabbit-1
* If target node is configured to use long node names, don't forget to use --longnames with CLI tools
DIAGNOSTICS
===========
attempted to contact: ['rabbit@rabbit-1']
rabbit@rabbit-1:
* unable to connect to epmd (port 4369) on rabbit-1: nxdomain (non-existing domain)
Current node details:
* node name: 'rabbitmqcli-616-rabbit@rabbit-2'
* effective user's home directory: /var/lib/rabbitmq
* Erlang cookie hash: BZnl4w09FH7JfVcfja6MHw==
- RabbitMQ가 기본적으로 사용하는 포트는 다음과 같습니다.
- 5672: AMQP 프로토콜을 사용하는 클라이언트 애플리케이션과의 통신에 사용됩니다.
- 15672: 웹 기반의 관리자 도구에 사용됩니다.
- 4369: Erlang Distribution Port Mapper Daemon에 사용됩니다.
- 25672: Erlang Distribution에 사용됩니다.
오류 해결 방법
- 4369, 25672 포트를 허용시킨다.
- Container 내부에 /etc/rabbitmq/rabbitmq.config 파일 생성 후 허용할 포트를 변경한다.
rabbitmq.config 파일 내용
[
{rabbit, [
{tcp_listeners, [{"127.0.0.1", PORT_NUMBER}]},
{tcp_listen_options, [binary,
{packet, raw},
{reuseaddr, true},
{backlog, 128},
{nodelay, true},
{exit_on_close, false}]},
{dist_listen_options, [{port, ANOTHER_PORT_NUMBER}]}
]}
].
- 위 설정에서 PORT_NUMBER는 Erlang Distribution 포트 번호를 지정하고,
- ANOTHER_PORT_NUMBER는 Erlang Distribution Port Mapper Daemon 포트 번호를 지정합니다.
- config파일 설정 후 RabbitMQ 서버를 재시작하여 적용합니다.
6. 클러스터 상태 확인
- 만약 오류가 해결됐다면 아래 명령어를 입력하여 rabbit-1 서버에 join됐는지 확인합니다.
docker exec -it rabbit-1 rabbitmqctl cluster_status
'프로그래밍 > RabbitMQ' 카테고리의 다른 글
[RabbitMQ] 스트림 (0) | 2023.09.05 |
---|---|
[RabbitMQ] 미러링 (0) | 2023.05.03 |
[RabbitMQ] 클러스터링 (0) | 2023.05.03 |
[RabbitMQ] 성능 향상 위한 가이드 (0) | 2023.04.28 |
[RabbitMQ] 메시지 송수신 - RoutingKey (0) | 2023.04.19 |