개요
Loki는 여러 구성 요소 마이크로서비스로 구축되었으며 수평으로 확장 가능한 분산 시스템으로 실행되도록 설계되었습니다. Loki의 독특한 디자인은 전체 분산 시스템의 코드를 단일 바이너리 파일 또는 Docker 이미지로 컴파일합니다. 단일 바이너리 파일의 동작은 -target 커맨드 라인 플래그로 제어되며 세 가지 운영 모드 중 하나를 정의합니다.
Monolithic mode

- 가장 간단한 모드인
Monolithic mode는 -target=all 플래그로 동작합니다. 이는 가장 기본적인 모드로 별도로 설정할 필요가 없습니다. Loki의 마이크로서비스 모든 구성들을 하나의 프로세스 내에서 단일 바이너리 파일 또는 도커 이미지로 실행합니다.
Monolithic mode는 Loki를 빠르게 시작하여 실험해볼 때 유용하며, 하루에 약 100GB까지의 작은 읽기/쓰기 볼륨에 적합합니다. Monolithic mode 배포를 더 많은 인스턴스로 수평 확장하기 위해 공유 객체 저장소를 사용하고, 모든 인스턴스 간에 상태를 공유하도록 ring 섹션을 구성할 수 있습니다.
- 두 개의 Loki 인스턴스를 실행하고
memberlist_config 구성과 공유 객체 저장소를 사용하여 고가용성을 구성할 수 있습니다. 모든 Loki 인스턴스로 트래픽을 라운드 로빈 방식으로 라우팅합니다. 쿼리 병렬화는 인스턴스의 수와 정의된 쿼리 병렬성에 따라 제한됩니다.
Simple scalable deployment mode

- 만약 로그 볼륨이 하루에 몇 백 기가바이트를 초과하거나 읽기와 쓰기 관련 문제를 분리하려면,
Loki는 simple scalable deployment mode를 제공합니다. 이 배포 모드는 하루에 수 테라바이트 이상의 로그까지 확장 가능합니다. 매우 큰 Loki 설치의 경우 마이크로서비스 모드 접근 방식을 고려해야 합니다.
- 이 모드에서 Loki의 마이크로서비스 구성 요소는 두 가지 대상(
-target)으로 묶입니다. -target=read 및 -target=write. BoltDB 컴팩터 서비스는 읽기 대상의 일부로 실행됩니다.
- 읽기와 쓰기 경로를 분리하는 것에는 다음과 같은 이점이 있습니다:
- 전용 노드를 제공하여 쓰기 경로의 더 높은 가용성
- 요구에 따라 쿼리 성능을 추가/제거할 수 있는 독립적으로 확장 가능한 읽기 경로
- 간단한 확장 가능한 배포 모드는
Loki 앞단에 로드 밸런서가 필요합니다. 이 로드 밸런서는 /loki/api/v1/push 트래픽을 쓰기 노드로 보내며, 다른 모든 요청은 읽기 노드로 전송됩니다. 트래픽은 라운드 로빈 방식으로 전송되어야 합니다.
- Loki의 간단한 확장 가능한 배포 모드는 하루에 수 테라바이트 이상의 로그까지 확장 가능합니다.
Microservices mode

Microservices mode에서는 Loki의 구성 요소를 개별 프로세스로 인스턴스화합니다. 각 프로세스는 대상(target)을 지정하여 호출됩니다. 각 대상은 다음과 같습니다.
- 인제스터(ingester)
- 디스트리뷰터(distributor)
- 쿼리 프론트엔드(query-frontend)
- 쿼리 스케줄러(query-scheduler)
- 쿼리어(querier)
- 인덱스 게이트웨이(index-gateway)
- 룰러(ruler)
- 컴팩터(compactor)
- 개별 마이크로서비스로 구성 요소를 실행하면 마이크로서비스의 수를 늘림으로써 확장할 수 있습니다. 사용자가 정의한 클러스터를 통해 개별 구성 요소를 더 잘 관찰할 수 있습니다.
Microservices mode는 가장 효율적인 Loki 설치 방법입니다. 그러나 설정 및 유지 관리가 가장 복잡합니다.
Microservices mode는 매우 큰 Loki 클러스터나 확장 및 클러스터 운영에 대해 더 많은 제어가 필요한 클러스터에 권장됩니다.