[Loki] Partition Ring 셔플 샤딩 캐시 크기를 설정 플래그로 추출
PR 링크: grafana/loki#20522 상태: Merged | 변경: +20 / -2
들어가며
Loki의 Partition Ring은 Kafka 기반 인제스트 경로에서 파티션을 분배하는 데 사용됩니다. 셔플 샤딩 캐시 크기가 1000으로 하드코딩되어 있었는데, 테넌트 수와 변경 빈도에 따라 최적 값이 달라집니다. 이 PR은 이 값을 CLI 플래그로 추출하여 운영 환경에서 조정할 수 있게 합니다.
핵심 코드 분석
Before: 하드코딩된 캐시 크기
// modules.go
ringOptions := ring.DefaultPartitionRingOptions()
ringOptions.ShuffleShardCacheSize = 1000
After: 설정 플래그로 추출
// partition_ring.go
type Config struct {
// ...
ShuffleShardCacheSize int `yaml:"shuffle_shard_cache_size"`
}
func (cfg *Config) RegisterFlagsWithPrefix(prefix string, f *flag.FlagSet) {
f.IntVar(&cfg.ShuffleShardCacheSize,
prefix+"partition-ring.shuffle-shard-cache-size", 0,
"The size of the cache used for shuffle sharding. "+
"If zero or negative, an unbounded cache is used. "+
"If positive, an LRU cache with the specified size is used.")
}
// modules.go
ringOptions := ring.DefaultPartitionRingOptions()
ringOptions.ShuffleShardCacheSize = t.Cfg.Ingester.KafkaIngestion.PartitionRingConfig.ShuffleShardCacheSize
기본값을 0(무제한)으로 설정하여 기존 동작을 변경하지 않으면서, 양수 값을 지정하면 LRU 캐시를 사용합니다.
왜 이게 좋은가
1. 환경별 최적화
테넌트가 10개인 셀과 10,000개인 셀에서 동일한 캐시 크기를 사용하는 것은 비효율적입니다. 소규모 셀에서는 무제한 캐시가 적절하고, 대규모 셀에서는 LRU 캐시로 메모리를 제한해야 합니다.
2. 안전한 롤아웃
기본값 0(무제한, 기존 동작)으로 설정되어 있어, 이 변경을 배포해도 즉시 영향이 없습니다. 운영팀이 점진적으로 값을 조정할 수 있습니다.
3. Ingester와 DataObj Consumer 모두 적용
Ingester의 Partition Ring과 DataObj Consumer의 Partition Ring에 동일한 설정이 적용되어 일관성을 유지합니다.
참고 자료
- Grafana Mimir: Shuffle Sharding — 셔플 샤딩 개념
- LRU Cache 설계 — LRU 캐시 교체 정책
관련 포스트
PR Analysis 의 다른글
- 이전글 [Loki] Thor 쿼리 엔진 메모리 최적화 Part 2: 식별자 캐싱과 빌더 Reserve
- 현재글 : [Loki] Partition Ring 셔플 샤딩 캐시 크기를 설정 플래그로 추출
- 다음글 [Loki] Thor 쿼리 엔진 메모리 최적화 Part 3: 불필요한 스키마 재생성 제거
댓글