Ubuntu 20.04에서 RabbitMQ 클러스터를 설정하는 방법
이 튜토리얼은 다음 OS 버전에 대해 존재합니다.
- Ubuntu 22.04(Jammy Jellyfish)
- Ubuntu 20.04(Focal Fossa)
이 페이지에서
- 전제 조건
- 시작하기\n
- RabbitMQ 서버 설치
- RabbitMQ 관리 플러그인 활성화\n
- RabbitMQ 클러스터 설정
- 관리자 사용자 설정
- RabbitMQ 설정 대기열 미러링
- RabbitMQ 클러스터 액세스
- 결론
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 클러스터를 성공적으로 설정했습니다. 클러스터는 이제 모든 노드에서 토폴로지 및 보안 정보를 포함한 구성 정보를 공유합니다.