웹사이트 검색

Ubuntu 20.04에서 RabbitMQ 클러스터를 설정하는 방법


이 튜토리얼은 다음 OS 버전에 대해 존재합니다.

  • Ubuntu 22.04(Jammy Jellyfish)
  • Ubuntu 20.04(Focal Fossa)

이 페이지에서

  1. 전제 조건
  2. 시작하기\n
  3. RabbitMQ 서버 설치
  4. RabbitMQ 관리 플러그인 활성화\n
  5. RabbitMQ 클러스터 설정
  6. 관리자 사용자 설정
  7. RabbitMQ 설정 대기열 미러링
  8. RabbitMQ 클러스터 액세스
  9. 결론

RabbitMQ는 Erlang 프로그래밍 언어로 작성된 무료 오픈 소스 다중 프로토콜 메시징 브로커 소프트웨어입니다. 메시지 브로커는 애플리케이션에 대한 메시지를 저장하는 데 사용됩니다. 애플리케이션이 다른 애플리케이션으로 데이터를 보낼 때 앱은 메시지 브로커에 메시지를 게시합니다. RabbitMQ는 여러 메시징 프로토콜을 지원하며 분산 구성으로 쉽게 배포할 수 있습니다. 메시지 브로커는 다양한 웹 애플리케이션의 중개자 역할을 하며 웹 애플리케이션의 부하와 전달 시간을 줄이는 데 사용됩니다.

이 튜토리얼에서는 Ubuntu 20.04 서버에 3노드 RabbitMQ 클러스터를 설정합니다.

전제 조건

  • Ubuntu 20.04를 실행하는 세 개의 서버.\n
  • 루트 암호는 각 서버에 구성됩니다.\n

시작하기

시작하기 전에 시스템 패키지를 최신 버전으로 업데이트해야 합니다. 각 노드에서 다음 명령을 실행하여 업데이트할 수 있습니다.

apt-get update -y

모든 패키지가 업데이트되면 각 노드에서 /etc/hosts 파일을 설정해야 합니다. 따라서 호스트 이름으로 서로 통신할 수 있습니다.

다음 명령을 사용하여 각 노드에서 /etc/hosts 파일을 편집합니다.

nano /etc/hosts

다음 줄을 추가합니다.

192.168.0.10 node1
192.168.0.11 node2
192.168.0.12 node3

완료되면 파일을 저장하고 닫습니다. 다음으로 다음 단계로 진행할 수 있습니다.

RabbitMQ 서버 설치

다음으로 각 노드에 RabbitMQ 서버 패키지를 설치해야 합니다. 다음 명령을 실행하여 설치할 수 있습니다.

apt-get install rabbitmq-server -y

설치가 완료되면 RabbitMQ 서비스를 시작하고 다음 명령을 사용하여 시스템 재부팅 시 시작되도록 활성화합니다.

systemctl start rabbitmq-server
systemctl enable rabbitmq-server

다음 명령을 사용하여 RabbitMQ 서비스의 상태를 확인할 수도 있습니다.

systemctl status rabbitmq-server

다음 출력이 표시되어야 합니다.

? rabbitmq-server.service - RabbitMQ Messaging Server
     Loaded: loaded (/lib/systemd/system/rabbitmq-server.service; enabled; vendor preset: enabled)
     Active: active (running) since Tue 2020-07-21 06:25:07 UTC; 19min ago
   Main PID: 2565 (beam.smp)
     Status: "Initialized"
      Tasks: 87 (limit: 2353)
     Memory: 83.5M
     CGroup: /system.slice/rabbitmq-server.service
             ??2551 /bin/sh /usr/sbin/rabbitmq-server
             ??2565 /usr/lib/erlang/erts-10.6.4/bin/beam.smp -W w -A 64 -MBas ageffcbf -MHas ageffcbf -MBlmbcs 512 -MHlmbcs 512 -MMmcs 30 -P 1>
             ??2828 erl_child_setup 65536
             ??2921 inet_gethost 4
             ??2922 inet_gethost 4

Jul 21 06:24:58 node1 systemd[1]: Starting RabbitMQ Messaging Server...
Jul 21 06:25:07 node1 systemd[1]: rabbitmq-server.service: Supervising process 2565 which is not our child. We'll most likely not notice when >
Jul 21 06:25:07 node1 systemd[1]: Started RabbitMQ Messaging Server.

이 시점에서 RabbitMQ 서버가 각 노드에 설치되어 실행 중입니다. 이제 다음 단계를 진행할 수 있습니다.

