Logging/Grafana Loki 아키텍처 구성

Paul
7 min readAug 2, 2021

--

Grafana Loki Components

Grafana Loki 아키텍처

앞 장에서 Grafana Loki에 대해서 로컬 환경 구성을 구성해 봤습니다. Loki는 single process mode와 수평적 확장성을 위해 Loki 프로세스를 분리해서 구성할 수 있습니다. single process mode는 테스트 또는 소규모 환경에서 사용할 수 있습니다.

https://grafana.com/docs/loki/latest/architecture/modes_of_operation.png

Loki는 Components(querier, ingester, query-frontend, or distribute)로 구성이 됩니다. 각 Components 간 통신은 gRPC 통신을 하고 외부 API 요청은 HTTP/1 으로 통신을 합니다. Loki 실행할 때 -target 설정(all, querier, ingester, query-frontend 또는 distributor)을 통해서 single process mode 또는 MicroServices 모드로 실행이 됩니다. 그럼 각 Components에 대해서 알아보도록 하겠습니다.

Distributor

Distributor는 클라이언트(fluentd, fluent-bit, promtail)에서 들어오는 로그를 받아서 로그의 정확성을 검증하고 하나 이상의 Ingester에게 전달합니다.

  • Preprocessing(전처리기): 레이블을 정렬합니다. (예를 들어서 {foo=”bar”, bazz=”buzz”} 을 {bazz=”buzz”, foo=”bar”} )
  • Rate limiting(제한설정): Distributor는 최대 테넌트당 비트 전송률을 제한할 수 있습니다. (예를 들어서 Distributor 10대이고 테넌트A의 속도 제한이 10M라고 가정하며, (10MB / 10 Distributors) = 1MB/s )
  • Forwarding(전송): distributor가 모든 유효성 검사 작업을 수행하면 최종적으로 Ingester 에게 데이터를 전달합니다.
  • Hash(해쉬): distributor는 일관된 해싱을 사용하여 로그 스트림을 수신할 Ingester 를 선택합니다. Consul(etcd, memberlist) 에 저장된 해쉬링 정보를 통해서 일관된 해싱을 생성하게 됩니다. 모든 Ingester 생성될 때 Consul에 정보를 등록하게 됩니다.
Consul Hash ring 화면 정보

Ingester

Ingester는 Distributors 로부터 로그를 수신하고 들어오는 데이터를 장기 저장소(DynamoDB, S3, Cassandra, etc.)에 저장을 합니다. Ingester는 로그 스트림을 메모리에 chunks 단위로 저장되고, 일정 후에 장기 저장소에 저장됩니다. Ingester 가 갑자기 종료되면 영구 저장소에 저장되지 않는 모든 데이터가 손실됩니다. Loki는 로그를 여러 복제본(3개)을 복제하도록 구성됩니다. 영구 저장소에 저장될 때는 테넌트, 레이블 및 컨텐츠를 기반으로 해싱이 되어 저장됩니다. Ingester 관련 설정은 아래의 링크를 참고하세요.

Ingester Chunk 캐쉬 데이터 저장 화면

Querier

Querier는 Ingester(내장 메모리) 및 장기 저장소(DynamoDB, S3, Cassandra, etc.) 에서 로그 쿼리 한 데이터를 가져온 후 중복을 제거 후 Grafana 또는 Query-Frontend 에게 데이터를 반환합니다. Querier 관련 설정은 아래의 링크를 참고하세요.

Chunk Store

Chunk Store는 Loki 로그의 장기 조장을 위한 저장소이며, 쿼리 및 쓰기를 지원하려면 블록 저장소가 필요합니다. Loki에서 지원하는 저장소는 Amazon DynamoDB, Google Bigtable, Apache Cassandra, Amazon S3, Google Cloud Storage입니다.

아래의 내용은 로그 스트림이 장기 저장소에 저장되는 과정입니다.

https://grafana.com/docs/loki/latest/architecture/chunks_diagram.png
  • Distributor는 HTTP/1 요청으로 로그 스트림을 받습니다.
  • 각 스트림은 Hash ring 사용해서 해쉬가 됩니다. (각 스트림을 담당할 Ingester 가 선택됩니다.)
  • Distributor는 Ingester 에게 해당 스트림을 전달합니다.
  • Ingester는 스트림 데이터에 대한 Chunk를 생성하거나, 기존에 있는 Chumk 에 추가를 합니다.
Ingester Chunk Redis 화면 정보
minio Ingester Chunk저장된 화면

[Optional]Query-Frontend

쿼리 프론트엔드는 2020년 여름에 도입되었으며 분산 설정의 선택적 구성 요소입니다. 일종의 프록시 서비스라고 생각할 수 있습니다. Grafana에서 요청을 수신하고 일부 유효성 검사 및 캐싱을 수행한 다음 쿼리를 쿼리자에게 전달합니다.

마무리

Grafana Loki 아키텍처 구조에서 각 Components 에 대해서 알아봤습니다. 소규모 환경에서는 Single Instance에 구성해서 사용해도 문제가 없겠지만, 서비스 규모가 큰 경우는 분산 환경을 구성해야 합니다. 다음에는 Grafana Loki Cluster 환경을 구성해 보도록 하겠습니다.

참고 사이트

--

--