피드로 돌아가기
RabbitMQ Classic Queue 메모리 장애와 Quorum Queue 전환기
올리브영 테크블로그올리브영 테크블로그
Backend

RabbitMQ Classic Queue 메모리 장애와 Quorum Queue 전환기

올리브영 쿠폰팀이 RabbitMQ Classic Mirrored Queue의 메모리 부족 시 동기화 실패 문제를 Quorum Queue로 전환해 장애 빈도 월 2-3회에서 0회로, 복구 시간 2시간에서 90초로 개선

2025년 10월 28일12intermediate

Context

2025년 1월 1,500만 건 대량 쿠폰 발급 중 RabbitMQ 클러스터의 메모리 부족으로 인해 Master-Mirror 노드 간 동기화 실패가 발생했고, 메시지 처리가 완전히 멈춘 상태가 되었다. Classic Mirrored Queue 구조에서는 메모리 임계점에 도달 시 Mirror 노드의 복제 응답이 지연되면서 Queue가 out of sync 상태로 전환되고, 이 상태에서는 RabbitMQ가 데이터 안전성을 위해 메시지 소비 처리를 완전히 중단하는 문제가 있었다.

Technical Solution

  • 긴급 복구: 장애 브로커와 동일한 설정의 신규 RabbitMQ 브로커를 독립 운영 방식으로 생성하고 애플리케이션의 MQ 접속 정보를 변경하여 약 30분 내 메시지 처리 정상화
  • 근본 원인 분석: AWS MQ 운영 환경과 동일한 구성의 개발 환경에서 부하 테스트와 브로커 재시작 시나리오를 통해 메모리 부족 상태에서의 브로커 재시작이 동기화 타임아웃을 유발함을 재현 확인
  • 버전 업그레이드: RabbitMQ를 3.11.28에서 3.12.14로 업그레이드하여 메모리 알람 처리 로직과 미러링 동기화 안정성을 개선하고 동일한 테스트 시나리오에서 unsynchronized 상태 미발생 확인
  • Quorum Queue 전환: Raft Consensus 알고리즘 기반의 Quorum Queue를 도입하여 Leader + Follower 구성으로 과반수 합의를 통한 안정적인 메시지 처리와 비정상 replica 자동 제거 및 재동기화 기능 확보
  • 모니터링 강화: 메모리, CPU, 네트워크 사용률에 대한 실시간 성능 모니터링 체계와 예방적 알람 로직 구축

Impact

  • 장애 발생 빈도: 월 2-3회 → 0회로 100% 개선
  • 평균 복구 시간: 2시간 → 90초로 98.7% 단축
  • 고객 문의(VoC): 월 2,800건 → 560건으로 80% 감소
  • False Positive 알람: 90% 감소
  • 긴급 대응 인력: 50% 절감
  • 정기 점검 시간: 70% 단축
  • 1,500만 건 무장애 쿠폰 처리 달성

Key Takeaway

Classic Mirrored Queue 환경에서는 메모리 사용량이 임계점에 도달하면 미러 노드 간 동기화 실패 확률이 급격히 증가하므로, 사전 설계 단계에서 Queue Type 선택 시 트래픽 패턴과 안정성 요구사항을 고려하고 평상시 사용량의 2-3배 메모리를 할당해야 한다. 대용량 트래픽 환경에서는 Raft 합의 알고리즘 기반의 Quorum Queue를 선택하면 강력한 내결함성과 자동 복구 능력을 확보할 수 있다.


RabbitMQ Classic Mirrored Queue를 운영하는 팀에서는 메모리 기반 임계값 알람을 설정하되, 메모리 사용량이 전체의 60% 이상에 도달하면 즉시 트래픽을 제한하거나 새로운 브로커로 요청을 우회하는 자동 대응 로직을 구현해야 한다. 특히 고부하 상황에서는 메모리 여유 상태가 아닌 경우 브로커 재시작을 피해야 하며, 장기적으로는 Raft 합의 알고리즘 기반의 Quorum Queue로 전환하여 동기화 실패로 인한 메시지 처리 중단 위험을 완전히 제거할 수 있다.

원문 읽기