Notification
새로운 알림이 없습니다.

[Observability] LGTM Stack: Loki(2)

Grafana


  • Agenda
    • What is Loki?
    • Loki Logging Stack
    • Features
    • Concepts
    • Architecture
    • Components of Grafana Loki
    • Loki Indexing
  • Reference


What is Loki?

로키(Loki)는 분산 로깅 시스템으로, 특히 Kubernetes 환경에서 사용하기에 적합한 오픈 소스 도구입니다. Loki는 Prometheus의 Query 언어와 유사한 Query 언어인 PromQL을 사용하여 로그 데이터를 검색하고 시각화할 수 있습니다.

또한 Loki는 Log 수집기인 Promtail을 제공하고, Fluent등을 통해서 연동 가능한 구조를 가지고 있습니다.

Loki Logging Stack

  • Agent
    • 프로메테우스 Loki와 함께 제공되는 Promtail 같은 프로그램이나 클라이언트. 에이전트는 로그를 수집하고, 라벨을 추가하여 스트림으로 변환하며, HTTP API를 통해 Loki에게 전송합니다.
  • Loki
    • 로그 수집 및 저장, 쿼리 처리를 담당합니다. 세 가지 배포 모드로 사용 가능
    • Loki 배포 모드
로그 데이터 쿼리 및 표시. 또한, 명령줄에서 LogCLI를 사용하거나 Loki API를 직접 사용하여 로그를 쿼리할 수 있습니다.

Features

다음은 Loki의 주요 기능입니다. 
  • Lightweight and Efficient
    • Log Data를 색인화 하고 저장하는데 특화되어 있으며, 대규모의 Log Data를 효율적으로 처리할 수 있음
  • Query Language
    • PromQL을 사용하여 Log Data를 Query하고 Filtering 가능
  • Distributed and Scalable
    • Loki는 수평 확장이 가능하며, 분산 환경에서 효과적으로 동작함
  • Integrations
    • Kubernetes와 Prometheus와의 통합 환경에서 Log를 효과적으로 수집하고 모니터링
    • Loki는 Grafana, Mimir 및 Tempo와 통합되어 완전한 관찰 스택과 로그, 측정항목 및 추적 간의 원활한 상관관계를 제공
  • Log Collection, Storage, Search, Visualization
    • Fluentd, Filebeat, Promtail등의 Log Collection 도구를 사용하여 Log 수집 가능
    • Loki는 Log를 JSON 형식으로 저장, Loki의 자체 저장소인 Promtail 또는 다른 저장소에 저장가
    • Loki는 LogQL이라는 자체 쿼리 언어를 사용
      • LogQL을 사용하여 로그를 필터링, 그룹화, 정렬함
    • Loki는 Grafana와 함께 사용하여 로그를 시각화

Concepts

  • 로그 스트림(Streams)
    • Loki는 로그 데이터를 스트림 단위로 처리합니다.
    • 각 스트림은 고유한 레이블 세트로 식별됩니다.
      • 예를 들어, 애플리케이션 또는 서비스마다 별도의 로그 스트림을 생성할 수 있습니다.
  • 레이블(Labels)
    • Loki는 로그 데이터를 쿼리하기 위해 레이블을 사용합니다.
    • 레이블은 로그 스트림을 식별하는 데 사용되며, 로그 데이터에 추가 정보를 제공합니다.
      • 예를 들어, 애플리케이션 이름, 로그 레벨, 호스트 이름 등의 레이블을 사용할 수 있습니다.
  • 쿼리(Query)
    • Loki는 PromQL(Prometheus Query Language)을 사용하여 로그 데이터를 쿼리합니다.
    • 이를 통해 로그 데이터를 필터링하고 집계할 수 있습니다.
    • Loki는 로그 데이터의 특정 시간 범위, 레이블 값, 키워드 등을 기반으로 쿼리를 수행할 수 있습니다.
  • 분산 아키텍처(Distributed Architecture)
    • Loki는 수평 확장이 가능한 분산 아키텍처를 가지고 있습니다.
    • 이를 통해 대량의 로그 데이터를 처리하고 저장할 수 있습니다.
    • Loki는 여러 개의 컴포넌트로 구성되며, 각 컴포넌트는 로그 데이터의 수집, 색인화, 저장 등을 담당합니다.

Architecture

Components of Grafana Loki

출처: https://grafana.com/docs/loki/latest/get-started/components/

Grafana Loki의 Architecture는 5가지 Component로 구성되어 있습니다.
  1. Distributor
    • Client로 들어오는 Stream을 처리하는 역할
    • Stream Set을 받으면, 각 Stream이 올바른지 유효성을 검사
    • 유효한 청크는 일괄 처리로 분할되어 여러 ingester로 병렬로 전송됨
    • Traffic을 적절히 분산하려면 Distributor 앞에 LB를 배치하는것이 중요
  2. Ingester
    • Write Path의 long-term Storage Backend(DynamoDB, GCS, S3, Cassandra 등)에 Log Data를 쓰고 Read Path의 In Memory Query에 대한 Log Data를 반환하는 역할
    • Ingester는 Hash Ring에서 Life Cycle을 관리
    • 아래 5가지 상태를 나타냄
      • PENDING: Ingester가 초기화 되지 않은 상태
      • JOINING: Ingester가 Hash Ring에 합류하는 중인 상태
      • ACTIVE: Ingester가 정상적으로 작동하는 상태(Log Read & Writer 가능)
      • LEAVING : Hash Ring에서 빠지는 상태
      • UNHEALTHY : 작동 X
  3. Query Frontend
    • Query Frontend는 Querier의 역할을 보조하며, Read 경로를 가속화함
    • 내부적으로 QUery를 조정하고 Queue에 보관
    • Stateless이며, Replicas 2개로 충분하다고 Docs에서 설명함
  4. Querier
    • LogQL을 사용하여 Query를 처리하고, Ingester와 장기 저장소에서 Log를 가져옴
    • 모든 Ingester에 대해 In Memory Data를 Query한 다음 Backend 저장소에 대해 동일한 쿼리 재실행
      • 복제 요소로 인해 Querier가 중복된 데이터를 수신할 수도 있음
      • 위 문제를 해결하기 위해 Querier는 내부적으로 동일한 nanosecond Timestamp, Label Set, Log Msg를 가진 Data를 중복 제거

Loki Indexing



Loki는 다른 로깅 시스템과 달리 아래와 같이 로그 스트림의 메타데이터인  Label(Prometheus의 레이블과 같은)만 Indexing한다는 개념에 기반해 구축되므로 원본 로그 메시지는 색인되지 않습니다.

그런 다음 로그 데이터 자체는 압축되어 S3나 GCS와 같은 
Object Stroage에 chunks로 저장되거나 파일 시스템에 저장됩니다. 작은 인덱스와 압축된 chunks는 간결하면서도 효율적인 쿼리 실행을 가능하게하고 Loki의 비용을 크게 낮추게 됩니다.

Reference

Grafana Observability
Stan Cloud
Stan Cloud
An avid cloud engineering Fan
대화 참여하기
댓글 쓰기