본문 바로가기

DevOps

[Grafana Loki] 청크 중복성 제거하기 (ingester에만 chunk cache 적용)

반응형

1. 개요

Grafana Loki에서는 기본적으로 RF(Replication Factor, 복제 요소)의 값을 3으로 설정할 것을 권장한다.
 
이는 Ingester 인스턴스의 Rolling Update 중 일부 로그의 유실을 방지하기 위해서이다.
 
관련 내용은 아래 글에 정리되었으니 참고하면 된다.
 
https://nyyang.tistory.com/195

[Log] Grafana Loki 성능 최적화 방법 정리

Loki 3.0에서는 Bloom Filter가 도입될 예정이라고 한다. (이미 Loki 3.0은 release 되었다. Loki를 갓 도입하는 분들는 3.x 버전으로 도입하는게 좋아보인다.) 아마 이게 도입되면 필터링 검색 시 굉장히 빨

nyyang.tistory.com

 
 
 
이 때 별도의 설정을 하지 않는다면 중복된 청크들이 객체 스토리지에 3 copy가 저장되고 쿼리어의 입장에서는 x3의 데이터를 읽고 이를 매번 중복된 청크를 제거해주는 작업을 해야한다는 것이다.
 
이를 위해 Chunk deduplication을 고려할 수 있는데 이 때 단점이 ingester는 당연히 dedup 과정을 위해 chunk에 store, fetch 하는 과정이 필요하지만 querier까지 과연 chunk store, fetch 하는 과정이 필요할까?에 대한 의문을 가질 수 있다.
 
그렇다면 chunk deduplication을 위해 ingester에 대해서만 chunk cache를 적용하고 querier에는 적용하지 않으려면 어떻게 해야할까? 
 
 

2. 설정 방법

필요한 설정은 다음과 같다.
 
1. ingester만 memcached chunk cache를 활용할 수 있도록 한다.
 
2. querier는 별도의 config를 적용한다
 
3. ingester는 chunk hash 된 key 값만 가지고 있으면 되기 때문에 cache-stubs를 활성화한다.
: Loki team에서는 이 설정이 일반적이지 않다고 판단하여 yaml config에 넣지 않고 container args에 넣을 수 있도록 했다.
 

 
 
 
(이 설정은 loki에만 있는게 아니라 cortex에도 존재한다. 근데 mimir에는 없는 것 같음)
 
https://github.com/cortexproject/cortex/blob/master/CHANGELOG.md

cortex/CHANGELOG.md at master · cortexproject/cortex

A horizontally scalable, highly available, multi-tenant, long term Prometheus. - cortexproject/cortex

github.com

 
 
 
 
 
 

3. 적용하기

3.x 버전에서 다른지는 모르겠지만 필자는 2.x 버전을 기준으로 설명한다.
 
[1] querier 별도의 loki config를 만든다.
: loki querier에서는 chunk memcached를 바라보지 않도록 설정이 필요하기 때문이다. 필자의 경우 loki-distibuted 헬름 차트를 쓰기에 helm chart를 일부 커스터마이징했다.
 

 
이곳에는 chunkCache 부분을 지워줬음

 
 
querier deployment.yaml에 configMap 부분 수정

volumes:
  - name: config
    {{- if .Values.loki.existingSecretForConfig }}
    secret:
      secretName: {{ .Values.loki.existingSecretForConfig }}
    {{- else }}
    configMap:
      name: {{ include "loki.fullname" . }}-querier
    {{- end }}
  - name: runtime-config
    configMap:
      name: {{ template "loki.fullname" . }}-runtime
  - name: data
    emptyDir: {}
  {{- with .Values.querier.extraVolumes }}
  {{- toYaml . | nindent 8 }}
  {{- end }}

 
 
[2] stub enable to ingester
 
ingester에 store.chunks-cache.cache-stubs=true 추가
 
https://github.com/grafana/loki/blob/a46d14fb05ea14dd39095d2d71cd037acc2dfc51/pkg/storage/config/store.go#L39

loki/pkg/storage/config/store.go at a46d14fb05ea14dd39095d2d71cd037acc2dfc51 · grafana/loki

Like Prometheus, but for logs. Contribute to grafana/loki development by creating an account on GitHub.

github.com

 

 

extraArgs:
  - -store.chunks-cache.cache-stubs=true

 
 
 

4. 확인

아래 쿼리들은 본인 환경 및 메트릭이름에 맞게 변경 필요
 
1. deduplicate 되는지 메트릭으로 확인
 
sum(rate(loki_chunk_store_stored_chunk_bytes_total{namespace="loki"}[5m]))
sum(rate(loki_chunk_store_deduped_bytes_total{namespace="loki"}[5m]))
 
2. stub만 memcached에 쌓이는지 확인
이건 memcached를 debug 모드로 올려서 확인해보거나 querier, query frontend 로그를 확인하면 된다.
 
 
3. querier에서는 memcached로 요청을 안하는지 확인
sum(rate(loki_cache_request_duration_seconds_sum{namespace="loki", container="querier", method=~"chunksmemcache.*"}[$__rate_interval])) by (method, status_code)
/
sum(rate(loki_cache_request_duration_seconds_count{namespace="loki", container="querier", method=~"chunksmemcache.*"}[$__rate_interval])) by (method, status_code)
> 0
 
 
 
이 설정 이후 청크 중복제거가 잘 안된다면 sync_period, chunk_utilization, label이 너무 많아서 stream이 너무 많은 쪼개지는지 등 다른 요소를 살펴봐야 한다.


 
 
 

반응형