프로그래밍/RabbitMQ

[RabbitMQ] 클러스터 구성하기 - Linux

Victory_HA 2023. 9. 5. 09:25

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에 사용됩니다.

오류 해결 방법

    1. 4369, 25672 포트를 허용시킨다.
    1. 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