1. 개요
Grafana Loki에서는 기본적으로 RF(Replication Factor, 복제 요소)의 값을 3으로 설정할 것을 권장한다.
이는 Ingester 인스턴스의 Rolling Update 중 일부 로그의 유실을 방지하기 위해서이다.
관련 내용은 아래 글에 정리되었으니 참고하면 된다.
https://nyyang.tistory.com/195
이 때 별도의 설정을 하지 않는다면 중복된 청크들이 객체 스토리지에 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
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
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이 너무 많은 쪼개지는지 등 다른 요소를 살펴봐야 한다.
'DevOps' 카테고리의 다른 글
[EKS] Spot Instance를 안전하게 처리하는 방안에 대해서 (9) | 2024.11.08 |
---|---|
[Harbor] EKS 환경에서 Harbor 고가용성(HA)으로 구성하기 (2) | 2024.06.08 |
[Strimzi Kafka Connect] 손쉽게 커넥터 Config에 시크릿 적용하기 (0) | 2024.05.01 |
[Ansible] 사용자 계정 생성 및 apache http 설치 실습 (0) | 2024.02.04 |
[Ansible] 반복문, 조건문, 핸들러, 블록, Recsue 등 개념 정리 (0) | 2024.01.20 |