Grafana Loki

지원 버전: Loki 3.x 마지막 업데이트: 2026년 2월 20일

Grafana Loki는 Prometheus에서 영감을 받은 수평적으로 확장 가능한 로그 집계 시스템입니다. 로그 콘텐츠를 인덱싱하지 않고 레이블만 인덱싱하여 비용 효율적인 로그 저장 및 쿼리를 제공합니다.

목차


개요

Loki의 핵심 철학

Loki는 "Prometheus처럼 로그를 다룬다"는 철학으로 설계되었습니다:

  • 레이블 기반 인덱싱: 로그 콘텐츠가 아닌 메타데이터(레이블)만 인덱싱

  • 비용 효율성: Elasticsearch 대비 10배 이상 저렴한 운영 비용

  • 단순성: 전문 검색 엔진의 복잡성 제거

  • Grafana 통합: 로그, 메트릭, 추적 데이터의 통합 분석

주요 특징

특징
설명

수평 확장

각 컴포넌트를 독립적으로 확장 가능

멀티테넌시

테넌트별 데이터 격리 지원

객체 스토리지

S3, GCS, Azure Blob 등 저렴한 스토리지 활용

LogQL

PromQL 스타일의 직관적인 쿼리 언어

높은 가용성

복제 및 장애 복구 내장

Loki vs Elasticsearch

항목
Loki
Elasticsearch

인덱싱 방식

레이블만 인덱싱

전체 텍스트 인덱싱

스토리지 비용

낮음 (객체 스토리지)

높음 (SSD 권장)

쿼리 복잡성

단순 (LogQL)

복잡 (Lucene)

전문 검색

제한적

우수

운영 복잡성

낮음

높음

메모리 요구량

낮음

높음

Grafana 통합

네이티브

플러그인


아키텍처

컴포넌트 개요

spinner

컴포넌트 상세

1. Distributor

클라이언트로부터 로그 스트림을 수신하는 첫 번째 컴포넌트입니다.

역할:

  • 로그 스트림 유효성 검사

  • 레이블 정규화

  • 속도 제한 적용

  • 일관된 해싱을 통한 Ingester 라우팅

2. Ingester

로그 데이터를 메모리에 버퍼링하고 장기 스토리지에 기록합니다.

역할:

  • 로그 데이터 청크 생성

  • WAL (Write-Ahead Log) 관리

  • 스토리지로 청크 플러시

  • 실시간 쿼리 서빙

3. Querier

LogQL 쿼리를 실행하고 결과를 반환합니다.

역할:

  • Ingester에서 실시간 데이터 조회

  • 장기 스토리지에서 과거 데이터 조회

  • 결과 병합 및 중복 제거

4. Query Frontend

쿼리 최적화 및 캐싱을 담당합니다.

역할:

  • 대용량 쿼리 분할

  • 결과 캐싱

  • 쿼리 대기열 관리

  • 재시도 처리

5. Compactor

저장된 데이터를 최적화합니다.

역할:

  • 작은 청크들을 큰 청크로 병합

  • 인덱스 최적화

  • 보존 정책 적용 (데이터 삭제)


배포 모드

Loki는 세 가지 배포 모드를 제공합니다:

1. Monolithic 모드

모든 컴포넌트가 단일 프로세스에서 실행됩니다.

적합한 경우:

  • 개발/테스트 환경

  • 일일 로그량 < 100GB

  • 빠른 프로토타이핑

2. Simple Scalable 모드 (권장)

읽기/쓰기 경로를 분리하여 확장성을 제공합니다.

적합한 경우:

  • 프로덕션 환경

  • 일일 로그량 100GB ~ 10TB

  • 대부분의 EKS 클러스터

3. Microservices 모드

각 컴포넌트를 독립적으로 배포합니다.

적합한 경우:

  • 대규모 프로덕션 환경

  • 일일 로그량 > 10TB

  • 컴포넌트별 세밀한 리소스 관리 필요


Helm 설치

사전 준비

Simple Scalable 모드 설치 (EKS 권장)

설치 실행


S3 백엔드 구성

IRSA (IAM Roles for Service Accounts) 설정

S3 버킷 생성 (Terraform)

Loki 스토리지 설정


LogQL 쿼리

기본 문법

LogQL은 두 가지 유형의 쿼리를 지원합니다:

  1. 로그 쿼리: 로그 라인을 반환

  2. 메트릭 쿼리: 로그에서 계산된 값을 반환

스트림 선택자

라인 필터

파서

레이블 필터

라인 포맷

메트릭 쿼리

실용적인 쿼리 예시


라벨 설계

라벨 설계 원칙

좋은 라벨 설계는 Loki 성능의 핵심입니다.

권장 라벨

피해야 할 라벨

카디널리티 관리

spinner

스트림 수 계산:

권장 사항:

  • 클러스터당 총 스트림 수: < 100,000

  • 테넌트당 활성 스트림 수: < 10,000

  • 라벨당 고유 값 수: < 1,000

Promtail 라벨 설정

동적 라벨링


성능 튜닝

Ingester 튜닝

Querier 튜닝

프론트엔드 튜닝

리소스 가이드라인


보존 정책

글로벌 보존 정책

테넌트별 보존 정책

스트림별 보존 정책


트러블슈팅

일반적인 문제와 해결책

1. "too many outstanding requests"

2. "rate limit exceeded"

3. "max streams limit exceeded"

4. 쿼리 성능 저하

5. Ingester OOM

유용한 진단 명령

Grafana 대시보드 설정


모범 사례 요약

Do's

  1. 레이블은 최소한으로: namespace, app, component, level 정도만 사용

  2. JSON 로깅 채택: 구조화된 로그로 파싱 오버헤드 감소

  3. S3 라이프사이클 설정: 비용 최적화를 위한 티어링 구성

  4. IRSA 사용: Access Key 대신 IAM Role 사용

  5. 캐싱 활성화: 쿼리 결과 및 청크 캐싱으로 성능 향상

  6. 모니터링 설정: Loki 자체 메트릭 수집 및 알림 구성

Don'ts

  1. 높은 카디널리티 라벨 피하기: pod_name, request_id 등

  2. 무제한 쿼리 범위 피하기: 시간 범위 제한 필수

  3. 단일 노드 배포 피하기: 프로덕션에서는 최소 3 레플리카

  4. WAL 비활성화 피하기: 데이터 손실 방지를 위해 필수

  5. 리소스 제한 없이 배포 피하기: OOM 방지


퀴즈

이 장에서 배운 내용을 테스트하려면 Loki 퀴즈를 풀어보세요.

마지막 업데이트