RabbitMQ 관리 플러그인 활성화

RabbitMQ 관리 플러그인은 웹 브라우저를 통해 RabbitMQ 노드 및 클러스터를 모니터링하고 관리하는 데 사용할 수 있는 HTTP 기반 API를 제공합니다. 기본적으로 TCP 포트 15672에서 실행됩니다.

각 노드에서 다음 명령을 실행하여 RabbitMQ 관리 플러그인을 활성화할 수 있습니다.

rabbitmq-plugins enable rabbitmq_management

다음 출력이 표시되어야 합니다.

Enabling plugins on node :
rabbitmq_management
The following plugins have been configured:
  rabbitmq_management
  rabbitmq_management_agent
  rabbitmq_web_dispatch
Applying plugin configuration to 
The following plugins have been enabled:
  rabbitmq_management
  rabbitmq_management_agent
  rabbitmq_web_dispatch

started 3 plugins.

다음으로 RabbitMQ 서비스를 다시 시작하여 변경 사항을 적용합니다.

systemctl restart rabbitmq-server

다음 명령을 사용하여 수신 포트를 확인할 수 있습니다.

netstat -tunelp | grep 15672

다음 출력이 표시되어야 합니다.

tcp        0      0 0.0.0.0:15672           0.0.0.0:*               LISTEN      109        23155      2565/beam.smp

RabbitMQ 클러스터 설정

기본적으로 /var/lib/rabbitmq/.erlang.cookie 파일은 각 노드에서 동일합니다. RabbitMQ 클러스터를 설정하려면 node1에서 다른 노드로 /var/lib/rabbitmq/.erlang.cookie 파일을 복사해야 합니다.

node1에서 다음 명령을 실행하여 /var/lib/rabbitmq/.erlang.cookie 파일을 다른 노드에 복사합니다.

scp /var/lib/rabbitmq/.erlang.cookie :/var/lib/rabbitmq/

다음으로 클러스터 node1에 가입하려면 node1과 node2를 설정해야 합니다.

먼저 RabbitMQ 서비스를 다시 시작하고 node2와 node3 모두에서 다음 명령을 사용하여 앱을 중지합니다.

systemctl restart rabbitmq-server
rabbitmqctl stop_app

node2에서 다음 명령을 실행하여 node1의 클러스터에 가입합니다.

rabbitmqctl join_cluster 

다음 출력이 표시되어야 합니다.

Clustering node 

node2에서 다음 명령을 사용하여 앱을 시작합니다.

rabbitmqctl start_app

다음 출력이 표시되어야 합니다.

Starting node  ...
 completed with 3 plugins.

node3에서 다음 명령을 실행하여 node1의 클러스터에 가입합니다.

rabbitmqctl join_cluster 

다음 출력이 표시되어야 합니다.

Clustering node 

node3에서 다음 명령으로 앱을 시작합니다.

rabbitmqctl start_app

다음 출력이 표시되어야 합니다.

Starting node  ...
 completed with 3 plugins.

성공적으로 완료되면 node1에서 다음 명령을 실행하여 클러스터의 상태를 확인하십시오.

rabbitmqctl cluster_status

다음 출력이 표시되어야 합니다.

Cluster status of node  ...
Basics

Cluster name: 

Disk Nodes





Running Nodes





Versions

: RabbitMQ 3.8.2 on Erlang 22.2.7
: RabbitMQ 3.8.2 on Erlang 22.2.7
: RabbitMQ 3.8.2 on Erlang 22.2.7

Alarms

(none)

Network Partitions

(none)

Listeners

Node: , interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication
Node: , interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0
Node: , interface: [::], port: 15672, protocol: http, purpose: HTTP API
Node: , interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication
Node: , interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0
Node: , interface: [::], port: 15672, protocol: http, purpose: HTTP API
Node: , interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication
Node: , interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0
Node: , interface: [::], port: 15672, protocol: http, purpose: HTTP API

Feature flags

Flag: drop_unroutable_metric, state: disabled
Flag: empty_basic_get_metric, state: disabled
Flag: implicit_default_bindings, state: enabled
Flag: quorum_queue, state: enabled
Flag: virtual_host_metadata, state: enabled

관리자 사용자 설정

다음으로 RabbitMQ 서버에 대한 새 관리 사용자를 생성하고 기본 게스트 사용자를 삭제해야 합니다.

node1에서 다음 명령을 실행하여 "hitesh"라는 새 사용자와 암호 "password"를 만들 수 있습니다.

