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