
Loki의 해시링
Loki 클러스터 아키텍처에 일관성 있는 해시 링(consistent hash ring)을 포함하는 이유는 다음과 같습니다.
- 로그 라인의 샤딩(Sharding)을 지원하기 위해
Hash ring은 로그 라인들을 여러 파티션으로 분할하여 분산 저장 및 처리할 수 있도록 도와줍니다. 이를 통해 로그 데이터를 여러 노드에 분산하여 처리하면 성능과 확장성이 향상되며, 로그 데이터의 양이 증가해도 대규모 클러스터에서 효율적으로 작동할 수 있습니다.
- 고가용성을 구현하기 위해
Hash ring을 이용하여 여러 노드 사이에 데이터를 복제하고 분산하여 저장함으로써 시스템의 고가용성을 확보할 수 있습니다. 노드 중 하나가 장애가 발생하더라도 데이터의 손실을 최소화하고 서비스를 지속적으로 제공할 수 있게 됩니다.
- 수평 스케일 업 및 다운을 용이하게 만들기 위해
Hash ring은 노드의 추가 또는 제거를 간편하게 처리하여 클러스터의 확장 또는 축소를 지원합니다. 이로 인해 데이터 리밸런싱에 따른 성능 저하가 줄어들고, 유연한 확장이 가능해집니다.
Hash ring은 보통 다음과 같이 구성되어 각각의 컴포넌트를 연결합니다.
- 해시 링을 사용하여 Monolithic deployment 모드의
Loki 인스턴스를 연결합니다.
- Simple scalable deployment 모드의 경우에는 여러 개의 읽기(read) 컴포넌트 또는 쓰기(write) 컴포넌트를 연결합니다.
- Microservices 모드의 경우에는 한 유형의 컴포넌트의 여러 인스턴스를 연결합니다.
Hash ring은 배포 모드에 따라서 여러 컴포넌트들을 연결하여 Loki 클러스터를 효율적으로 구성하고, 고가용성과 확장성을 제공하는 데 도움을 줍니다. Distributors, Ingesters, Query Schedulers, Compactors, Rulers는 Hash ring을 통해 연결되며, Index Gateway는 선택적으로 해시 링에 연결될 수 있습니다.
- 3개의
distributors와 3개의 ingesters가 정의된 아키텍처에서는, 이러한 컴포넌트들의 Hash ring은 동일한 유형의 컴포넌트 인스턴스들을 연결합니다.

Hash ring의 각 노드는 컴포넌트의 인스턴스를 나타냅니다. 각 노드에는 해당 링 내 모든 노드들과의 통신 정보를 담고 있는 키-값 저장소가 있습니다. 노드들은 주기적으로 키-값 저장소를 업데이트하여 모든 노드들 간에 일관성 있는 내용을 유지합니다. 각 노드에 대해, 키-값 저장소에는 다음과 같은 정보가 포함되어 있습니다.
- 컴포넌트 노드의 ID: 해당 노드의 식별자입니다.
- 컴포넌트 주소: 다른 노드들이 통신 채널로 사용하는 주소입니다. 다른 노드들과의 통신을 위해 사용됩니다.
- 컴포넌트 노드의 상태 표시: 해당 노드의 건강 상태를 나타내는 표시입니다. 이 표시를 통해 노드들 간의 상태를 확인하고 문제가 발생한 경우 적절한 조치를 취할 수 있습니다.
- 키-값 저장소를 통해 링의 각 노드들은 서로의 정보를 공유하고 통신하며, 클러스터의 전반적인 상태를 파악할 수 있게 됩니다. 이를 통해
Loki 클러스터의 다양한 컴포넌트들이 원활하게 협력하여 작동하고, 시스템의 안정성과 일관성을 유지할 수 있습니다.
Configure rings
common.ring_config 블록 내에서 링의 구성을 정의합니다.
- 다른 특별한 이유가 없는 한, 기본적으로는
memberlist 키-값 저장소 유형을 사용합니다. memberlist는 gossip protocol을 사용하여 모든 노드로 정보를 전파하여 키-값 저장소 내용의 최종 일관성을 보장합니다.
distributor rings, ingester rings, 그리고 ruler rings에 대한 추가적인 구성 옵션이 있습니다. 이러한 옵션들은특수한 용도에만 사용됩니다.
distributor ring은 distributor.ring 블록에서, ingester ring은 ingester.lifecycler.ring 블록에서,ruler rings은 ruler.ring 블록에서 정의됩니다.
Distributor ring
Distributors는 키-값 저장소 내의 정보를 사용하여 distributor ring 내의 distributor의 수량을 확인하기 위해 사용합니다. 해당 정보는 클러스터의 한계를 나타냅니다.
Ingester ring
ingester rings 정보는 distributors에 의해 사용됩니다. 이 정보들을 통해 distributors는 로그 라인을 샤드하여 distributors가 로그 라인을 어떤 단일 ingester 또는 다수의 ingester에 보낼지 결정합니다.
Query Scheduler ring