채널코퍼레이션 DevOps 엔지니어가 직접 구르고 깨지며 배운 Mimir 3.0 카프카 아키텍처 실무 생존기
모니터링 시스템의 유실 없는 메트릭 수집을 위해 Mimir 앞단에 Kafka를 이식한 생생한 트러블슈팅 사례입니다. 기존 분산 아키텍처의 리소스 비효율성을 극복하는 과정과 함께, 일반적인 카프카 컨슈머 그룹 방식과 완전히 다른 Mimir만의 독특한 파티션 매핑 메커니즘을 상세하게 파헤칩니다.
Prometheus와 Grafana Mimir/Loki를 대규모로 운영하면서 수집 파이프라인 백프레셔 및 일시적 유실로 고민하는 DevOps 엔지니어들에게 추천합니다. 특히 Mimir 3.0 카프카 기반 전환을 검토 중이라면 파티션 정합성 및 안전한 롤아웃을 위한 완벽한 실무 나침반이 되어줄 것입니다.
기존 Grafana Mimir 클래식 아키텍처는 distributor와 ingester 사이에 데이터를 임시로 저장할 내구성 있는 버퍼가 없어, ingester 부하가 심해지거나 장애가 발생하면 수집 파이프라인의 백프레셔 및 메트릭 유실로 이어지는 한계가 있었습니다.
Mimir 3.0의 권장 사양인 Kafka 기반의 ingest-storage 아키텍처를 도입하여 쓰기 경로와 읽기 경로를 분리하고, Kafka를 비동기 버퍼로 삼아 ingester가 자신의 속도에 맞춰 데이터를 소비하도록 구성했습니다.
동일한 수집 트래픽 대비 분산 쓰기 복제(RF) 책임이 Kafka 단으로 이관되면서 ingester의 CPU 및 메모리 리소스 사용량이 크게 절감되었으며, 순간적인 부하를 컨슈머 랙으로 안전하게 흡수할 수 있게 되었습니다.
Trade-off
Kafka/MSK 인프라 운영 및 네트워크 비용이 추가로 발생하며, 쓰기 완료 후 최근 데이터가 쿼리에서 즉시 조회되지 않는 읽기 일관성 격차와 스케일인 시 복잡한 파티션 수명 주기 드레인 과정을 수동 제어해야 하는 한계가 존재합니다.
Grafana Mimir 3.0에서 권장하는 구조로, 쓰기 경로와 읽기 경로를 분리하기 위해 Kafka를 비동기 버퍼로 배치하는 설계입니다. Distributor는 데이터를 Kafka 파티션에 기록하는 작업에만 집중하고, Ingester는 독립적으로 데이터를 처리하여 결합도를 낮춤니다.
Mimir가 Kafka 파티션의 소유권과 라이프사이클을 관리하기 위해 활용하는 내부 해시 링 모델입니다. 일반적인 Kafka의 동적 컨슈머 그룹 리밸런싱과 달리, Ingester Pod의 고유 인스턴스 ID와 Kafka 파티션을 1:1로 엄격하게 수동 매핑합니다.
비동기 버퍼 구조에서 쓰기가 완료된 데이터가 읽기 요청에서 즉시 보장되도록 돕는 일관성 모델입니다. 쿼리 요청이 들어왔을 때 Kafka의 최신 오프셋을 확인하여 Ingester가 해당 위치까지 읽어올 때까지 의도적으로 쿼리 실행을 대기시킵니다.