우분투 22.04에서 RabbitMQ를 클러스터로 구성하고 테스트하는 방법
RabbitMQ 클러스터는 여러 RabbitMQ 노드를 하나의 논리적 브로커로 묶어 고가용성과 확장성을 제공합니다.
주로 Mirrored Queue를 사용해 메시지를 복제하고 노드가 장애가 발생하면 다른 노드가 메시지를 유지합니다.
1. 사전 준비
호스트 이름 설정 : 각 서버의 호스트 이름을 설정하고 /etc/hosts 파일에 다른 서버의 IP와 호스트 이름을 추가합니다.
방화벽 설정 : RabbitMQ가 사용하는 포트(기본적으로 5672, 15672, 25672 등)를 열어줍니다.
- 3개 이상의 서버 (Ubuntu 22.04)
- node1 (192.168.10.101)
- node2 (192.168.10.102)
- node3 (192.168.10.103)
모든 서버에 Erlang과 RabbitMQ 설치
vim install_rabbitmq.sh
#!/bin/bash
sudo apt-get install curl gnupg apt-transport-https -y
## Team RabbitMQ's main signing key
curl -1sLf "https://keys.openpgp.org/vks/v1/by-fingerprint/0A9AF2115F4687BD29803A206B73A36E6026DFCA" | sudo gpg --dearmor | sudo tee /usr/share/keyrings/com.rabbitmq.team.gpg > /dev/null
## Community mirror of Cloudsmith: modern Erlang repository
curl -1sLf https://github.com/rabbitmq/signing-keys/releases/download/3.0/cloudsmith.rabbitmq-erlang.E495BB49CC4BBE5B.key | sudo gpg --dearmor | sudo tee /usr/share/keyrings/rabbitmq.E495BB49CC4BBE5B.gpg > /dev/null
## Community mirror of Cloudsmith: RabbitMQ repository
curl -1sLf https://github.com/rabbitmq/signing-keys/releases/download/3.0/cloudsmith.rabbitmq-server.9F4587F226208342.key | sudo gpg --dearmor | sudo tee /usr/share/keyrings/rabbitmq.9F4587F226208342.gpg > /dev/null
## Add apt repositories maintained by Team RabbitMQ
sudo tee /etc/apt/sources.list.d/rabbitmq.list <<EOF
## Provides modern Erlang/OTP releases
##
deb [arch=amd64 signed-by=/usr/share/keyrings/rabbitmq.E495BB49CC4BBE5B.gpg] https://ppa1.rabbitmq.com/rabbitmq/rabbitmq-erlang/deb/ubuntu $(lsb_release -cs) main
deb-src [signed-by=/usr/share/keyrings/rabbitmq.E495BB49CC4BBE5B.gpg] https://ppa1.rabbitmq.com/rabbitmq/rabbitmq-erlang/deb/ubuntu $(lsb_release -cs) main
# another mirror for redundancy
deb [arch=amd64 signed-by=/usr/share/keyrings/rabbitmq.E495BB49CC4BBE5B.gpg] https://ppa2.rabbitmq.com/rabbitmq/rabbitmq-erlang/deb/ubuntu $(lsb_release -cs) main
deb-src [signed-by=/usr/share/keyrings/rabbitmq.E495BB49CC4BBE5B.gpg] https://ppa2.rabbitmq.com/rabbitmq/rabbitmq-erlang/deb/ubuntu $(lsb_release -cs) main
## Provides RabbitMQ
##
deb [arch=amd64 signed-by=/usr/share/keyrings/rabbitmq.9F4587F226208342.gpg] https://ppa1.rabbitmq.com/rabbitmq/rabbitmq-server/deb/ubuntu $(lsb_release -cs) main
deb-src [signed-by=/usr/share/keyrings/rabbitmq.9F4587F226208342.gpg] https://ppa1.rabbitmq.com/rabbitmq/rabbitmq-server/deb/ubuntu $(lsb_release -cs) main
# another mirror for redundancy
deb [arch=amd64 signed-by=/usr/share/keyrings/rabbitmq.9F4587F226208342.gpg] https://ppa2.rabbitmq.com/rabbitmq/rabbitmq-server/deb/ubuntu $(lsb_release -cs) main
deb-src [signed-by=/usr/share/keyrings/rabbitmq.9F4587F226208342.gpg] https://ppa2.rabbitmq.com/rabbitmq/rabbitmq-server/deb/ubuntu $(lsb_release -cs) main
EOF
## Update package indices
sudo apt-get update -y
## Install Erlang packages
sudo apt-get install -y erlang-base \
erlang-asn1 erlang-crypto erlang-eldap erlang-ftp erlang-inets \
erlang-mnesia erlang-os-mon erlang-parsetools erlang-public-key \
erlang-runtime-tools erlang-snmp erlang-ssl \
erlang-syntax-tools erlang-tftp erlang-tools erlang-xmerl
## Install rabbitmq-server and its dependencies
sudo apt-get install rabbitmq-server -y --fix-missing
chmod +x install_rabbitmq.sh
bash install_rabbitmq.sh
rabbitmqctl --version
4.0.5
RabbitMQ 서비스를 시작하고 활성화합니다.
sudo systemctl enable --now rabbitmq-server
2. Erlang 쿠키 동기화
모든 노드에서 클러스터 통신을 위해 이름을 설정하고 erlang.cookie 파일을 복제합니다.
첫 번째 노드에서 .erlang.cookie 파일을 다른 노드와 동일하게 설정합니다. 이 파일은 RabbitMQ 노드 간의 인증에 사용됩니다.
sudo cat /var/lib/rabbitmq/.erlang.cookie
이 값을 다른 노드의 .erlang.cookie 파일에 복사합니다.
scp /var/lib/rabbitmq/.erlang.cookie vagrant@node2:~
scp /var/lib/rabbitmq/.erlang.cookie vagrant@node3:~
sudo mv /home/vagrant/.erlang.cookie /var/lib/rabbitmq/.erlang.cookie
sudo chown rabbitmq:rabbitmq /var/lib/rabbitmq/.erlang.cookie
sudo chmod 400 /var/lib/rabbitmq/.erlang.cookie
3. RabbitMQ 클러스터 구성
node1에서 node2와 node3을 클러스터에 추가합니다.
node2, node3에서 rabbitmq-server를 중지하고 첫 번째 노드에 조인합니다.
sudo rabbitmqctl reset
sudo rabbitmqctl stop_app
sudo rabbitmqctl join_cluster rabbit@node1
sudo rabbitmqctl start_app
---
node2
$ sudo rabbitmqctl stop_app
Stopping rabbit application on node rabbit@node2 ...
$ sudo rabbitmqctl join_cluster rabbit@node1
Clustering node rabbit@node2 with rabbit@node1
$ sudo rabbitmqctl start_app
Starting node rabbit@node2 ...
node3
$ sudo rabbitmqctl stop_app
Stopping rabbit application on node rabbit@node3 ...
$ sudo rabbitmqctl join_cluster rabbit@node1
Clustering node rabbit@node3 with rabbit@node1
$ sudo rabbitmqctl start_app
Starting node rabbit@node3 ...
---
노드 상태 확인
sudo rabbitmqctl cluster_status
---
Cluster status of node rabbit@node1 ...
Basics
Cluster name: rabbit@node1.cluster.local
Total CPU cores available cluster-wide: 12
Cluster Tags
(none)
Disk Nodes
rabbit@node1
rabbit@node2
rabbit@node3
Running Nodes
rabbit@node1
rabbit@node2
rabbit@node3
Versions
rabbit@node1: RabbitMQ 4.0.5 on Erlang 27.2.1
rabbit@node2: RabbitMQ 4.0.5 on Erlang 27.2.1
rabbit@node3: RabbitMQ 4.0.5 on Erlang 27.2.1
CPU Cores
Node: rabbit@node1, available CPU cores: 4
Node: rabbit@node2, available CPU cores: 4
Node: rabbit@node3, available CPU cores: 4
Maintenance status
Node: rabbit@node1, status: not under maintenance
Node: rabbit@node2, status: not under maintenance
Node: rabbit@node3, status: not under maintenance
...
---
4. 고가용성 큐 설정(Mirrored Queue 활성화)
클러스터에서 고가용성 큐를 설정하려면 정책을 추가합니다.
sudo rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
5. RabbitMQ 관리 플러그인 활성화
RabbitMQ 관리 플러그인을 활성화하여 웹 인터페이스를 통해 클러스터를 관리할 수 있습니다.
sudo rabbitmq-plugins enable rabbitmq_management
웹 인터페이스는 http://<서버 IP>:15672에서 접근할 수 있습니다. 기본 사용자 이름과 비밀번호는 guest / guest입니다.
6. 클러스터 테스트
큐 생성 및 메시지 전송
한 노드에서 큐를 생성하고 메시지를 전송합니다.
sudo rabbitmqadmin declare queue name=test_queue
sudo rabbitmqadmin publish exchange=amq.default routing_key=test_queue payload="Hello, RabbitMQ Cluster!"
다른 노드에서 메시지 확인
다른 노드에서 큐의 메시지를 확인합니다.
sudo rabbitmqadmin get queue=test_queue
7. 클러스터 노드 추가/제거
노드 추가
새로운 노드를 클러스터에 추가하려면 위의 3 단계를 반복합니다.
노드 제거
노드를 클러스터에서 제거하려면 해당 노드에서 다음 명령을 실행합니다.
sudo rabbitmqctl stop_app
sudo rabbitmqctl reset
sudo rabbitmqctl start_app
8. RabbitMQ 모니터링
RabbitMQ는 다양한 모니터링 옵션을 제공합니다.
1) Web Management UI
웹 UI로 실시간 상태를 모니터링할 수 있습니다.
주소: http://<서버IP>:15672
주요 모니터링 항목:
- Queues : 메시지 수, 소비 상태
- Exchanges : 메시지 라우팅 상태
- Connections : 연결된 클라이언트 정보
- Node 상태 : 메모리, 디스크 사용량
2) Command Line Monitoring
큐 상태 확인
sudo rabbitmqctl list_queues name messages_ready messages_unacknowledged
연결 정보 확인
sudo rabbitmqctl list_connections
노드 상태 확인
sudo rabbitmqctl status
9. RabbitMQ 플러그인 확장
RabbitMQ는 플러그인을 통해 기능을 확장할 수 있습니다.
플러그인 관리 명령어
- 플러그인 목록 확인
sudo rabbitmq-plugins list
- 플러그인 활성화
sudo rabbitmq-plugins enable <플러그인 이름>
- 플러그인 비활성화
sudo rabbitmq-plugins disable <플러그인 이름>
유용한 플러그인 목록
- rabbitmq_management : 웹 관리 UI
- rabbitmq_prometheus : Prometheus 메트릭 제공
- rabbitmq_shovel : 메시지 복제 및 이동
- rabbitmq_federation : 여러 RabbitMQ 클러스터 간 메시지 공유
- rabbitmq_delayed_message_exchange : 메시지 지연 큐
'리눅스' 카테고리의 다른 글
[draft] Google IP 주소 (0) | 2025.02.11 |
---|---|
[draft] 우분투에서 RabbitMQ를 설치하고 테스트하는 방법 (0) | 2025.02.09 |
[draft] Ansible Pull 모드를 사용하여 NGINX를 설치하는 방법 (0) | 2025.02.04 |
[draft] 우분투에 Ansible을 설치하는 방법 (0) | 2025.02.04 |
[draft] 우분투에서 최신 버전의 Ansible을 설치하는 방법 (0) | 2025.02.04 |