최적의 성능을 위해 RabbitMQ 인스턴스를 모니터링하는 방법
관리 UI, Prometheus, Grafana 및 rabbitmqctl을 사용하여 RabbitMQ를 모니터링하고 큐, 소비자, 메모리 및 디스크 문제를 파악하세요.
RabbitMQ 인스턴스를 최적의 성능으로 모니터링하는 방법
RabbitMQ는 프로듀서와 컨슈머 사이에 위치하므로, 작은 브로커 문제가 빠르게 애플리케이션 문제로 이어질 수 있습니다. 큐 깊이가 증가하고, 승인이 지연되거나, 노드가 메모리 또는 디스크 알람에 도달하면 브로커가 완전히 실패하기 훨씬 전에 사용자가 지연된 작업을 경험할 수 있습니다.
효과적인 RabbitMQ 모니터링은 메시지 흐름, 컨슈머 상태, 노드 리소스 및 클러스터 상태를 추적합니다. 이 가이드는 내장 관리 플러그인, Prometheus 및 Grafana, 그리고 장애 상황에서 사용할 수 있는 rabbitmqctl 명령어를 다룹니다.
추적해야 할 필수 RabbitMQ 메트릭
RabbitMQ 모니터링은 큐 상태, 연결/채널 활동, 시스템 리소스라는 세 가지 주요 메트릭 범주를 추적하는 것을 포함합니다.
큐 상태 메트릭
큐 메트릭은 메시지 처리 효율성과 잠재적 백로그의 가장 중요한 지표입니다.
- 메시지 속도 (게시/전달/승인): 메시지가 들어오고, 나가고, 컨슈머에 의해 확인되는 것을 추적합니다. 낮은 전달 속도와 높은 게시 속도는 종종 느린 컨슈머 또는 병목 현상을 나타냅니다.
- 큐 길이 (
messages_ready): 전달을 기다리는 총 메시지 수입니다. 급격히 증가하는 길이는 컨슈머가 프로듀서 부하를 따라잡지 못하고 있음을 나타냅니다. - 승인되지 않은 메시지 (
messages_unacknowledged): 전달되었지만 아직 승인을 기다리는 메시지입니다. 여기서 높은 수치는 컨슈머 오류, 긴 처리 시간 또는 교착 상태의 컨슈머를 의미할 수 있습니다. - 컨슈머 수: 큐에 연결된 활성 컨슈머의 수입니다. 부하가 높지만 컨슈머가 없는 큐는 확실한 장애 지점입니다.
- 내구성 있는 큐 및 영구 메시지 사용: 브로커 재시작 후에도 유지되어야 하는 큐와 메시지가 내구성 있게 구성되었는지 확인합니다. 내구성은 설계 설정이며, 디스크 쓰기 동작은 게시자 확인 및 저장소 상태에도 영향을 받습니다.
연결 및 채널 활동
이러한 메트릭은 누수 또는 부적절한 리소스 정리를 식별하는 데 도움이 됩니다.
- 연결 수: 총 열린 TCP 연결 수입니다. 너무 많은 연결은 기본 OS 또는 Erlang VM에 과부하를 줄 수 있습니다.
- 채널 수: 연결 내의 활성 채널 수입니다. 채널은 연결보다 저렴하지만 과도한 수는 여전히 리소스 부담을 나타냅니다.
- 클라이언트 연결 상태: 일시적인 상태에 갇혀 있거나 높은 연결 변동률을 보이는 연결을 찾습니다.
시스템 및 Erlang VM 리소스
RabbitMQ는 Erlang VM에서 실행되므로 내부 리소스 사용량이 표준 OS 프로세스와 다릅니다.
- 메모리 사용량: Erlang VM이 소비하는 총 메모리입니다. RabbitMQ는 워터마크 시스템을 사용합니다. 메모리가 높은 워터마크에 도달하면 프로듀서를 제한합니다.
- Erlang 프로세스: VM 내에서 실행되는 경량 프로세스의 총 수입니다. 통제 불능의 프로세스 수는 플러그인 내의 리소스 누수 또는 무한 루프를 나타낼 수 있습니다.
- 파일 디스크립터: 연결, 큐 및 영구 저장소에 중요한 파일 핸들의 가용성을 모니터링합니다.
- 디스크 여유 공간 제한: RabbitMQ는 디스크 여유 공간이 설정된 임계값 아래로 떨어지면 디스크 알람을 발생시키고 게시자를 차단합니다. 기본값은 일반적으로 소규모 테스트 시스템에서 낮았으므로 프로덕션 노드는 명시적인 값을 설정하고 모니터링해야 합니다.
RabbitMQ 관리 플러그인으로 모니터링
RabbitMQ 관리 플러그인은 시각화 및 실시간 운영 점검을 위한 기본 내장 도구입니다. 웹 UI와 강력한 HTTP API를 모두 제공합니다.
플러그인 활성화
플러그인은 일반적으로 RabbitMQ와 함께 설치되지만 명시적으로 활성화해야 합니다.
sudo rabbitmq-plugins enable rabbitmq_management
활성화되면 웹 인터페이스는 일반적으로 포트 15672에서 액세스할 수 있습니다 (예: http://localhost:15672).
웹 UI의 주요 보기
- 개요 페이지: 메시지 흐름 속도 (전역 게시/전달), 메모리 사용량 및 연결 수를 포함한 높은 수준의 통계를 제공합니다. 이것은 초기 상태 대시보드입니다.
- 큐 탭: 모든 큐에 대한 자세한 메트릭(순간 및 집계 메시지 속도, 컨슈머 활용률, 큐 길이 포함)을 제공합니다. 정렬 기능을 사용하여 가장 길거나 가장 바쁜 큐를 빠르게 찾을 수 있습니다.
- 연결 및 채널 탭: 개별 클라이언트 연결을 검사하여 상태, 프로토콜 세부 정보 및 대역폭 사용량을 보여줍니다.
HTTP API 사용
자동화된 검사 및 사용자 정의 대시보드 통합을 위해 관리 플러그인은 광범위한 HTTP API를 제공합니다. 이는 상태 확인 스크립트를 작성하거나 독점 모니터링 시스템과 통합하는 데 이상적입니다.
예: 클러스터 상태 확인
# 기본 개요 통계 확인
curl -u user:password http://localhost:15672/api/overview
# 특정 큐(예: 'task_queue')의 메트릭 가져오기
curl -u user:password http://localhost:15672/api/queues/%2F/task_queue
팁: HTTP API는 상세한 JSON 데이터를 반환하므로 큐 길이나 승인되지 않은 메시지 수와 같은 특정 숫자 임계값을 필터링하고 알림을 설정할 수 있습니다.
Prometheus 및 Grafana를 사용한 고급 모니터링
프로덕션 환경의 경우 RabbitMQ 메트릭을 Prometheus(수집용) 및 Grafana(시각화용)와 같은 표준 시계열 모니터링 시스템과 통합하는 것이 가장 좋은 방법입니다. RabbitMQ는 이를 위한 전용 플러그인을 제공합니다.
1. Prometheus 플러그인 활성화
이 플러그인은 Prometheus가 예상하는 형식으로 메트릭을 노출하며, 일반적으로 포트 15692(또는 관리 포트를 사용하는 경우 15672/metrics)에서 제공됩니다.
sudo rabbitmq-plugins enable rabbitmq_prometheus
2. Prometheus 스크래핑 구성
활성화되면 Prometheus가 엔드포인트를 스크래핑하도록 구성해야 합니다. prometheus.yml 구성에 다음 작업을 추가합니다.
scrape_configs:
- job_name: 'rabbitmq'
metrics_path: /metrics
# rabbitmq_prometheus 플러그인은 기본적으로 포트 15692에서 /metrics를 노출합니다.
static_configs:
- targets: ['rabbitmq-host:15692']
3. Grafana에서 시각화
Grafana는 Prometheus가 수집한 데이터를 사용하여 강력한 대시보드를 만듭니다. 주요 패널에는 다음이 포함되어야 합니다.
- 큐 백로그: 시간 경과에 따른
rabbitmq_queue_messages_ready및rabbitmq_queue_messages_unacked를 그래프로 표시합니다. - 메시지 속도: 게시, 전달 및 승인 속도를 추적하여 컨슈머가 따라잡고 있는지 확인할 수 있습니다.
- 노드 리소스 사용량: 메모리, 파일 디스크립터, Erlang 프로세스 사용량 및 디스크 알람을 추적합니다.
큐 길이에 대한 Prometheus 메트릭 예시:
플러그인이 노출하는 큐 길이의 표준 메트릭은 다음과 같습니다.
rabbitmq_queue_messages_ready{queue="my_critical_queue", vhost="/"}
모니터링 모범 사례: 알림
명확한 임계값을 기반으로 Prometheus Alertmanager 또는 Grafana에서 알림을 설정합니다.
| 신호 | 예시 알림 | 권장 조치 |
|---|---|---|
| 준비된 메시지 | 큐 백로그가 5분 동안 계속 증가함 | 컨슈머 오류 확인, 앱이 안전하게 처리할 수 있으면 컨슈머 추가, 또는 프로듀서 속도 늦춤 |
| 승인되지 않은 메시지 | 승인 속도가 낮은 동안 승인되지 않은 수가 높게 유지됨 | 컨슈머 지연 시간, 충돌, 프리페치 설정 및 다운스트림 종속성 검사 |
| 디스크 알람 | 노드가 디스크 여유 공간 알람 보고 | 공간 확보, 스토리지 확장 또는 프로듀서가 차단되기 전에 데이터 이동 |
| 메모리 알람 | 노드가 메모리 알람 보고 | 큰 큐, 높은 연결/채널 수 또는 메모리 집약적 플러그인을 찾고 용량 조정 |
rabbitmqctl을 사용한 CLI 진단
rabbitmqctl 명령줄 유틸리티는 특히 웹 UI나 외부 모니터링 시스템을 사용할 수 없을 때 빠르고 직접적인 검사 및 운영 점검에 필수적입니다.
노드 상태 확인
이 명령은 실행 중인 애플리케이션, 메모리 사용량, 파일 디스크립터 수 및 연결 세부 정보를 보여주는 빠른 상태 확인을 제공합니다.
rabbitmqctl status
중요 큐 나열
list_queues를 사용하여 주요 성능 지표(KPI)에 초점을 맞춰 병목 현상을 신속하게 식별할 수 있습니다.
# 이름, 총 메시지, 준비된 메시지 및 컨슈머 수를 보여주는 큐 나열
rabbitmqctl list_queues name messages messages_ready consumers
# 사용량이 많은 노드의 경우 로컬에서 출력을 정렬합니다.
rabbitmqctl list_queues name messages messages_ready consumers | sort -k2 -nr | head
연결 및 채널 분석
특정 클라이언트 동작을 문제 해결하기 위해 사용자 또는 네트워크 주소로 필터링하여 연결 및 채널을 나열할 수 있습니다.
# 사용자 및 소스 IP를 보여주는 활성 연결 나열
rabbitmqctl list_connections user peer_host
# 활성 채널 및 메시지 흐름 상태 나열
rabbitmqctl list_channels connection_details consumer_count messages_unacknowledged
대규모 클러스터에서는 광범위한 나열 명령이 이미 부하가 걸린 노드에 부하를 추가할 수 있습니다. 장애 발생 시에는 대상 큐, vhost 또는 연결 검사를 선호하세요.
성능 유지를 위한 모범 사례
- 컨슈머 용량 모니터링: 관리 UI 및 내보낸 메트릭에서 컨슈머 용량을 관찰합니다. 낮은 값은 종종 큐가 컨슈머가 작업을 수락할 수 있는 것보다 빠르게 전달할 수 있음을 의미하며, 이는 느린 컨슈머, 낮은 프리페치 또는 다운스트림 지연 시간을 나타냅니다.
- 프로듀서 흐름 제어 처리: RabbitMQ는 Erlang의 메모리 및 디스크 알람을 사용하여 역압력을 가합니다. 이러한 알람을 면밀히 모니터링하십시오. 이는 노드가 용량 한계에 도달하고 프로듀서가 제한되고 있음을 나타냅니다.
- 로그 통합: RabbitMQ 로그를 중앙 집중식 로깅 시스템(ELK 스택, Splunk 등)에 통합합니다. 네트워크 오류, 실패한 인증 시도 또는 느린 메모리 동기화와 관련된 반복적인 경고를 찾습니다.
- 클러스터 상태 확인: 클러스터를 실행하는 경우 노드 멤버십, 네트워크 파티션, 쿼럼 큐 상태 및 동기화 상태를 모니터링합니다.
rabbitmqctl cluster_status는 노드가 클러스터 멤버십에 대해 동의하지 않을 때 유용한 첫 번째 확인 사항입니다.
핵심 요점
빠른 검사에는 관리 UI를, 추세 및 알림에는 Prometheus와 Grafana를, 문제가 이미 발생했을 때 집중적인 진단에는 rabbitmqctl을 사용하십시오. 증가하는 백로그, 멈춘 미확인 메시지, 디스크 알람, 메모리 알람 및 클러스터 상태에 대한 알림을 시작하십시오. 이러한 신호는 일반적으로 애플리케이션 시간 초과가 발생하기 전에 문제를 알려줍니다.