rabbitmqctl add_user hitesh password

다음 출력이 표시되어야 합니다.

Adding user "hitesh" ...

다음으로 다음 명령을 사용하여 hitesh 사용자를 관리자로 구성합니다.

rabbitmqctl set_user_tags hitesh administrator

다음 출력이 표시되어야 합니다.

Setting tags for user "hitesh" to [administrator] ...

다음으로 hitesh 사용자에게 모든 가상 호스트를 수정, 쓰기 및 읽을 수 있는 권한을 부여합니다.

rabbitmqctl set_permissions -p / hitesh ".*" ".*" ".*"

다음 출력이 표시되어야 합니다.

Setting permissions for user "hitesh" in vhost "/" ...

그런 다음 다음 명령을 사용하여 게스트 사용자를 삭제합니다.

rabbitmqctl delete_user guest

다음 명령을 받아야 합니다.

Deleting user "guest" ...

이제 다음 명령을 사용하여 모든 사용자를 나열할 수 있습니다.

rabbitmqctl list_users

다음 출력이 표시되어야 합니다.

Listing users ...
user	tags
hitesh	[administrator]

node1에서 만든 사용자는 클러스터의 모든 노드에 자동으로 복제됩니다.

RabbitMQ 설정 큐 미러링

기본적으로 대기열의 내용은 단일 노드에 있습니다. 따라서 큐 미러링 및 모든 클러스터 노드에 대한 복제를 위해 ha 정책 클러스터를 설정해야 합니다.

이렇게 하려면 RabbitMQ 클러스터의 모든 대기열이 클러스터의 모든 노드에 미러링되는 ha-all이라는 ha 정책을 만듭니다.

rabbitmqctl set_policy ha-all ".*" '{"ha-mode":"all"}'

산출:

Setting policy "ha-all" for pattern ".*" to "{"ha-mode":"all"}" with priority "0" for vhost "/" ...

다음으로 모든 대기열 이름이 2로 시작하는 ha-two라는 ha 정책을 만듭니다. 클러스터의 두 노드에 미러링됩니다.

rabbitmqctl set_policy ha-two "^two\." '{"ha-mode":"exactly","ha-params":2,"ha-sync-mode":"automatic"}'

산출:

Setting policy "ha-two" for pattern "^two\." to "{"ha-mode":"exactly","ha-params":2,"ha-sync-mode":"automatic"}" with priority "0" for vhost "/" ...

다음으로 이름이 node로 시작하는 모든 대기열을 포함하는 ha-nodes라는 고가용성 정책을 만듭니다. 클러스터의 두 특정 노드 node2 및 node3에 미러링합니다.

rabbitmqctl set_policy ha-nodes "^nodes\." '{"ha-mode":"nodes","ha-params":[""]}'

산출:

Setting policy "ha-nodes" for pattern "^nodes\." to "{"ha-mode":"nodes","ha-params":[""]}" with priority "0" for vhost "/" ...

이제 다음 명령을 실행하여 구성된 모든 정책을 나열할 수 있습니다.

rabbitmqctl list_policies;

다음 출력이 표시되어야 합니다.

Listing policies for vhost "/" ...
vhost	name	pattern	apply-to	definition	priority
/	ha-all	.*	all	{"ha-mode":"all"}	0
/	ha-two	^two\.	all	{"ha-mode":"exactly","ha-params":2,"ha-sync-mode":"automatic"}	0
/	ha-nodes	^nodes\.	all	{"ha-mode":"nodes","ha-params":[""]}	0

완료되면 다음 단계로 진행할 수 있습니다.

RabbitMQ 클러스터에 액세스

이제 http://192.168.0.10:15672/와 같이 포트 15672로 웹 브라우저에서 노드의 IP 주소를 입력하여 RabbitMQ 웹 인터페이스에 액세스할 수 있습니다. RabbitMQ 로그인 페이지가 표시됩니다.

관리자 사용자 이름, 암호를 제공하고 로그인 버튼을 클릭합니다. 다음 화면에 RabbitMQ 대시보드가 표시되어야 합니다.

그런 다음 관리 탭 메뉴를 클릭하고 정책 메뉴를 클릭합니다. 다음 화면에서 생성한 모든 RabbitMQ ha 정책을 볼 수 있습니다.

결론

축하합니다! Ubuntu20.04 서버에 3노드 RabbitMQ 클러스터를 성공적으로 설정했습니다. 클러스터는 이제 모든 노드에서 토폴로지 및 보안 정보를 포함한 구성 정보를 공유합니다.