Loki의 Zone Awareness 기능

Zone Awareness란?

Zone Awareness는 Loki가 여러 가용 영역(Availability Zones)에 걸쳐 데이터를 분산하고 복제하는 기능입니다. 이 기능은 단일 가용 영역 장애가 발생해도 서비스를 중단 없이 유지할 수 있도록 설계되었습니다.

기본 개념

  • 복제 요소(Replication Factor): 로그 데이터가 복제되는 인스턴스 수를 결정합니다. 일반적으로 3으로 설정됩니다.
  • 가용 영역(Zones): 각 인스턴스가 위치한 물리적 또는 논리적 격리 단위입니다. 예를 들어 AWS의 us-east-1a, us-east-1b 등이 있습니다.
  • 해시 링(Hash Ring): Loki는 일관된 해시 링을 사용하여 데이터를 분산합니다. 각 인스턴스는 링에 여러 토큰을 가지며, 이 토큰을 기반으로 로그 스트림이 할당됩니다.

Zone Awareness 활성화 방법

Zone Awareness를 활성화하려면 Loki 설정 파일에서 다음 설정을 추가해야 합니다.

ingester_client:
  zone_awareness_enabled: true

또한 각 인스턴스(인제스터)에는 자신의 가용 영역 정보가 설정되어 있어야 합니다. 이는 일반적으로 환경 변수나 Kubernetes 라벨을 통해 제공됩니다.

podLabels:
  availability-zone: <zone-name>

내부 작동 방식

1. 링 구성과 토큰 관리

Zone Awareness가 활성화되면 Loki는 링을 구성할 때 각 인스턴스의 영역 정보를 추적합니다. vendor/github.com/grafana/dskit/ring/ring.go 코드에서 확인할 수 있듯이, 링은 영역별로 토큰을 분류하여 관리합니다.

2. 복제 전략

Distributor가 로그 데이터를 인제스터로 보낼 때, Zone Awareness가 활성화되어 있다면 다른 영역에 있는 인제스터를 선택합니다. 이 메커니즘은 이미 선택된 영역과 다른 영역의 인스턴스를 선택하도록 보장합니다.

3. 장애 처리 메커니즘

Zone Awareness가 활성화된 상태에서 Loki는 영역 장애를 특별하게 처리합니다.

numReplicatedZones := min(len(r.ringZones), r.cfg.ReplicationFactor)

중요한 점은 영역에 하나라도 실패한 인스턴스가 있으면 해당 영역 전체를 실패한 것으로 취급한다는 것입니다.

문제 분석: 영역 전체 실패 케이스

시나리오: C 영역 실패 원인

두 가지 영역(A와 C)에 Loki를 설정했는데, C 영역의 인제스터 하나가 고장나자 C 영역 전체가 실패한 것이 관찰되었습니다. 이는 Loki의 Zone Awareness 설계에서 의도된 동작입니다.

원인 설명

  1. 영역 전체 실패 정책: Loki의 Zone Awareness 코드는 if len(zoneFailures) > 0 { 부분에서 볼 수 있듯이, 영역 내에 하나라도 실패한 인스턴스가 있으면 해당 영역의 모든 인스턴스(건강한 인스턴스 포함)를 제외합니다.

  2. 각 영역당 인제스터 수: 각 영역에 4개의 인제스터를 배포했지만, 하나의 인제스터만 실패해도 전체 영역이 제외되었습니다.

  3. 복제 전략: 기본 복제 요소가 3일 경우, 인제스터는 3개의 다른 영역에 데이터를 복제해야 합니다. 하지만 A와 C 영역만 있는 경우, C 영역이 실패하면 A 영역만 남기 때문에 필요한 복제본 수(RF=3)를 만족시킬 수 없습니다.

최적의 구성 방법

이 문제를 방지하려면 다음과 같은 방법을 고려해볼 수 있습니다.

  1. 3개 이상의 영역 사용: 복제 요소가 3인 경우, 최소 3개의 영역을 사용하는 것이 좋습니다. 이렇게 하면 한 영역이 완전히 실패해도 나머지 두 영역에서 서비스를 계속할 수 있습니다.

  2. 영역당 충분한 인제스터 배포: 각 영역에는 최소 복제 요소만큼의 인제스터를 배포하는 것이 좋습니다. 예를 들어 RF=3이고 영역이 3개라면, 각 영역에 최소 3개 이상의 인제스터를 배포하는 것이 안전합니다.

  3. 복제 요소 조정: 가용 영역이 제한된 경우(예: 2개만 사용 가능), 복제 요소를 영역 수에 맞게 조정하는 것이 좋습니다. 예를 들어 2개의 영역을 사용한다면 RF=2로 설정하는 것이 더 적합할 수 있습니다.

common:
  replication_factor: 2
ingester_client:
  zone_awareness_enabled: true
  1. maxUnavailableZones 고려: Zone Awareness가 활성화된 경우, Loki는 maxUnavailableZones = (RF/2) - 1 공식을 사용하여 허용 가능한 최대 실패 영역 수를 계산합니다. RF=3인 경우 하나의 영역이 실패해도 괜찮지만, RF=2인 경우 영역 실패를 허용할 수 없습니다.

결론

Zone Awareness는 Loki의 고가용성을 위한 중요한 기능이지만, 올바르게 구성하지 않으면 오히려 가용성을 해칠 수 있습니다.

특히 두 영역(A, C)에 각각 4개의 인제스터가 있는 상황에서는:

  • RF=3이고 Zone Awareness가 활성화된 경우, 한 영역의 인제스터 하나가 실패하면 해당 영역 전체가 제외되므로 필요한 영역 수(3개)를 만족시킬 수 없습니다.
  • RF=2로 설정하고 Zone Awareness를 활성화하면, 두 영역 모두 건강해야 하므로 한 영역의 인제스터 하나가 실패해도 여전히 문제가 발생합니다.

이상적인 구성은 3개 이상의 영역을 사용하거나, 영역이 2개로 제한된 경우 Zone Awareness를 비활성화하고 다른 고가용성 전략을 고려하는 것입니다.

이 시리즈의 게시물

댓글