๐ŸŒ ํ•™์Šต๋…ธํŠธ/๋‚™์„œ์žฅ

[๋ชจ๋‹ˆํ„ฐ๋ง์˜ ์ƒˆ๋กœ์šด ๋ฏธ๋ž˜ ๊ด€์ธก๊ฐ€๋Šฅ์„ฑ #4] 4์žฅ. ์˜คํ”ˆ์†Œ์Šค ๊ด€์ธก๊ฐ€๋Šฅ์„ฑ, ๊ทธ๋ผํŒŒ๋‚˜

mini_world 2024. 2. 27. 22:40

๐Ÿ“Œ ์ด ๋‚ด์šฉ์€ ์ฑ… ๋‚ด์šฉ ๋ฉ”๋ชจ์ž…๋‹ˆ๋‹ค.
๊ฐœ์ธ์ ์ธ ์ƒ๊ฐ๊ณผ ๊ฒฝํ—˜ ๊ทธ๋ฆฌ๊ณ  ์—ฌ๋Ÿฌ ์žก๋‹ด์ด ์žˆ์œผ๋‹ˆ, ์ฑ…์„ ์ฝ์œผ๋ฉฐ ์˜๊ฒฌ์„ ๋‚˜๋ˆ„๊ณ ์‹ถ์€๋ถ„์ด ๋ด์ฃผ์‹œ๋ฉด ์ข‹๊ฒ ์Šต๋‹ˆ๋‹ค.

 

์ด๋ฒˆ 4์žฅ์—์„œ๋Š” ๊ทธ๋ผํŒŒ๋‚˜ LGTM์Šคํƒ์„ ์„ค์น˜ํ•˜๊ณ , ๊ธฐ๋ฐ˜๊ธฐ์ˆ ์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๋ช…ํ•œ๋‹ค.

 

4.1 ๊ทธ๋ผํŒŒ๋‚˜ ๊ด€์ธก๊ฐ€๋Šฅ์„ฑ

 

4.1.1 ๋ชฉ์ ๊ณผ ๋ฒ”์œ„

์ด ์ฑ…์—์„œ ๋งํ•˜๋Š” ๊ด€์ธก๊ฐ€๋Šฅ์„ฑ์€ LGTM Stack(Loki, Grafanam Tempo, Mimir)์ด๋‹ค.
๊ทธ ๋งŽ์€ ํˆด ์ค‘์— LGTM Stack์„ ์„ ์ •ํ•œ ์ด์œ ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค๊ณ  ํ•œ๋‹ค. 

  • ๋Œ€์ค‘์ ์ด๊ณ  ๋ผ์ด์„ ์Šค์— ์ž์œ ๋กœ์šด ์˜คํ”ˆ์†Œ์Šค
  • ์ง€์†์ ์ด๊ณ  ์žฅ๊ธฐ์ ์ธ ๋กœ๋“œ๋งต๊ณผ ๋งŽ์€ ์ปค๋ฎค๋‹ˆํ‹ฐ
  • ๊ธฐ์ˆ ์ ์œผ๋กœ ์šฐ์ˆ˜ํ•˜๊ณ  ํด๋Ÿฌ์Šคํ„ฐ ๊ตฌ์ƒ์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ ๋งŽ์€ API ์ œ๊ณต

์ƒ๊ฐํ•ด๋ณด๋ฉด ElastiSearch๋Š” ์ด์ œ ๋”์ด์ƒ ์˜คํ”ˆ์†Œ์Šค๊ฐ€ ์•„๋‹ˆ๋ผ OpenSearch๋กœ ๊ฐˆ๋ผ์„  ๋ฐ˜๋ฉด์— LGTM์€ ์˜คํ”ˆ์†Œ์Šค๋กœ ๋Š์ž„์—†์ด ๊ฐœ๋ฐœ๋˜๊ณ  ๊ด€๋ฆฌ๋˜๋Š”๊ฒƒ ๊ฐ™๋‹ค. ์ด ์ฑ…์—์„œ ๊ธฐ๋ฐ˜๊ธฐ์ˆ ์— ๋Œ€ํ•ด ๋ฐฐ์šฐ๋ฉด์„œ๋„ ์–ผ๋งˆ๋‚˜ ๊ธฐ์ˆ ์ ์œผ๋กœ ์šฐ์ˆ˜ํ•œ์ง€๋„ ํ™•์ธํ–ˆ๊ธฐ๋•Œ๋ฌธ์— LGTM์„ ์„ ์ •ํ•œ ์ด์œ ๋Š” ๋‚ฉ๋“์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ๐Ÿ‘

๊ทธ๋Ÿผ LGTM Stack์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž!

๋ฐ์ดํ„ฐ ์ˆ˜์ง‘๊ธฐ(์˜ˆ: Promtail, Fluentbit/Fluentd, Telegraf, Vector, Exporter)๊ฐ€ ๋‹ค์–‘ํ•œ ์ถœ์ฒ˜๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•˜์—ฌOpenTelemetry๋กœ ์ „๋‹ฌํ•˜๊ณ , OpenTelemetry๋Š” ์ด ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•œ ํ›„ LGTM ์Šคํƒ(Loki, Grafana, Tempo, Mimir)์œผ๋กœ ์ „์†กํ•œ๋‹ค.
LGTM ์Šคํƒ์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„์„/์‹œ๊ฐํ™”/๊ด€๋ฆฌํ•˜๋Š” ๋„๊ตฌ์ด๋ฉฐ, ์˜ค๋ธŒ์ ํŠธ ์Šคํ† ๋ฆฌ์ง€์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜์—ฌ ์žฅ๊ธฐ์ ์œผ๋กœ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.

 

  • L, Loki: ๋กœ๊ทธ ๊ด€๋ฆฌ
  • G, Grafana: ๋Œ€์‹œ๋ณด๋“œ
  • T, Tempo: ์ถ”์  ๊ด€๋ฆฌ
  • M, Mimir: ๋ฉ”ํŠธ๋ฆญ ๊ด€๋ฆฌ

 

 

4.1.2 ์ธํ”„๋ผ ๊ตฌ์„ฑ

์ผ๋‹จ minikube, helm, kubectl์„ ์„ค์น˜ํ•œ๋‹ค.
๋‹ค๋งŒ, ์„ค์น˜ ์ž์ฒด๊ฐ€ ๋„ˆ๋ฌด ๊ฐ„๋‹จํ•˜๊ณ , ์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด ๋ณ€ํ•˜๊ธฐ ๋งˆ๋ จ์ด๋ผ ์„ค์น˜๋ฐฉ๋ฒ•์„ ์ ์–ด๋†“์ง€ ์•Š๊ณ  ๋งํฌ๋งŒ ์ฒจ๋ถ€ํ•œ๋‹ค.

- minikube:  https://minikube.sigs.k8s.io/docs/start/
- helm: https://helm.sh/docs/helm/helm_install/
- kubectl: https://kubernetes.io/docs/tasks/tools/install-kubectl-macos/

๋‹จ, minikube์„ค์น˜ ํ›„ ์‹คํ–‰ํ• ๋•Œ ๋ฆฌ์†Œ์Šค๋ฅผ ๋„‰๋„‰ํ•˜๊ฒŒ ํ• ๋‹นํ•ด์ฃผ์–ด์•ผ ๋ชจ๋“  ๋ฆฌ์†Œ์Šค๋ฅผ ์ผค ์ˆ˜ ์žˆ๋‹ค.

minikube start --memory=12000 --cpus=4

 

4.1.3 ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ตฌ์„ฑ

LGTM ์Šคํƒ์˜ ๊ธฐ๋ฐ˜์ด ๋˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์„ค๋ช…ํ•˜๊ณ  ์„ค์น˜ํ•œ๋‹ค.

 

Minio

์˜คํ”ˆ์†Œ์Šค ๊ฐ์ฒด ์Šคํ† ๋ฆฌ์ง€์ด๋ฉฐ, S3์™€ ํ˜ธํ™˜๋˜๋Š” API๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
LGTM ์Šคํƒ์—์„œ๋Š” ๋””์Šคํฌ IO์— ๊ฐ€์žฅ ํฐ ์„ฑ๋Šฅ๊ฐ์†Œ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉฐ, ์ด๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ  ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด ๋งŽ์€ ํŠœ๋‹์ž‘์—…์ด ํ•„์š”ํ•˜๋‹ค.
์ด๋•Œ, Minio๋Š” ์ƒ์„ธํ•œ ๋ฉ”ํŠธ๋ฆญ๊ณผ ์ˆ˜์น˜๋ฅผ ์ œ๊ณตํ•˜๋ฏ€๋กœ ๋งŽ์€ ๋„์›€์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.

minio ์„ค์น˜๋Š” ์•ž์„œ ์ด์ „ ํฌ์ŠคํŒ…์—์„œ ๋‹ค๋ฃฌ์  ์žˆ๋‹ค.
์ด ์ฑ…์—์„œ๋Š” helm์œผ๋กœ ์„ค์น˜ํ•˜์ง€๋งŒ ๋ฐ”์ด๋„ˆ๋ฆฌ๋กœ ์‹คํ–‰์‹œํ‚ค๋Š”๊ฑธ ์•„๋ž˜ ๋”๋ณด๊ธฐ๋กœ ์ ์–ด๋†“๋Š”๋‹ค.

  ๐Ÿ‘‡๐Ÿ‘‡ ๋”๋ณด๊ธฐ๋กœ Minio ๋กœ์ปฌ ์„ค์น˜๋ฐฉ๋ฒ• ํ™•์ธํ•˜๊ธฐ

๋”๋ณด๊ธฐ

[Minio ๋กœ์ปฌ ์‹คํ–‰ ๋ฐฉ๋ฒ•]
์Šคํ† ๋ฆฌ์ง€๋กœ ์‚ฌ์šฉํ•  minio๋ฅผ ๋‹ค์šด๋ฐ›๊ณ  ์‹คํ–‰์‹œํ‚จ๋‹ค. 

# ์ฐธ๊ณ : https://min.io/download#/macos

# ์„œ๋ฒ„ ๋‹ค์šด๋กœ๋“œ 
curl --progress-bar -O https://dl.min.io/server/minio/release/darwin-arm64/minio

# minio๊ฐ€ ์‚ฌ์šฉํ•  ๋””๋ ‰ํ† ๋ฆฌ ์ƒ์„ฑ
mkdir minio-dir

# minio ์‹คํ–‰
chmod +x minio
MINIO_ROOT_USER=admin MINIO_ROOT_PASSWORD=password ./minio server ./minio-dir --console-address ":9001"

์ด๋ ‡๊ฒŒ ์‹คํ–‰์‹œํ‚ค๋ฉด ๋กœ์ปฌ์—์„œ ๋ธŒ๋ผ์šฐ์ €๋กœ ์ ‘์†ํ•  ์ˆ˜ ์žˆ๋‹ค. (http://127.0.0.1:9001)

 

Redis

Redis๋Š” ๊ฐ€์žฅ ๋Œ€์ค‘์ ์ธ NoSQL๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์ด์ž ์ธ๋ฉ”๋ชจ๋ฆฌ ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ์ด๋‹ค. 
์ƒค๋”ฉ์œผ๋กœ ํด๋Ÿฌ์Šคํ„ฐ ๊ตฌ์„ฑ์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ, ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์šด์˜๋˜๋ฏ€๋กœ ๋””์Šคํฌ์— ๋น„ํ•ด ์ˆ˜์‹ญ ๋ฐฐ ๋น ๋ฅธ ์„ฑ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.
LGTM์Šคํƒ์—์„œ Redis๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ณ ์„ฑ๋Šฅ ์บ์‹œ๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค. (์ฟผ๋ฆฌ ์ฒ˜๋ฆฌ ์†๋„ ๊ฐœ์„ )

  ๐Ÿ‘‡๐Ÿ‘‡ ๋”๋ณด๊ธฐ๋กœ Redis(+Redis ํˆด) ๋กœ์ปฌ ์„ค์น˜๋ฐฉ๋ฒ• ํ™•์ธํ•˜๊ธฐ

๋”๋ณด๊ธฐ

[Redis ๋กœ์ปฌ ์‹คํ–‰ ๋ฐฉ๋ฒ•]

์ฐธ๊ณ ๋งํฌ:https://redis.io/docs/install/install-redis/install-redis-on-mac-os/

# mac์— ์„ค์น˜
brew install redis

# redis ์‹คํ–‰
brew services start redis

# redis ์ •๋ณด ํ™•์ธ
brew services info redis

# redis cli 
redis-cli

Redis๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ํˆด๋“ค์ด ์—ฌ๊ธฐ(https://redis.io/resources/tools/)์— ์†Œ๊ฐœ๋˜์–ด์žˆ๋‹ค.
์ด ์ฑ…์—์„œ๋Š” redis-commander(Redis ์›น์ธํ„ฐํŽ˜์ด์Šค)๋ฅผ ์‚ฌ์šฉํ•˜๋‹ˆ, ๋กœ์ปฌ์— ํ•œ๋ฒˆ ์„ค์น˜ํ•ด๋ณด์ž

# nodejs๊ฐ€ ์„ค์น˜๋˜์–ด์žˆ๋‹ค๋ฉด ์•„๋ž˜ ๋ช…๋ น์–ด๋กœ ๋ฐ”๋กœ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ๋‹ค.
npm install -g redis-commander

# ์‹คํ–‰
redis-commander

# ์ง€์šธ๋•
# npm uninstall -g redis-commander

์„ค์น˜ํ•˜๊ณ ๋‚˜๋ฉด ๋กœ์ปฌ์—์„œ http://127.0.0.1:8081/ ์—ฌ๊ธฐ๋กœ ์ ‘์†ํ•˜๋ฉด ๋œ๋‹ค.

 

Memcached

Memcached๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ  NoSQL๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์ด์ž ์ธ๋ฉ”๋ชจ๋ฆฌ ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ์ด๋‹ค. (ํ™ˆํŽ˜์ด์ง€)
Memcached๋Š” ๋ฉ€ํ‹ฐ์“ฐ๋ ˆ๋“œ๋ฅผ ์ง€์›ํ•˜๋Š” ์žฅ์ ์ด ์žˆ์œผ๋ฉฐ, LGTM์Šคํƒ์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ  Memcached๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. 
ํ•˜์ง€๋งŒ ์ด ์ฑ…์—์„œ๋Š” ๋‹ค์–‘ํ•œ ๊ตฌ์„ฑ์„ ์†Œ๊ฐœํ•˜๊ณ ์ž(?) Redis ์œ„์ฃผ๋กœ ์‹ค์Šต์„ ์ง„ํ–‰ํ•œ๋‹ค.

ํ•ญ๋ชฉ Memcached Redis
๋ฐ์ดํ„ฐ ๋ถ„ํ•  ์ง€์› (ClientSide Sharding) ์ง€์› (ServerSide Sharding)
๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ์ง€์› ๋ฏธ์ง€์› (string) ์ง€์› (string, hash, list ๋“ฑ)
์Šค๋ ˆ๋“œ ๋ชจ๋ธ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ์‹ฑ๊ธ€์Šค๋ ˆ๋“œ
๋ฐ์ดํ„ฐ ์ €์žฅ ๋ฏธ์ง€์› ์ง€์›
๋ฐ์ดํ„ฐ ๋ณต์ œ ๋ฏธ์ง€์› ์ง€์› (Master-Slave ๋ณต์ œ)
ํŠธ๋žœ์ ์…˜ ์ง€์› ๋ฏธ์ง€์› ์ง€์›
Pub/Sub ๋ฏธ์ง€์› ์ง€์›

 

Consul

HashiCorp์—์„œ ๊ด€๋ฆฌํ•˜๋Š” ์˜คํ”ˆ์†Œ์Šค ์„œ๋น„์Šค ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ์ด๋‹ค.
LGTM์€ ๋‹จ๋…์„œ๋ฒ„๊ฐ€ ์•„๋‹ˆ๋ฉฐ ํด๋Ÿฌ์Šคํ„ฐ๋‚ด ๋‹ค์ˆ˜์˜ ์„œ๋ฒ„๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.
๊ทธ๋Ÿฌ๋ฏ€๋กœ ๋„คํŠธ์›Œํฌ ๊ตฌ์„ฑ ๋ฐ ์ •๋ณด ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š”๊ฒƒ์ด Consul์ด๋‹ค.

๊ณผ๊ฑฐ์—๋Š” ์ฃผํ‚คํผ๋ฅผ ์‚ฌ์šฉํ–ˆ์œผ๋‚˜, ์ตœ๊ทผ์—๋Š” Consul์„ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ํ•œ๋‹ค.

LGTM ์Šคํƒ์—์„œ๋Š” ํ‚ค-๊ฐ’ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด Etcd, Memberlist, Consul ์„ธ๊ฐ€์ง€ ์˜คํ”ˆ์†Œ์Šค๋ฅผ ์ง€์›ํ•œ๋‹ค.
๊ธฐ๋ณธ์ ์œผ๋กœ๋Š” Memberlist๋ฅผ ๊ธฐ๋ณธ์ ์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค. 

๋‹ค๋งŒ, ์ด ์ฑ…์—์„œ๋Š” Consul์„ ์‚ฌ์šฉํ•˜์—ฌ ์‹ค์Šต์„ ์ง„ํ–‰ํ•œ๋‹ค.

Consul์ด ์–ด๋–ป๊ฒŒ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š”๊ฑด์ง€ ์•Œ์•„๋ณด๋‹ˆ ๋™์ž‘ํ•˜๋Š” ๋ฐฉ์‹ ๊ฐ ์„œ๋ฒ„์— Consul ์—์ด์ „ํŠธ๋ฅผ ์„ค์น˜ํ•˜๊ณ , ๋ชจ๋“  ์—์ด์ „ํŠธ๊ฐ€ Consul ์„œ๋ฒ„ ๋˜๋Š” ์„œ๋ฒ„ ํด๋Ÿฌ์Šคํ„ฐ์™€ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •ํ•˜๋Š”๊ฒƒ ์ด๋‹ค.

์˜ˆ๋ฅผ๋“ค์–ด 5๊ฐœ์˜ hadoop cluster๊ฐ€ ec2์— ์„ค์น˜๋˜์–ด์žˆ๋‹ค๊ณ  ํ•œ๋‹ค๋ฉด, ๊ฐ ec2์„œ๋ฒ„์— consul client๋ฅผ ์„ค์น˜ํ•˜๊ณ , 
consul์„œ๋ฒ„์— ๋“ฑ๋กํ•œ๋‹ค.(consul ์„œ๋ฒ„๋Š” 3~5๊ฐœ ์‚ฌ์šฉํ•˜๋„๋ก ๊ถŒ์žฅ)

# ์ฐธ๊ณ : https://www.atlantic.net/vps-hosting/how-to-install-consul-server-on-ubuntu/
# Consul Server ๊ตฌ์„ฑ
vi /etc/consul.d/config.json
---------------------------------
{
  "server": true,
  "node_name": "consul-server-1",
  "data_dir": "/var/consul",
  "bind_addr": "0.0.0.0",
  "client_addr": "0.0.0.0",
  "bootstrap_expect": 1,
  "ui": true
}
---------------------------------
consul agent -config-dir=/etc/consul.d/ -server -bootstrap-expect=1 -ui


# ๊ฐ ์„œ๋ฒ„์—์„œ ์„œ๋น„์Šค ์ •์˜ ํŒŒ์ผ๋กœ Consul Agent ์‹คํ–‰
vi consul-hadoop.json
---------------------------------
{
  "service": {
    "name": "hadoop",
    "tags": ["hadoop-cluster"],
    "address": "localhost",
    "port": 8020,
    "checks": [
      {
        "id": "hadoop-hdfs",
        "name": "HDFS Check",
        "tcp": "localhost:8020",
        "interval": "10s",
        "timeout": "1s"
      }
    ]
  }
}

---------------------------------

consul agent -config-dir=/etc/consul.d/ -join=consul.server.com

๋‹ค๋งŒ, ์ด๊ฑด ์ „ํ†ต์ ์ธ ๋ฐฉ์‹(๋ฌผ๋ฆฌ์„œ๋ฒ„, VM..)์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๊ณ ,
Kubernetesํ™˜๊ฒฝ์—์„œ๋Š” ์„œ๋ฒ„์— ๋“ฑ๋กํ•˜๊ณ  ๋ญ๊ณ  ํ• ๊ฒƒ์—†์ด ๊ทธ๋ƒฅ ๋“ฑ๋ก๋˜๋Š”๊ฒƒ ๊ฐ™๋‹ค.
์–ด๋–ป๊ฒŒ ๋™์ž‘๋˜๋Š”๊ฑด์ง€ ์•„์ง ๋‹ค ์ดํ•ด๋Š” ๋ชปํ•˜๊ฒ ๋‹ค.

 ๐Ÿ‘‡๐Ÿ‘‡ ๋”๋ณด๊ธฐ๋กœ Consul ๋กœ์ปฌ ์„ค์น˜๋ฐฉ๋ฒ• ํ™•์ธํ•˜๊ธฐ

๋”๋ณด๊ธฐ

[Consul ๋กœ์ปฌ ์‹คํ–‰ ๋ฐฉ๋ฒ•]

# consul์„ค์น˜ 
# ์ฐธ๊ณ : https://github.com/hashicorp/consul.git

brew tap hashicorp/tap
brew install hashicorp/tap/consul

# consul ์‹œ์ž‘
consul agent -dev -ui

์„ค์น˜ ํ›„ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๊ณ  http://127.0.0.1:8500/ ์— ์ ‘์†ํ•˜๋ฉด ์›น์— ์ ‘์†ํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

Kafka

์ด ์ฑ… ์—์„œ๋Š” Kafka๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹ค์Šต์„ ํ•˜์ง€ ์•Š์ง€๋งŒ, ๋กœ๊ทธ ์ˆ˜์ง‘์— ์‚ฌ์šฉ๋˜๋Š” Promtail, Fluentbit๋Š” ๋กœํ‚ค์— ์ง์ ‘์ ์œผ๋กœ ํŒŒ์ดํ”„๋ผ์ธ์„ ์ƒ์„ฑํ•˜๋Š”๊ฒƒ๋ณด๋‹ค ์ค‘๊ฐ„์— ์นดํ”„์นด๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๊ฒƒ์„ ๊ถŒ์žฅํ•œ๋‹ค๊ณ  ํ•œ๋‹ค.
์นดํ”„์นด ์ปค๋„ฅํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ์ •์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๊ณ , ์•ˆ์ •์ ์ธ LGTM ์Šคํƒ ๊ตฌ์ถ•์„ ์œ„ํ•ด์„œ๋Š” ์นดํ”„์นด๊ฐ€ ํ•„์ˆ˜๋ผ๊ณ  ํ•œ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ, ์•ˆํƒ€๊น๊ฒŒ๋„ ์šฐ๋ฆฌ์˜ Loki ์•ž์—๋Š” Kafka๊ฐ€ ์—†๋‹ค. Lokiํ˜ผ์ž ์“ธ์“ธํ•˜๊ฒŒ ๋ถ€ํ•˜๋ฅผ ํ˜ธ๋˜๊ฒŒ ๋‘๋“ค๊ฒจ ๋งž๊ณ  ์žˆ์—ˆ๋‹ค. ๐Ÿ˜ฐ
์ฝ๊ธฐ ์บ์‹ฑ์„ ์œ„ํ•œ Memcached/Redis๋„ ์—†๊ณ  ์“ฐ๊ธฐ๋ฅผ ์œ„ํ•œ Kafka๋„ ์—†๋‹ค.
๋‚ด๊ฐ€ ์•Œ๊ธฐ๋ก  Kafka๋Š” ๊ทธ ์ž์ฒด๋กœ ์šด์˜ ๋น„์šฉ์ด ๋งค์šฐ ํฌ๋‹ค๊ณ  ์•Œ๊ณ ์žˆ๋Š”๋ฐ(๋Ÿฌ๋‹์ปค๋ธŒ๋„ ํฌ๊ณ , ํด๋Ÿฌ์Šคํ„ฐ ์šด์˜์— ๋น„์šฉ์ด ๋งŽ์ด๋“ ๋‹ค๊ณ  ์•Œ๊ณ ์žˆ๋‹ค.), ์ถ”์ฒœํ•˜๋Š” ์ด์œ ๊ฐ€ ์žˆ์„ํ…Œ๋‹ˆ ๋‚˜์ค‘์— ์•Œ์•„๋ณด์ž ๐Ÿง

 

4.2 ๋กœํ‚ค ๋กœ๊ทธ ๊ด€๋ฆฌ

 

4.2.1. ๋กœํ‚ค ๊ธฐ๋Šฅ

Loki๋Š” ์—ฌ๋Ÿฌ clients์—์„œ ๋กœ๊ทธ๋ฅผ ์ˆ˜์ง‘ํ•˜๊ณ , ๋ฐฑ์—”๋“œ ์Šคํ† ๋ฆฌ์ง€์— ์ €์žฅํ•˜๊ณ , ์ €์žฅ๋œ ๋กœ๊ทธ๋ฅผ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋กœ๊ทธ ์ง‘๊ณ„์‹œ์Šคํ…œ์ด๋‹ค.

๋ฐฐํฌ๋ชจ๋“œ

Loki๋Š” ์—ฌ๋Ÿฌ ๋ฐฐํฌ ๋ชจ๋“œ๋ฅผ ์ œ๊ณตํ•œ๋‹ค. [์ฐธ๊ณ ]

  • ๋ชจ๋†€๋ฆฌ์‹ ๋ฐฐํฌ ๋ชจ๋“œ monolithic deployment mode
    • Loki์˜ ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ(Ingester, Distributor, Querier ๋“ฑ)๋ฅผ ๋‹จ์ผ ํ”„๋กœ์„ธ์Šค์—์„œ ์‹คํ–‰์‹œํ‚จ๋‹ค.
    • ์ด ๋ชจ๋“œ๋Š” ์„ค์ •์ด ๊ฐ„๋‹จํ•˜์—ฌ, ์ž‘์€ ๊ทœ๋ชจ์˜ ํ™˜๊ฒฝ์ด๋‚˜ ์ดˆ๊ธฐ ํ…Œ์ŠคํŠธ์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.
    • ํ•˜๋ฃจ ์ตœ๋Œ€ ์•ฝ 20GB์˜ ์ž‘์€ ์ฝ๊ธฐ/์“ฐ๊ธฐ์— ์ ๋‹นํ•˜๋‹ค.
  • ๋‹จ์ˆœ ํ™•์žฅ ๊ฐ€๋Šฅ ๋ฐฐํฌ ๋ชจ๋“œ simple scalable deployment mode
    • ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๋กœ ๋‚˜๋‰˜์–ด ๊ฐ๊ฐ์˜ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋™์ž‘ํ•˜๋ฉฐ, Loki์˜ ํ™•์žฅ์„ฑ์„ ์œ ์ง€ํ•˜๋ฉด์„œ๋„ ๊ด€๋ฆฌ๋ณต์žก๋„๋ฅผ ๋‚ฎ์ถ˜ ๋ชจ๋“œ์ด๋‹ค.
    • ํฌ๊ฒŒ ์“ฐ๊ธฐ/์ฝ๊ธฐ/๋ฐฑ์—”๋“œ๋กœ ๋‚˜๋ˆˆ๋‹ค.
      ์“ฐ๊ธฐ - Ingester/Distributor
      ์ฝ๊ธฐ  - Query-frontend/Querier
      ๋ฐฑ์—”๋“œ - Compactor/Ruler/Index-Gateway/Query-scheduler
    • ํ•˜๋ฃจ์— ์ตœ๋Œ€ ๋ช‡ TB์˜ ์ฝ๊ธฐ/์“ฐ๊ธฐ์— ์ ๋‹นํ•˜๋‹ค.
  • microservices deployment mode
    • ๊ฐ๊ฐ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋…๋ฆฝ๋œ ํ”„๋กœ์„ธ์Šค๋กœ ์‹คํ–‰ํ•˜์—ฌ ๋†’์€ ํ™•์žฅ์„ฑ๊ณผ ์œ ์—ฐ์„ฑ์„ ์ œ๊ณตํ•˜๋Š” ๋ชจ๋“œ์ด๋‹ค.
    • Loki๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์„ค์ • ๋ฐ ์œ ์ง€๊ด€๋ฆฌ๊ฐ€ ๋ณต์žกํ•ด์ง„๋‹ค.
    • ๋งค์šฐ ํฐ Lokiํด๋Ÿฌ์Šคํ„ฐ๋‚˜ ์ •ํ™•ํ•œ ์ œ์–ด๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ์— ๊ถŒ์žฅ๋œ๋‹ค.

 

์–ด๋–ค ๋ชจ๋“œ์—์„œ๋ผ๋„ Loki ๋ฐ์ดํ„ฐ ํ๋ฆ„์ฒ˜๋Ÿผ ๋ฐ์ดํ„ฐ๊ฐ€ ์“ฐ์ด๊ณ  ์ฝํžŒ๋‹ค.
์ด๋•Œ ์ค‘์š”ํ•˜๊ฒŒ ๋ด์•ผํ•  ๋ถ€๋ถ„์„ ํ™•์ธํ•ด๋ณด์ž.

Loki ๋ฐ์ดํ„ฐ ํ๋ฆ„

  • Distributor๋Š” ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ๋กœ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์‹ ํ•˜๊ณ , ์ด๋ฅผ ์—ฌ๋Ÿฌ Ingester ์ธ์Šคํ„ด์Šค์— ๋ถ„์‚ฐ์‹œํ‚ค๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.
    ์ด๋•Œ ๋ฐ์ดํ„ฐ์˜ ์ผ๊ด€์„ฑ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด Replication_foctor ๊ฐœ์ˆ˜(๋ณต์ œ์ˆ˜)์„ค์ •์„ ์ฐธ๊ณ ํ•˜์—ฌ ๋กœ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ์—ฌ๋Ÿฌ Ingester์— ์ „๋‹ฌํ•œ๋‹ค. 
    Ingester์—๊ฒŒ ์ „๋‹ฌํ•˜๋Š” ๋ฐ์ดํ„ฐ๋Š” ์ผ๊ด€๋œ ํ•ด์‹ฑ(Consistent Hashing)์„ ํ†ตํ•ด ๋ถ„์‚ฐํ•˜์—ฌ ์ „๋‹ฌํ•œ๋‹ค. (๋กœ๋“œ๋ฒจ๋Ÿฐ์‹ฑ)
  • Ingester๋Š” WAL(Write ahead Logging)์„ ์‚ฌ์šฉํ•˜์—ฌ ์žฅ์• ๋ฐœ์ƒ์„ ๋Œ€์ฒ˜ํ•œ๋‹ค.
    • ์ด ์ฑ…์—์„œ๋Š” `๊ฐ ์ƒค๋“œ๊ฐ„์—๋Š” ๊ฐ€์‹ญ์„ ์‚ฌ์šฉํ•ด์„œ ํ—ฌ์Šค์ฒดํฌ๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.` ๋ผ๊ณ  ์„ค๋ช…ํ–ˆ์ง€๋งŒ, ์–ด๋–ค ์ƒค๋“œ๋ฅผ ์–ด๋–ป๊ฒŒ ๊ฐ€์‹ญํ”„๋กœํ† ์ฝœ๋กœ ํ—ฌ์Šค์ฒดํฌ๋ฅผ ํ•œ๋‹ค๋Š”๊ฑด์ง€ ์ดํ•ดํ•˜์ง€ ๋ชปํ–ˆ๋‹ค.
  • ์ฝ๊ธฐ ์š”์ฒญ์„ ๋ฐ›์€ Querier๋Š” ์บ์‹œ, Ingester, WAL ๋ฉ”๋ชจ๋ฆฌ, ๋ธ”๋ก์Šคํ† ๋ฆฌ์ง€ ์ˆœ์œผ๋กœ ๊ฒฐ๊ณผ๋ฅผ ์กฐํšŒํ•œ๋‹ค.

 

์ฃผ์š” ์ปดํฌ๋„ŒํŠธ 1.  ๋””์ŠคํŠธ๋ฆฌ๋ทฐํ„ฐ Distributor(์ƒํƒœ๋น„์ €์žฅ ์ปดํฌ๋„ŒํŠธ)

์ฐธ๊ณ ๋งํฌ: https://grafana.com/docs/loki/latest/get-started/components/#distributor (๋‚ด์šฉ์ด ์™„์ „ ๋˜‘๊ฐ™์Œ๐Ÿซจ)

Distributor๋Š” ๋“ค์–ด์˜ค๋Š” ๋กœ๊ทธ ์ŠคํŠธ๋ฆผ์„ ์ˆ˜์‹ ํ•˜๊ณ , Ingester์— ์ „๋‹ฌํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. 
๋™์ž‘ํ•˜๋Š” ์ˆœ์„œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

  1. ์œ ํšจ์„ฑ ๊ฒ€์ฆ:
    • ์ˆ˜์‹ ๋œ ๋กœ๊ทธ ๋ฐ์ดํ„ฐ๊ฐ€ Loki์˜ ์‚ฌ์–‘๊ณผ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.
    • ์œ ํšจํ•œ ๋ ˆ์ด๋ธ”์ธ์ง€, ํƒ€์ž„์Šคํƒฌํ”„๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ์ง€, ๋กœ๊ทธ ์ค„์ด ๋„ˆ๋ฌด ๊ธธ์ง€ ์•Š์€์ง€ ๋ฐ์ดํ„ฐ๊ฐ€ ์ฒ˜๋ฆฌ ํŒŒ์ดํ”„๋ผ์ธ์œผ๋กœ ์ง„ํ–‰๋˜๊ธฐ ์ „์— ๊ธฐ๋ณธ์ ์ธ ๊ฒ€์ฆ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.
    • ํ…Œ๋„ŒํŠธ๋‹น ์ตœ๋Œ€ ๋น„ํŠธ ์ „์†ก๋ฅ (Maximum per-tenent bitrate)๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ˆ˜์‹  ๋กœ๊ทธ์˜ ์†๋„๋ฅผ ์ œํ•œํ•œ๋‹ค.
      ์˜ˆ๋ฅผ๋“ค์–ด A ํ…Œ๋„ŒํŠธ์˜ ์†๋„์ œํ•œ์ด 10MB/s๋ผ๋ฉด, ๋””์ŠคํŠธ๋ฆฌ๋ทฐํ„ฐ๊ฐ€ 5๊ฐœ์ผ๋• ๊ฐ 2MB/s๋ฅผ, ๋””์ŠคํŠธ๋ฆฌ๋ทฐํ„ฐ๊ฐ€ 10๊ฐœ์ผ๋• ๊ฐ 1MB/s๋ฅผ ์ฒ˜๋ฆฌํ•˜๋„๋ก ํ•œ๋‹ค.์ด๋Ÿฐ ๋น„์œจ ์ œํ•œ(rate limiting)์„ ํ†ตํ•ด ๋กœํ‚ค ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค. (DDos๋กœ ๋ถ€ํ„ฐ์˜ ๋ณดํ˜ธ) 
  2. ํ•ด์‹œ ๋ง์„ ํ†ตํ•œ ์ธ์ œ์Šคํ„ฐ ์„ ํƒ [์ฐธ๊ณ  Loki ํ•ด์‹œ ๋ง]:
    • ๋กœ๊ทธ ๋ฐ์ดํ„ฐ๋Š” ํ•˜๋‚˜ ์ด์ƒ์˜ ๋ ˆ์ด๋ธ”(label) ์„ธํŠธ๋กœ ๊ตฌ์„ฑ๋œ ์ŠคํŠธ๋ฆผ(stream)์ด๋ฉฐ, ์ด ๋ ˆ์ด๋ธ” ์„ธํŠธ์˜ ํ•ด์‹œ๊ฐ’์„ ๊ณ„์‚ฐํ•˜์—ฌ ์–ด๋Š Ingester๊ฐ€ ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ• ์ง€ ๊ฒฐ์ •ํ•œ๋‹ค.
    • ํ•ด์‹œ ๋ง(Consistent Hashing Ring)์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ Ingester์— ๋ถ„์‚ฐํ•œ๋‹ค. 
      ๋ ˆ์ด๋ธ” ์„ธํŠธ์˜ ํ•ด์‹œ๊ฐ’์ด ํ•ด์‹œ๋ง์—์„œ ํŠน์ • ์œ„์น˜๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ , ์ด ์œ„์น˜๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋‚˜ ์ด์ƒ์˜ Ingester๊ฐ€ ์„ ํƒ๋œ๋‹ค.
    • ์ตœ๊ทผ ๋ฒ„์ „์˜ Loki๋Š” Memberlist๋ฅผ ํ†ตํ•ด ํ•ด์‹œ๋ง์„ ๊ตฌํ˜„ํ•˜์ง€๋งŒ, ์ด ์ฑ…์—์„œ๋Š” Consul์„ ํ†ตํ•ด ์‹ค์Šตํ•˜๊ณ  ๊ฐœ๋…์„ ์„ค๋ช…ํ•œ๋‹ค. 
  3. ๋ ˆํ”Œ๋ฆฌ์ผ€์ด์…˜ ํŒฉํ„ฐ์™€ ๋ฐ์ดํ„ฐ ๋ณต์ œ: 
    • ์ด ๋ถ€๋ถ„์€ 2์žฅ, ๋ฐ์ดํ„ฐ ๋‹ค์ค‘ํ™” ๋ถ€๋ถ„์—์„œ ๋‹ค๋ฃฌ์ ์ด ์žˆ๋Š”๋ฐ, ๋ฐ์ดํ„ฐ์˜ ๊ฐ€์šฉ์„ฑ๊ณผ ๋‚ด๊ตฌ์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด ์ค‘์š”ํ•œ ์„ค์ •์ด๋‹ค.
      ๋ฐ์ดํ„ฐ ์†์‹ค ๊ฐ€๋Šฅ์„ฑ์„ ์ค„์ด๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉํ•˜๋ฉฐ, ๋ณต์ œ๋ฅผ ํ†ตํ•ด ๋กค์•„์›ƒ(์„œ๋น„์Šค ์žฌ๋ฐฐํฌ, ์—…๋ฐ์ดํŠธ), ์žฌ์‹œ์ž‘ ์ค‘์—์„œ๋„ ๋ฐ์ดํ„ฐ์˜ ์†์‹ค์—†์ด ์ž‘์—…์„ ๊ณ„์† ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ๋ ˆํ”Œ๋ฆฌ์ผ€์ด์…˜ ํŒฉํ„ฐ ์„ค์ •์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๊ฐ€ ๋ช‡๊ฐœ์˜ Ingester์— ๋ณต์ œ๋ ์ง€ ๊ฒฐ์ •๋˜๋ฉฐ, ๋ ˆํ”Œ๋ ˆ์ผ€์ด์…˜ ํŒฉํ„ฐ๊ฐ€ 3 ์ด๋ผ๋ฉด, ํ•ด์‹œ๋ง์„ ํ†ตํ•ด ์„ ํƒ๋œ Ingester์™€ ์ด์›ƒํ•˜๋Š” ๋‘ Ingester์— ๋™์ผํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณต์ œ๋˜์–ด ์ด 3๊ฐœ์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋œ๋‹ค.
    • Distributor ์ปดํฌ๋„ŒํŠธ๋Š” ๋กœ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์„œ ์—ฌ๋Ÿฌ Ingester ์ธ์Šคํ„ด์Šค์—๊ฒŒ ์ „๋‹ฌํ•˜๋Š”๋ฐ, ์ด๋•Œ ์„ค์ •๋œ ๋ ˆํ”Œ๋ฆฌ์ผ€์ด์…˜ ํŒฉํ„ฐ์— ๋”ฐ๋ผ(๊ธฐ๋ณธ๊ฐ’ 3) ๋™์ผํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์—ฌ๋Ÿฌ Ingester์— ๋ณต์ œํ•œ๋‹ค. 
  4. ๋™์ผํ•œ ๋ฐ์ดํ„ฐ์˜ ์“ฐ๊ธฐ ์‹œ๋„ (ํฌ์›Œ๋”ฉ): 
    • ํ•ด์‹œ๋ง์„ ํ†ตํ•ด ์„ ํƒ๋œ Ingester์—๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•œ๋‹ค.
    • Distributor๋Š” ํ•ด์‹œ ๋ง๊ณผ ๋ ˆํ”Œ๋ฆฌ์ผ€์ด์…˜ ํŒฉํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฒฐ์ •๋œ ๋ชจ๋“  Ingester์— ๋™์ผํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•œ๋‹ค. ์ด๋•Œ, ์“ฐ๊ธฐ ์ฟผ๋Ÿผ์€ floor(replication_factor / 2) + 1 ์œผ๋กœ ์ •์˜ํ•œ๋‹ค.
      ๋ ˆํ”Œ๋ฆฌ์ผ€์ด์…˜ํŒฉํ„ฐ๊ฐ€ 3์ด๋ผ๋ฉด ์“ฐ๊ธฐ ์„ฑ๊ณต์„ ์œ„ํ•ด์„œ๋Š” ์ตœ์†Œ 2๊ฐœ์˜ Ingester๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์•ผ ํ•œ๋‹ค.
      ์ด๋•Œ ๋งŒ์•ฝ 2๊ฐœ ๋ฏธ๋งŒ์˜ ์“ฐ๊ธฐ ์ž‘์—…๋งŒ ์„ฑ๊ณตํ•œ๋‹ค๋ฉด, Distributor๋Š” ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์“ฐ๊ธฐ์ž‘์—…์„ ๋‹ค์‹œ ์‹œ๋„ํ•œ๋‹ค.

 

์ฃผ์š” ์ปดํฌ๋„ŒํŠธ 2. ์ธ์ œ์Šคํ„ฐ Ingester

์ฐธ๊ณ ๋งํฌ: https://grafana.com/docs/loki/latest/get-started/components/#ingester (๋‚ด์šฉ์ด ์™„์ „ ๋˜‘๊ฐ™์Œ๐Ÿซจ)

Ingester๋Š” ์žฅ๊ธฐ์ €์žฅ์†Œ(S3๋“ฑ)์— ๋กœ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ์“ฐ๊ณ , ์ฝ๊ธฐ ๊ฒฝ๋กœ์˜ ๋ฉ”๋ชจ๋ฆฌ ๋‚ด ์ฟผ๋ฆฌ์˜ ๋กœ๊ทธ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.
Ingester๊ฐ€ ๋กœ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์‹ , ์ฒ˜๋ฆฌ ๋ฐ ์ €์žฅํ•˜๋Š” ํ•ต์‹ฌ ์—ญํ• ์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— Ingester ์ปดํฌ๋„ŒํŠธ์˜ ์ˆ˜๋ช…์ฃผ๊ธฐ(lifecycler)๊ฐ€ ์ค‘์š”ํ•˜๋‹ค.

  • Ingester์˜ ์ˆ˜๋ช…์ฃผ๊ธฐ
    • PENDING: Leaving์ƒํƒœ์ธ ๋‹ค๋ฅธ ์ธ์ œ์Šคํ„ฐ์˜ ํ•ธ๋“œ์˜คํ”„๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š”์ƒํƒœ
    • JOINING:  ํ˜„์žฌ ํ† ํฐ์„ ๋ง์— ์‚ฝ์ž…ํ•˜๊ณ  ์ดˆ๊ธฐํ™” ์ค‘์ธ ์ƒํƒœ, ์†Œ์œ ํ•œ ํ† ํฐ์— ๋Œ€ํ•œ ์“ฐ๊ธฐ ์š”์ฒญ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์Œ
    • ACTIVE:  ์™„์ „ํžˆ ์ดˆ๊ธฐํ™”๋œ ์ƒํƒœ์˜ ์ธ์ œ์Šคํ„ฐ ์ƒํƒœ, ์†Œ์œ ํ•œ ํ† ํฐ์— ๋Œ€ํ•œ ์“ฐ๊ธฐ ์š”์ฒญ๊ณผ ์ฝ๊ธฐ ์š”์ฒญ์„ ๋ชจ๋‘ ๋ฐ›์„ ์ˆ˜ ์žˆ์Œ
    • LEAVING:  ์ข…๋ฃŒ ์ค‘์ธ ์ƒํƒœ, ๋ฉ”๋ชจ๋ฆฌ์— ๋‚จ์•„ ์žˆ๋Š” ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์ฝ๊ธฐ ์š”์ฒญ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์Œ
    • UNHEALTHY:  ํ•˜ํŠธ๋น„ํŠธ์— ์‹คํŒจํ•œ ์ƒํƒœ, distributor๊ฐ€ ์ฃผ๊ธฐ์ ์œผ๋กœ ํ™•์ธํ•˜์—ฌ UNHEALTHY ์ƒํƒœ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Œ.

Loki Write ์ˆ˜๋ช…์ฃผ๊ธฐ ์ฐธ๊ณ  (http://<loki-server>:<port>/ring) ํ•ด์‹œ๋ง์ด ์—ฌ๊ธฐ์žˆ์—ˆ๋„ค!

Ingester๊ฐ€ ์ˆ˜์‹ ํ•˜๋Š” ๊ฐ ๋กœ๊ทธ ์ŠคํŠธ๋ฆผ์€ ๋ฉ”๋ชจ๋ฆฌ ๋‚ด ๋‹ค์ˆ˜์˜ ์ฒญํฌ์„ธํŠธ๋กœ ๊ตฌ์„ฑ๋˜๊ณ , ๊ตฌ์„ฑ๊ฐ€๋Šฅํ•œ ์ฃผ๊ธฐ๋กœ ๋ฐฑ์—… ์Šคํ† ๋ฆฌ์ง€ ๋ฐฑ์—”๋“œ์— ํ”Œ๋Ÿฌ์‹œ ๋œ๋‹ค.
์ฆ‰, ์•„๋ž˜ ์„ธ๊ฐ€์ง€ ๊ฒฝ์šฐ์— Ingester์— ์žˆ๋˜ ์ฒญํฌ๊ฐ€ ์˜๊ตฌ์Šคํ† ๋ฆฌ์ง€ (s3)์— ์ €์žฅ๋œ๋‹ค.

  • ํ˜„์žฌ ์ฒญํฌ๊ฐ€ ์šฉ๋Ÿ‰(๊ตฌ์„ฑ ๊ฐ€๋Šฅํ•œ ๊ฐ’)์— ๋„๋‹ฌํ–ˆ์„ ๋•Œ
  • ํ˜„์žฌ ์ฒญํฌ๊ฐ€ ์—…๋ฐ์ดํŠธ ๋˜์ง€ ์•Š์€ ์ฑ„๋กœ ๋งŽ์€ ์‹œ๊ฐ„์ด ๊ฒฝ๊ณผํ–ˆ์„ ๋•Œ
  • ํ”Œ๋Ÿฌ์‹œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ

๋กœ๊ทธ ๋ฐ์ดํ„ฐ๋Š” "์ฒญํฌ(chunk)"๋ผ๊ณ  ํ•˜๋Š” ๋ฐ์ดํ„ฐ ๋ธ”๋ก์— ์ €์žฅ๋˜๊ณ  ์‹œ๊ฐ„์ด ์ง€๋‚˜๊ฑฐ๋‚˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์Œ“์ด๋ฉด ๋ฐฑ์—… ์Šคํ† ๋ฆฌ์ง€(S3)๋กœ Flush(์ €์žฅ)๋˜์–ด ์ฝ๊ธฐ ์ „์šฉ์œผ๋กœ ํ‘œ์‹œ๋œ๋‹ค. ๋ฐฑ์—… ์Šคํ† ๋ฆฌ์ง€๋กœ Flush๋˜๊ธฐ ์œ„ํ•ด ์ฒญํฌ๊ฐ€ ์ฝ๊ธฐ ์ „์šฉ์œผ๋กœ ์„ค์ •๋˜๋ฉด, ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฅผ ๊ณ„์† ์ˆ˜์‹ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ƒˆ๋กœ์šด ์“ฐ๊ธฐ ๊ฐ€๋Šฅํ•œ ์ฒญํฌ๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค.
์ฒญํฌ๊ฐ€ ์˜๊ตฌ์ €์žฅ์†Œ๋กœ ํ”Œ๋Ÿฌ์‹œ ๋ ๋•Œ, ํ•ด๋‹น ์ฒญํฌ๋Š” ํ…Œ๋„ŒํŠธ, ๋ ˆ์ด๋ธ”, ์ฝ˜ํ…์ธ (์‹ค์ œ๋กœ๊ทธ) ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ด์‹ฑ๋˜์–ด ๋™์ผํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง„ ์—ฌ๋Ÿฌ ์ธ์ œ์Šคํ„ฐ๊ฐ€ ๋™์ผํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์˜๊ตฌ ์ €์žฅ์†Œ์— ๋‘๋ฒˆ ์“ฐ์ง€ ์•Š๋Š”๋‹ค.

Ingester์—์„œ ์ค‘์š”ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ ๋ช‡๊ฐ€์ง€๋ฅผ ๋” ํ™•์ธํ•ด๋ณด์ž.

  • Timestamp Ordering
    • ๋กœํ‚ค๋Š” ๋น„์ˆœ์ฐจ์ ์“ฐ๊ธฐ(out-of-order writes)๋ฅผ ๊ธฐ๋ณธ์ ์œผ๋กœ ํ—ˆ์šฉํ•œ๋‹ค.
    • ๋น„์ˆœ์ฐจ์ ์“ฐ๊ธฐ๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ,
      Ingester๋Š” ์ˆ˜์ง‘๋œ ๋กœ๊ทธ ์ค„์ด ์ˆœ์„œ๋Œ€๋กœ ๋˜์–ด์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ , ์ˆœ์„œ๋ฅผ ๋”ฐ๋ฅด์ง€ ์•Š๋Š”๋‹ค๋ฉด ํ•ด๋‹น ๋ผ์ธ์€ ๊ฑฐ๋ถ€๋˜๊ณ  ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
      ํŠน์ • ์ŠคํŠธ๋ฆผ(๋ ˆ์ด๋ธ”์˜ ๊ณ ์œ ํ•œ ์กฐํ•ฉ)์œผ๋กœ ๋“ค์–ด์˜จ ๋กœ๊ทธ ๋ฐ์ดํ„ฐ๋Š” ํ•ญ์ƒ ์ด์ „์— ์ˆ˜์‹ ๋œ ๋ผ์ธ๋ณด๋‹ค ์ตœ์‹  ํƒ€์ž„์Šคํƒฌํ”„๋ฅผ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค.
      ๋งŒ์•ฝ ์ž…๋ ฅ๋œ ๋ผ์ธ์ด ์ด์ „์— ์ˆ˜์‹ ๋œ ๋ผ์ธ๊ณผ ๋น„๊ตํ•ด์„œ ํƒ€์ž„์Šคํƒฌํ”„, ๋กœ๊ทธ ๋ชจ๋‘ ์ผ์น˜ํ•œ๋‹ค๋ฉด ์ค‘๋ณต๋œ๊ฒƒ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ  ๋ฌด์‹œํ•œ๋‹ค.
      ๋‹จ, ํƒ€์ž„์Šคํƒฌํ”„๋Š” ๊ฐ™์ง€๋งŒ ๋‚ด์šฉ์ด ๋‹ค๋ฅธ๊ฒฝ์šฐ์—๋Š” ํ—ˆ์šฉํ•œ๋‹ค.
  • Hand Off (Deprecated, WAL์‚ฌ์šฉ์œผ๋กœ ๋Œ€์ฒด)
    • Handoff ์ ˆ์ฐจ๋Š” ํ•œ Ingester๊ฐ€ ์ข…๋ฃŒ๋˜๊ณ  ํ•ด์‹œ ๋ง์„ ๋– ๋‚  ๋•Œ, ๊ทธ๋ฆฌ๊ณ  ์ƒˆ๋กœ์šด Ingester๊ฐ€ ํ•ด์‹œ ๋ง์— ๋“ค์–ด์˜ค๋ ค๊ณ  ํ•  ๋•Œ ๊ด€๋ จ๋œ ๋ฐ์ดํ„ฐ์™€ ํ† ํฐ์„ ์ง์ ‘ ์ „๋‹ฌํ•˜๋Š” ๊ณผ์ •์„ ๋งํ•œ๋‹ค.
    • ํ•˜์ง€๋งŒ WAL(Write-Ahead Log) ๋„์ž…์œผ๋กœ ์ธํ•ด ์ด๋Ÿฐ HandOff์ ˆ์ฐจ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š๊ฒŒ ๋˜์—ˆ๋‹ค.
  • Filesystem ์ง€์›
    • ๋กœ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ํŒŒ์ผ ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด ๊ฒฝ์šฐ BoltDB๋ผ๋Š” ์ž„๋ฒ ๋””๋“œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์„ ์ง€์›ํ•œ๋‹ค.
    • ๋‹ค๋งŒ, BoltDB๋Š” ๋™์‹œ์— ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค๋งŒ์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํŒŒ์ผ์— ๋Œ€ํ•œ ๋ฝ(Lock)์„ ํš๋“ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„๋˜์–ด์žˆ์–ด ๋‹จ์ผํ”„๋กœ์„ธ์Šค๋ชจ๋“œ์ผ๋•Œ๋งŒ BoltDB๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. (Ingester์™€ Querier ๋“ฑ ์—ฌ๋Ÿฌ ์ปดํฌ๋„ŒํŠธ๋ฅผ ํฌํ•จํ•œ ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์œผ๋กœ ์šด์˜๋  ๊ฒฝ์šฐ, ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๊ฐ™์€ BoltDB ์ธ์Šคํ„ด์Šค์— ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅ)

 

์ฃผ์š” ์ปดํฌ๋„ŒํŠธ 3.  ์ฟผ๋ฆฌ ํ”„๋ก ํŠธ์—”๋“œ Query-frontend (์ƒํƒœ๋น„์ €์žฅ ์ปดํฌ๋„ŒํŠธ / ์˜ต์…˜)

์ฐธ๊ณ ๋งํฌ: https://grafana.com/docs/loki/latest/get-started/components/#query-frontend (๋‚ด์šฉ์ด ์™„์ „ ๋˜‘๊ฐ™์Œ๐Ÿซจ)

์ฟผ๋ฆฌ ํ”„๋ŸฐํŠธ์—”๋“œ๋Š” ์ฟผ๋ฆฌ ํ”„๋ก ํŠธ์—”๋“œ๋Š” ์ฟผ๋ฆฌ์˜ ์ฒ˜๋ฆฌ ๊ณผ์ •์„ ์ตœ์ ํ™”ํ•˜๊ณ  ํ™•์žฅ์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด ๋””์ž์ธ๋œ ์ปดํฌ๋„ŒํŠธ์ด๋‹ค.
์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ์˜ ์ฟผ๋ฆฌ๋Š” Query-frontend๋กœ ์ „๋‹ฌ๋˜๋ฉฐ, Querier์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•˜์—ฌ ๋กœ๊ทธ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์ฟผ๋ฆฌ ์ฒ˜๋ฆฌ๋ฅผ ๋ณด๋‹ค ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. 

Query-frontend์—์„œ ์ค‘์š”ํ•œ ๊ธฐ๋Šฅ ๋ช‡๊ฐ€์ง€๋ฅผ ์‚ดํŽด๋ณด์ž

  • Queueing
    • querier์— ๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ(OOM) ์˜ค๋ฅ˜๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ๋Š” ๋Œ€๊ทœ๋ชจ ์ฟผ๋ฆฌ๋Š” ์‹คํŒจ ์‹œ ์žฌ์‹œ๋„ํ•˜๋„๋ก ํ•œ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋” ์ž‘์€ ์ฟผ๋ฆฌ๋ฅผ ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ์„ ์ž… ์„ ์ถœ ๋Œ€๊ธฐ์—ด(FIFO)์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“  ์ฟผ๋ฆฌ์–ด์— ๋ถ„์‚ฐ์‹œํ‚ด์œผ๋กœ์จ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋Œ€๊ทœ๋ชจ ์š”์ฒญ์ด ๋‹จ์ผ ์ฟผ๋ฆฌ์–ด์— ์ง‘์ค‘๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•œ๋‹ค.
    • ํ…Œ๋„ŒํŠธ ๊ฐ„์— ์ฟผ๋ฆฌ๋ฅผ ๊ณต์ •ํ•˜๊ฒŒ ์˜ˆ์•ฝํ•˜์—ฌ ๋‹จ์ผ ํ…Œ๋„ŒํŠธ๊ฐ€ ๋‹ค๋ฅธ ํ…Œ๋„ŒํŠธ๋ฅผ ์„œ๋น„์Šค ๊ฑฐ๋ถ€(DOS)ํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•œ๋‹ค.
  • Splitting
    • ํฐ ์ฟผ๋ฆฌ๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ž‘์€ ์ฟผ๋ฆฌ๋กœ ๋ถ„ํ• ํ•˜์—ฌ ๋‹ค์šด์ŠคํŠธ๋ฆผ ์ฟผ๋ฆฌ๋Ÿฌ์—์„œ ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰ํ•˜๊ณ  ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋‹ค์‹œ ํ•˜๋‚˜๋กœ ์—ฐ๊ฒฐํ•œ๋‹ค.
    • ๋Œ€๊ทœ๋ชจ(์ˆ˜์ผ ๋“ฑ) ์ฟผ๋ฆฌ๋กœ ์ธํ•ด ๋‹จ์ผ ์ฟผ๋ฆฌ๋Ÿฌ์—์„œ ๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ณ  ๋” ๋น ๋ฅด๊ฒŒ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ
  • Caching
    • ๋ฉ”ํŠธ๋ฆญ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ ์บ์‹ฑ์„ ์ง€์›ํ•˜์—ฌ ํ›„์† ์ฟผ๋ฆฌ์—์„œ ์žฌ์‚ฌ์šฉํ•œ๋‹ค.
    • ์บ์‹œ๋œ ๊ฒฐ๊ณผ๊ฐ€ ๋ถˆ์™„์ „ํ•œ ๊ฒฝ์šฐ ์ฟผ๋ฆฌ ํ”„๋ŸฐํŠธ์—”๋“œ๋Š” ํ•„์š”ํ•œ ํ•˜์œ„ ์ฟผ๋ฆฌ๋ฅผ ๊ณ„์‚ฐํ•˜์—ฌ ๋‹ค์šด์ŠคํŠธ๋ฆผ ์ฟผ๋ฆฌ์–ด์—์„œ ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰ํ•œ๋‹ค.
    • ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ์˜ ์บ์‹œ ๊ฐ€๋Šฅ์„ฑ(cacheability)๋ฅผ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์–‘ํ•œ ๋‚ด๋ถ€์—ฐ์‚ฐ์„ ์ฒ˜๋ฆฌํ•˜๋ฉฐ, ๊ฒฐ๊ณผ ์บ์‹œ๋Š” ๋ชจ๋“  Loki ๋ฐฑ์—”๋“œ(memcached, redis, in-memory cache)์™€ ํ˜ธํ™˜๋œ๋‹ค.
    • ๊ณง ๋ฉ”ํŠธ๋ฆญ ์ฟผ๋ฆฌ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋กœ๊ทธ ์ฟผ๋ฆฌ ์บ์‹ฑ๋„ ์ง€์›ํ•  ์˜ˆ์ •์ด๋ผ๊ณ  ํ•˜๋‹ˆ ์•„์ฃผ ๊ธฐ๋Œ€๊ฐ€ ๋œ๋‹ค.
      ๊ทธ๋Ÿฐ๋ฐ, ๋‹ค์‹œ ๋งํ•˜๋ฉด ์ฟผ๋ฆฌ๊ฐ€ ์บ์‹ฑ๋˜๋Š”๊ฑด ์•„๋‹ˆ๋ผ๋Š”๊ฑด๋ฐ.. ๋Œ€์šฉ๋Ÿ‰ ์ฟผ๋ฆฌ์—์„œ ๋ฐœ์ƒํ•˜๋Š” OOM๋Š” ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์„์ง€ ๋” ํ™•์ธํ•ด๋ด์•ผ๊ฒ ๋‹ค.
      • ๋ฉ”ํŠธ๋ฆญ์ฟผ๋ฆฌ: ์‹œ๊ณ„์—ด ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์ฟผ๋ฆฌ, ๋กœ๊ทธ ๋ฐ์ดํ„ฐ์—์„œ ์ถ”์ถœ๋œ ๋ฉ”ํŠธ๋ฆญ(์˜ˆ: ์š”์ฒญ ์ˆ˜, ์—๋Ÿฌ ๋น„์œจ, ์‹œ์Šคํ…œ์˜ ์„ฑ๋Šฅ ์ง€ํ‘œ ๋“ฑ)
      • ๋กœ๊ทธ ์ฟผ๋ฆฌ: ํ…์ŠคํŠธ ๊ธฐ๋ฐ˜์˜ ๋กœ๊ทธ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์ฟผ๋ฆฌ, ํŠน์ • ํ‚ค์›Œ๋“œ, ์ •๊ทœ ํ‘œํ˜„์‹, ๋˜๋Š” ํ•„ํ„ฐ ์กฐ๊ฑด์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฟผ๋ฆฌํ•œ ๋ฐ์ดํ„ฐ

 

์ฃผ์š” ์ปดํฌ๋„ŒํŠธ 4. ์ฟผ๋ฆฌ์–ด Querier

์ฐธ๊ณ ๋งํฌ: https://grafana.com/docs/loki/latest/get-started/components/#querier

Querier๋Š” LogQL ์ฟผ๋ฆฌ ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฟผ๋ฆฌ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ , Ingester์™€ ์˜๊ตฌ์Šคํ† ๋ฆฌ์ง€(S3) ๋ชจ๋‘์—์„œ ๋กœ๊ทธ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.

๋ฐฑ์—”๋“œ ์ €์žฅ์†Œ์— ๋Œ€ํ•ด ๋™์ผํ•œ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์ „์— ๋ชจ๋“  Ingester ๋Œ€ํ•ด ์ธ๋ฉ”๋ชจ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ฟผ๋ฆฌํ•œ๋‹ค. ์ด๋•Œ, Replication Factor๋กœ ์ธํ•ด ์ฟผ๋ฆฌ๊ฐ€ ์ค‘๋ณต๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์‹ ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด Querier๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ ๋™์ผํ•œ ๋‚˜๋…ธ์ดˆ ์Šคํƒฌํ”„, ๋ ˆ์ด๋ธ”์„ธํŠธ ๋ฐ ๋กœ๊ทธ ๋ฉ”์„ธ์ง€๋ฅผ ๊ฐ€์ง„ ๋ฐ์ดํ„ฐ๋ฅผ ์ค‘๋ณต์ œ๊ฑฐํ•œ๋‹ค.

์ฝ๊ธฐ์—์„œ๋„ Replication Factor๊ฐ€ ์ค‘์š”ํ•œ๋ฐ, Replication Factor๊ฐ€ 3์ธ ๊ฒฝ์šฐ 2๊ฐœ์˜ ์ฟผ๋ฆฌ๊ฐ€ ์‹คํ–‰๋˜์–ด์•ผ ํ•œ๋‹ค. (์ฝ๊ธฐ ์ฟผ๋Ÿผ)

 

์ผ๊ด€๋œ ํ•ด์‹œ๋ง  Consistent hash rings

์ฐธ๊ณ ๋งํฌ: https://grafana.com/docs/loki/latest/get-started/hash-rings/

ํ•ด์‹œ ๋ง์€ ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด์˜ ๋‹ค์–‘ํ•œ ์ปดํฌ๋„ŒํŠธ ์ธ์Šคํ„ด์Šค(์˜ˆ: Ingester, Querier ๋“ฑ) ์‚ฌ์ด์—์„œ ๋ฐ์ดํ„ฐ์™€ ์š”์ฒญ์„ ๋ถ„์‚ฐ์‹œํ‚ค๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์ด๋‹ค.

์ผ๊ด€๋œ ํ•ด์‹œ๋ง์€ ๋กœํ‚ค ์•„ํ‚คํ…์ณ์— ๋ฐ€์ ‘ํ•˜๊ฒŒ ํ†ตํ•ฉ๋˜์–ด ์•„๋ž˜์™€ ๊ฐ™์€ ์žฅ์ ์„ ์ œ๊ณตํ•œ๋‹ค.

  • ๋กœ๊ทธ ๋ผ์ธ์˜ ์ƒค๋”ฉ ์ง€์›
  • ๊ณ ๊ฐ€์šฉ์„ฑ ๊ตฌํ˜„
  • ํด๋Ÿฌ์Šคํ„ฐ์˜ ์ˆ˜ํ‰์  ์Šค์ผ€์ผ์—… ๋ฐ ์Šค์ผ€์ผ๋‹ค์šด ์ง€์›

ํ•ด์‹œ๋ง์— ์—ฐ๊ฒฐ๋˜์–ด์žˆ์–ด์•ผ ํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๋Š” ์•„๋ž˜์™€ ๊ฐ™๊ณ , ๊ฐ ์ปดํฌ๋„ŒํŠธ์˜ ํ•ด์‹œ ๋ง์€ ๊ทธ ์ปดํฌ๋„ŒํŠธ์˜ ์ธ์Šคํ„ด์Šค๋“ค ์‚ฌ์ด์—์„œ๋งŒ ์ž‘๋™ํ•œ๋‹ค.

  • distributors (ํ•„์ˆ˜): ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ๋กœ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„, ์—ฌ๋Ÿฌ Ingester์—๊ฒŒ ๋ถ„์‚ฐ์‹œํ‚จ๋‹ค.
  • ingesters (ํ•„์ˆ˜): ๋กœ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์‹ ํ•˜์—ฌ ์ž„์‹œ๋กœ ์ €์žฅํ•˜๊ณ , ์˜๊ตฌ ์Šคํ† ๋ฆฌ์ง€์— ์“ฐ๊ธฐ๋ฅผ ๋‹ด๋‹นํ•œ๋‹ค.
  • query schedulers (ํ•„์ˆ˜): ์ฟผ๋ฆฌ ์ž‘์—…์„ ๊ด€๋ฆฌํ•˜๊ณ  ์ฟผ๋ฆฌ์–ด์—๊ฒŒ ์ž‘์—…์„ ๋ถ„๋ฐฐํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.
  • compactors (ํ•„์ˆ˜): ๋กœ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ์••์ถ•ํ•˜๊ณ  ์ตœ์ ํ™”ํ•˜์—ฌ ์ €์žฅ ๊ณต๊ฐ„์„ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.
  • rulers (ํ•„์ˆ˜): ์‚ฌ์šฉ์ž ์ •์˜ ๊ทœ์น™์— ๋”ฐ๋ผ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์•Œ๋ฆผ์„ ๋ณด๋‚ด๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.
  • Index Gateway (์˜ต์…˜): ์ธ๋ฑ์Šค ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ์ฟผ๋ฆฌ ์†๋„๋ฅผ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

 

 

๋ง์— ์žˆ๋Š” ์‚ฌ๊ฐํ˜•(๋…ธ๋“œ)์€ ์ปดํฌ๋„ŒํŠธ ์ธ์Šคํ„ด์Šค๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค. (Distributer1, 2, 3/ Ingester1, 2, 3)
๊ฐ ๋…ธ๋“œ๋Š” ํ‚ค-๊ฐ’ ์ €์žฅ์†Œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ, ์ด ์ €์žฅ์†Œ๋Š” ํ•ด์‹œ ๋ง ๋‚ด์˜ ๋ชจ๋“  ๋…ธ๋“œ์— ๋Œ€ํ•œ ํ†ต์‹  ์ •๋ณด๋ฅผ ๋ณด๊ด€ํ•œ๋‹ค.
๋…ธ๋“œ๋Š” ์ฃผ๊ธฐ์ ์œผ๋กœ ํ‚ค-๊ฐ’ ์ €์žฅ์†Œ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜์—ฌ ๋ชจ๋“  ๋…ธ๋“œ์—์„œ ์ผ๊ด€๋œ ๋‚ด์šฉ์„ ์œ ์ง€ํ•œ๋‹ค.
๊ฐ ๋…ธ๋“œ์—๋Œ€ํ•ด ํ‚ค ๊ฐ’ ์ €์žฅ์†Œ๋Š” ๋‹ค์Œ์„ ๋ณด์œ ํ•œ๋‹ค.

  • ์ปดํฌ๋„ŒํŠธ ๋…ธ๋“œ์˜ ID
  • ๋‹ค๋ฅธ ๋…ธ๋“œ์—์„œ ํ†ต์‹  ์ฑ„๋„๋กœ ์‚ฌ์šฉํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ ์ฃผ์†Œ
  • ์ปดํฌ๋„ŒํŠธ ๋…ธ๋“œ์˜ ์ƒํƒœ ํ‘œ์‹œ

 

 

๋กœํ‚ค ๋ ˆ์ด๋ธ”

์ฐธ๊ณ ๋งํฌ: https://grafana.com/docs/loki/latest/get-started/labels/

๋ ˆ์ด๋ธ”์€ ํ‚ค-๊ฐ’์œผ๋กœ ์ •์˜๋œ ์Œ์ด๋ฉฐ ๋ฌด์—‡์ด๋“  ์ •์˜ํ•  ์ˆ˜์žˆ๋‹ค. ๋กœ๊ทธ ์ŠคํŠธ๋ฆผ์„ ์„ค๋ช…ํ•˜๊ธฐ ์œ„ํ•œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ผ๊ณ ๋„ ํ•œ๋‹ค.
Loki๋Š” '์‹œ๋ฆฌ์ฆˆ(series)' ๋Œ€์‹  '์ŠคํŠธ๋ฆผ(stream)'์ด๋ผ๋Š” ์šฉ์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ, ๊ฐ๊ฐ์˜ ๋กœ๊ทธ ๋ฐ์ดํ„ฐ ์ง‘ํ•ฉ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.

{job="apache",env="dev",action="GET",status_code="200"} 11.11.11.11 - frank [25/Jan/2000:14:00:01 -0500] "GET /1986.js HTTP/1.1" 200 932 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7 GTB6"
{job="apache",env="dev",action="POST",status_code="200"} 11.11.11.12 - frank [25/Jan/2000:14:00:02 -0500] "POST /1986.js HTTP/1.1" 200 932 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7 GTB6"
{job="apache",env="dev",action="GET",status_code="400"} 11.11.11.13 - frank [25/Jan/2000:14:00:03 -0500] "GET /1986.js HTTP/1.1" 400 932 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7 GTB6"
{job="apache",env="dev",action="POST",status_code="400"} 11.11.11.14 - frank [25/Jan/2000:14:00:04 -0500] "POST /1986.js HTTP/1.1" 400 932 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7 GTB6"
<--------------- ๋ ˆ์ด๋ธ” --------------------------------->

โญ๏ธ์ค‘์š”โญ๏ธ ๋ ˆ์ด๋ธ”์˜ ๋ชจ๋“  ํ‚ค์™€ ๊ฐ’์˜ ์กฐํ•ฉ์ด ๊ณ ์œ ํ•œ ๋กœ๊ทธ ์ŠคํŠธ๋ฆผ์„ ์ •์˜ํ•˜๋ฉฐ, ๋ ˆ์ด๋ธ”์˜ ๊ฐ’์ด ๋‹จ ํ•˜๋‚˜๋ผ๋„ ๋ณ€๊ฒฝ๋˜๋ฉด ์ƒˆ๋กœ์šด ๋กœ๊ทธ ์ŠคํŠธ๋ฆผ์„ ์ƒ์„ฑํ•˜๋Š”๊ฒƒ๊ณผ ๊ฐ™๋‹ค.
๋ ˆ์ด๋ธ”์˜ ๊ฐ’์ด ๋„ˆ๋ฌด ๋งŽ์„ ๊ฒฝ์šฐ, ๊ณ ์œ ํ•œ ์ŠคํŠธ๋ฆผ์˜ ์ˆ˜๊ฐ€ ๊ธ‰๊ฒฉํžˆ ์ฆ๊ฐ€ํ•˜๋ฉด์„œ ์นด๋””๋„๋ฆฌํ‹ฐ(Cardinality) ์„ฑ๋Šฅ์ €ํ•˜ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. ๐Ÿ˜ฑ๐Ÿ˜ฑ

Prometheus์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๊ฐœ๋…์ธ '์‹œ๋ฆฌ์ฆˆ(series)'์™€ ์œ ์‚ฌํ•˜๋‹ค.
ํ•˜์ง€๋งŒ Prometheus๋Š” ๋ฉ”ํŠธ๋ฆญ ์ด๋ฆ„์ด๋ผ๋Š” ์ถ”๊ฐ€์ ์ธ ์ฐจ์›์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€๋งŒ Loki์—์„œ๋Š” ๋ฉ”ํŠธ๋ฆญ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , ์˜ค๋กœ์ง€ ๋ ˆ์ด๋ธ”๋งŒ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๊ตฌ๋ถ„ํ•œ๋‹ค.

๊ฐ’์ด ๋„ˆ๋ฌด ๋งŽ์€ ๋ ˆ์ด๋ธ”์„ ์‚ฌ์šฉํ•˜๋Š”๊ฒƒ์ด ์ข‹์ง€ ์•Š๋‹ค๋ฉด, ๋กœ๊ทธ๋ฅผ ์–ด๋–ป๊ฒŒ ์ฟผ๋ฆฌํ•ด์•ผํ•˜๋‚˜? ์ธ๋ฑ์‹ฑ๋˜์ง€ ์•Š์œผ๋ฉด ์ฟผ๋ฆฌ๊ฐ€ ๋Š๋ ค์ง€์ง€ ์•Š์„๊นŒ?
์ด๋Ÿฐ ์˜๋ฌธ์ด ๋“ ๋‹ค.  ํŠนํžˆ ElasticSearch ์˜ Indexing์— ์ต์ˆ™ํ•˜๋‹ค๋ฉด, ๋น ๋ฅธ ์ฟผ๋ฆฌ๋ฅผ ์œ„ํ•ด ๋ ˆ์ด๋ธ” ์ •์˜๊ฐ€ ํ•„์ˆ˜๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ฒŒ ๋œ๋‹ค.

ํ•˜์ง€๋งŒ ๋กœํ‚ค์—์„œ๋Š” ๋‹ค๋ฅด๋‹ค.

Loki๋Š” ์ฟผ๋ฆฌ๋ฅผ ์ž‘์€ ์กฐ๊ฐ์œผ๋กœ ๋‚˜๋ˆ„์–ด ๋ณ‘๋ ฌ๋กœ ์ „๋‹ฌํ•˜๋ฏ€๋กœ ์งง์€ ์‹œ๊ฐ„์— ์—„์ฒญ๋‚œ ์–‘์˜ ๋กœ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ์ฟผ๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. (์ฐธ๊ณ )

# ํŠน์ • IP ์ฃผ์†Œ์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๋กœ๊ทธ ๋ฐ์ดํ„ฐ ์ฟผ๋ฆฌ ์˜ˆ์‹œ
# ๋ ˆ์ด๋ธ” ๋Œ€์‹  ํ•„ํ„ฐํ‘œํ˜„์‹ ์‚ฌ์šฉ
{job="apache"} |= "11.11.11.11"

Loki๋Š” ํ•ด๋‹น ์ฟผ๋ฆฌ๋ฅผ ๋” ์ž‘์€ ์กฐ๊ฐ(์ƒค๋“œ)์œผ๋กœ ๋‚˜๋ˆ„๊ณ  ๋ ˆ์ด๋ธ”๊ณผ ์ผ์น˜ํ•˜๋Š” ์ŠคํŠธ๋ฆผ์— ๋Œ€ํ•œ ๊ฐ ์ฒญํฌ๋ฅผ ์—ด๊ณ  ์ด IP ์ฃผ์†Œ๋ฅผ ์ฐพ๊ธฐ ์‹œ์ž‘ํ•œ๋‹ค.
์ƒค๋“œ์˜ ํฌ๊ธฐ์™€ ๋ณ‘๋ ฌํ™” ์–‘์€ ํ”„๋กœ๋น„์ €๋‹ํ•œ ๋ฆฌ์†Œ์Šค์— ๋”ฐ๋ผ ๊ตฌ์„ฑ ๊ฐ€๋Šฅํ•˜๋‹ค. ์›ํ•˜๋Š” ๊ฒฝ์šฐ ์ƒค๋“œ ๊ฐ„๊ฒฉ์„ 5m๊นŒ์ง€ ๊ตฌ์„ฑํ•˜๊ณ , ์ฟผ๋ฆฌ์–ด 20๊ฐœ๋ฅผ ๋ฐฐํฌํ•˜๊ณ , ๊ธฐ๊ฐ€๋ฐ”์ดํŠธ์˜ ๋กœ๊ทธ๋ฅผ ๋ช‡ ์ดˆ ๋งŒ์— ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.  ์•„๋‹ˆ๋ฉด 200๊ฐœ์˜ ์ฟผ๋ฆฌ์–ด๋ฅผ ํ”„๋กœ๋น„์ €๋‹ํ•˜๊ณ  ํ…Œ๋ผ๋ฐ”์ดํŠธ ๊ทœ๋ชจ์˜ ๋กœ๊ทธ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

์ด ๊ตฌ์กฐ๋Š” ๊ธฐ์กด Indexing์„ ์‚ฌ์šฉํ•˜๋˜ ๋กœ๊ทธ์‹œ์Šคํ…œ(ElasticSearch)๋ณด๋‹ค ๋น„์šฉํšจ์œจ์ ์ด๋‹ค.
Indexing์—์„œ๋Š” ๋กœ๊ทธ ๋ฐ์ดํ„ฐ์˜ ์ „์ฒด ํ…์ŠคํŠธ๋ฅผ ์ธ๋ฑ์‹ฑํ•˜๋Š” ๋ฐฉ์‹ ๋•Œ๋ฌธ์—, ์ธ๋ฑ์Šค ํฌ๊ธฐ๊ฐ€ ๋กœ๊ทธ ๋ฐ์ดํ„ฐ ์ž์ฒด์™€ ๊ฐ™๊ฑฐ๋‚˜ ๋” ์ปค์ง€๊ณ  ํฐ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๊ฒŒ ๋œ๋‹ค. ๋ฐ˜๋ฉด Loki๋Š” ์ธ๋ฑ์Šค๋ฅผ ์ตœ์†Œํ™” ํ•˜์—ฌ ๋กœ๊ทธ ํฌ๊ธฐ๋ณด๋‹ค ์ธํ…์Šค๊ฐ€ ์ž‘๊ฒŒ ์œ ์ง€๋œ๋‹ค.

Loki์˜ ์ด๋Ÿฌํ•œ ์ฟผ๋ฆฌ ๊ตฌ์กฐ๋Š” ์›ํ•˜๋Š” ์ฟผ๋ฆฌ ๋Šฅ๋ ฅ์„ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ๊ณ  ํ•„์š”์— ๋”ฐ๋ผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. (์ฟผ๋ฆฌ ์„ฑ๋Šฅ์€ ๋น„์šฉ์— ๋น„๋ก€)
๋˜ํ•œ ์˜๊ตฌ ๋ฐ์ดํ„ฐ๋Š” S3 ๋ฐ GCS์™€ ๊ฐ™์€ ์ €๊ฐ€ ๊ฐ์ฒด ์ €์žฅ์†Œ์— ํฌ๊ฒŒ ์••์ถ•๋˜์–ด ์ €์žฅ๋˜์–ด ๊ณ ์ • ์šด์˜ ๋น„์šฉ์„ ์ตœ์†Œํ™”ํ•˜๋Š” ๋™์‹œ์— ๋ฏฟ์„ ์ˆ˜ ์—†์„ ๋งŒํผ ๋น ๋ฅธ ์ฟผ๋ฆฌ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

4.3 ๋ฏธ๋ฏธ๋ฅด ๋ฉ”ํŠธ๋ฆญ ๊ด€๋ฆฌ

 

4.3.1 ๋ฏธ๋ฏธ๋ฅด ๊ธฐ๋Šฅ

์ด์ „ ํฌ์ŠคํŒ…์—์„œ ํƒ€๋…ธ์Šค์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์•˜๋‹ค. 
ํ˜„์‹œ์  ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š”๊ฒƒ์€ ํƒ€๋…ธ์Šค์ง€๋งŒ, ํƒ€๋…ธ์Šค๋Š” ํŠœ๋‹์ด ์–ด๋ ต๊ณ  ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ํ•ด๊ฒฐํ•˜๋Š”๋ฐ ์‹œ๊ฐ„์ด ์˜ค๋ž˜๊ฑธ๋ฆฐ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค.
์ฝ”ํ…์Šค(cortex)์— ๋น„ํ•˜๋ฉด ์„ฑ๋Šฅ๋„ ๋ถ€์กฑํ•œ ํŽธ์ด๋ผ๊ณ  ํ•œ๋‹ค.

ํƒ€๋…ธ์Šค๋ฅผ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ๋Š” ๋ฏธ๋ฏธ๋ฅด(mimir)๋ฅผ ์•Œ์•„๋ณด์ž.

 

๋ฏธ๋ฏธ๋ฅด ์ปดํฌ๋„ŒํŠธ

๋ฏธ๋ฏธ๋ฅด๋Š” ์œ„์—์„œ ์•Œ์•„๋ณธ ๋กœํ‚ค๋ž‘ ๊ตฌ์„ฑ์ด ๋น„์Šทํ•˜๋‹ค.
ํ•˜์œ„์—์„œ ๊ณ„์†ํ•ด์„œ ์‹œ๋ฆฌ์ฆˆ์™€ ์ƒ˜ํ”Œ์— ๋Œ€ํ•ด ๋‚˜์˜ค๋Š”๋ฐ, ์šฉ์–ด๋ฅผ ์ •ํ™•ํžˆ ์•Œ๊ณ  ๋ด์•ผํ•œ๋‹ค.
- ์‹œ๋ฆฌ์ฆˆ(seris)๋ž€, ์‹œ๊ฐ„์— ๋”ฐ๋ผ ์ธก์ •๋œ ๋ฐ์ดํ„ฐ ํฌ์ธํŠธ์˜ ์—ฐ์†์ ์ธ ์‹œํ€€์Šค ์ฆ‰ ์‹œ๊ณ„์—ด ๋ฐ์ดํ„ฐ ๋งํ•œ๋‹ค.
- ์ƒ˜ํ”Œ(sample)์ด๋ž€, ์‹œ๊ณ„์—ด์—์„œ ๋‹จ์ผ ์‹œ์ ์— ํ•ด๋‹นํ•˜๋Š” ๋ฐ์ดํ„ฐ ํฌ์ธํŠธ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

https://grafana.com/docs/mimir/latest/get-started/about-grafana-mimir-architecture/

  • ์“ฐ๊ธฐ๊ฒฝ๋กœ ์ปดํฌ๋„ŒํŠธ
    • ํ”„๋กœ๋ฉ”ํ…Œ์šฐ์Šค prometheus
      • ํ”„๋กœ๋ฉ”ํ…Œ์šฐ์Šค๋Š” ๋‹ค์–‘ํ•œ ๋Œ€์ƒ์—์„œ ์ƒ˜ํ”Œ์„ ์Šคํฌ๋žฉํ•˜๊ณ  ํ”„๋กœ๋ฉ”ํ…Œ์šฐ์Šค์˜ ์›๊ฒฉ์“ฐ๊ธฐ API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฏธ๋ฏธ๋ฅด๋กœ ํ‘ธ์‹œํ•œ๋‹ค.
      • ์›๊ฒฉ์“ฐ๊ธฐ API๋Š” HTTP Put ์š”์ฒญ ๋ณธ๋ฌธ ๋‚ด์—์„œ ์ผ๊ด„ ์ฒ˜๋ฆฌ๋œ ์Šค๋‚ดํ”ผ(snappy) ์••์ถ• ํ”„๋กœํ† ์ฝœ ๋ฒ„ํผ ๋ฉ”์„ธ์ง€๋ฅผ ๋ณด๋‚ธ๋‹ค.
      • HTTP์š”์ฒญ์—๋Š” ํ…Œ๋„ŒํŠธID ํ—ค๋”๊ฐ€ ์žˆ์–ด์•ผ ํ•œ๋‹ค.
    • ๋””์ŠคํŠธ๋ฆฌ๋ทฐํ„ฐ distributor [์ฐธ๊ณ ]
      • Prometheus ๋˜๋Š” Grafana ์—์ด์ „ํŠธ๋กœ๋ถ€ํ„ฐ ์‹œ๊ณ„์—ด ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์‹ ํ•˜๋Š” ์ƒํƒœ ๋น„์ €์žฅ ์ปดํฌ๋„ŒํŠธ์ด๋‹ค.
      • ๋ฐ์ดํ„ฐ์˜ ์ •ํ™•์„ฑ์„ ๊ฒ€์ฆํ•˜๊ณ  ํ•ด๋‹น ๋ฐ์ดํ„ฐ๊ฐ€ ํŠน์ • ํ…Œ๋„ŒํŠธ์— ๋Œ€ํ•ด ๊ตฌ์„ฑ๋œ ์ œํ•œ ๋‚ด์— ์žˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.
      • ์ดํ›„ ๋ฐ์ดํ„ฐ๋ฅผ ์—ฌ๋Ÿฌ Ingester์— ๋ณ‘๋ ฌ๋กœ ๋ณด๋‚ธ๋‹ค. (์—ฌ๊ธฐ์„œ๋„ Replication-factor)
    • ์ธ์ œ์Šคํ„ฐ ingester [์ฐธ๊ณ ]
      • Distributer์—์„œ ๋“ค์–ด์˜จ ์‹œ๋ฆฌ์ฆˆ๋ฅผ ์“ฐ๊ธฐ๊ฒฝ๋กœ์˜ ์˜๊ตฌ์Šคํ† ๋ฆฌ์ง€์— ์“ฐ๊ณ , ์ฝ๊ธฐ ๊ฒฝ๋กœ์˜ ์ฟผ๋ฆฌ์— ๋Œ€ํ•œ ์‹œ๋ฆฌ์ฆˆ ์ƒ˜ํ”Œ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ƒํƒœ์ €์žฅ ์ปดํฌ๋„ŒํŠธ ์ด๋‹ค.
      • Distributer์—์„œ ๋“ค์–ด์˜ค๋Š” ์‹œ๊ณ„์—ด ๋ฐ์ดํ„ฐ๋Š” Ingester ๋ฉ”๋ชจ๋ฆฌ์— ๋ณด๊ด€๋˜๊ณ  WAL์— ๊ธฐ๋ก๋˜๋ฉฐ, ์ตœ์ข…์ ์œผ๋กœ ์˜๊ตฌ์Šคํ† ๋ฆฌ์ง€์— ์—…๋กœ๋“œ ๋œ๋‹ค. (๊ธฐ๋ณธ์ ์œผ๋กœ 2์‹œ๊ฐ„๋งˆ๋‹ค)
    • ์ปดํŽ™ํ„ฐ compactor [์ฐธ๊ณ ]
      • ์ปดํŽ™ํ„ฐ๋Š” ์—ฌ๋Ÿฌ ์ˆ˜์ง‘๊ธฐ์˜ ๋ธ”๋ก์„ ๋‹จ์ผ ๋ธ”๋ก์œผ๋กœ ๋ณ‘ํ•ฉํ•˜๊ณ  ์ค‘๋ณต ์ƒ˜ํ”Œ์„ ์ œ๊ฑฐํ•œ๋‹ค.
  • ์ฝ๊ธฐ๊ฒฝ๋กœ ์ปดํฌ๋„ŒํŠธ
    • ์ฟผ๋ฆฌํ”„๋ŸฐํŠธ์—”๋“œ query-frontend [์ฐธ๊ณ ]
      • Querier์™€ ๋™์ผํ•œ API๋ฅผ ์ œ๊ณตํ•˜๋ฉฐ, ์ฝ๊ธฐ๋ฅผ ๊ฐ€์†ํ™”ํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•˜๋Š” ์ƒํƒœ ๋น„์ €์žฅ ์ปดํฌ๋„ŒํŠธ ์ด๋‹ค.
      • ํ•„์ˆ˜ ๊ตฌ์„ฑ์š”์†Œ๋Š” ์•„๋‹ˆ์ง€๋งŒ ๋ฐฐํฌํ•˜๋Š”๊ฒƒ์„ ๊ถŒ์žฅํ•œ๋‹ค.
      • ์ฟผ๋ฆฌ๊ฐ€ ๋“ค์–ด์˜ค๋ฉด, query-frontend๋Š” ์ฟผ๋ฆฌ๋ฅผ ์—ฌ๋Ÿฌ๊ฐœ์˜ ๋” ์ž‘์€ ์ฟผ๋ฆฌ๋กœ ๋ถ„ํ• ํ•œ๋‹ค.
      • ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๊ฐ€ ์บ์‹œ์— ์žˆ๋‹ค๋ฉด ์บ์‹œ๋œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , ์บ์‹œ์—์„œ ์‘๋‹ตํ•  ์ˆ˜ ์—†๋Š” ์ฟผ๋ฆฌ๋Š” ํ”„๋ŸฐํŠธ์—”๋“œ ๋‚ด์˜ ๋ฉ”๋ชจ๋ฆฌํ์— ๋„ฃ๋Š”๋‹ค.
    • ์ฟผ๋ฆฌ์–ด querier [์ฐธ๊ณ ]
      • ์ฟผ๋ฆฌ์–ด๋Š” ์ฝ๊ธฐ ๊ฒฝ๋กœ์—์„œ ์‹œ๊ณ„์—ด๊ณผ ๋ ˆ์ด๋ธ”์„ ๊ฐ€์ ธ์™€ PromQL ์‹์„ ํ‰๊ฐ€ํ•˜๋Š” ์ƒํƒœ ๋น„์ €์žฅ ๊ตฌ์„ฑ ์š”์†Œ์ด๋‹ค.
      • querier๋Š” quert-frontend ๋Œ€๊ธฐ์—ด(๋ฉ”๋ชจ๋ฆฌํ)์—์„œ ์ž‘์—…์„ ๊ฐ€์ ธ์™€์„œ ์‹คํ–‰ํ•˜๊ณ  ์ง‘๊ณ„๋ฅผ ์œ„ํ•ด ์ฟผ๋ฆฌ ํ”„๋ŸฐํŠธ์—”๋“œ์— ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ž‘์—…์ž ์—ญํ• ์„ ํ•œ๋‹ค.
      • Storage Gateway์™€ Ingester์— ์—ฐ๊ฒฐํ•˜์—ฌ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค. 
    • ์Šคํ† ๋ฆฌ์ง€ ๊ฒŒ์ดํŠธ์›จ์ด store-gateway [์ฐธ๊ณ ]
      • ์Šคํ† ๋ฆฌ์ง€ ๊ฒŒ์ดํŠธ์›จ์ด๋Š” ์ƒํƒœ์ €์žฅ ์ปดํฌ๋„ŒํŠธ์ด๋ฉฐ, ์˜๊ตฌ์Šคํ† ๋ฆฌ์ง€์—์„œ ๋ธ”๋ก์„ ์กฐํšŒํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.
  • ์Šคํ† ๋ฆฌ์ง€ ๋ฐฉ์‹
    • ๋ฏธ๋ฏธ๋ฅด๋Š” ๊ฐ ํ…Œ๋„ŒํŠธ์˜ ์‹œ๊ณ„์—ด์„ ์ž์ฒด TSDB์— ์ €์žฅํ•จ์œผ๋กœ์จ ๋ธ”๋ก์˜ ์‹œ๋ฆฌ์ฆˆ๋ฅผ ์œ ์ง€ํ•œ๋‹ค.
    • ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ธ”๋ก์˜ ๋ฒ”์œ„๋Š” ๋‘์‹œ๊ฐ„์ด๋ฉฐ, ๊ฐ ๋ธ”๋ก ๋””๋ ‰ํ„ฐ๋ฆฌ๋Š” ์ธ๋ฑ์ŠคํŒŒ์ผ, ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๊ฐ€ ํฌํ•จ๋œ ํŒŒ์ผ๊ณผ ์‹œ๊ณ„์—ด ์ฒญํฌ๋ฅผ ํฌํ•จํ•œ๋‹ค.
    • TSDB ๋ธ”๋ก ํŒŒ์ผ์—๋Š” ์—ฌ๋Ÿฌ ์‹œ๋ฆฌ์ฆˆ์— ๋Œ€ํ•œ ์ƒ˜ํ”Œ์ด ๋“ค์–ด์žˆ๋‹ค. ๋ธ”๋ก ๋‚ด๋ถ€์˜ ์‹œ๋ฆฌ์ฆˆ๋Š” ๋ธ”๋ก ํŒŒ์ผ์˜ ์‹œ๊ณ„์—ด์— ๋Œ€ํ•œ ๋ฉ”ํŠธ๋ฆญ ์ด๋ฆ„๊ณผ ๋ ˆ์ด๋ธ”์„ ๋ชจ๋‘ ์ƒ‰์ธ(์ธ๋ฑ์‹ฑ) ํ•œ๋‹ค.
    • ๋ธ”๋ก ํŒŒ์ผ์„ ์ €์ •ํ•˜๊ธฐ ์œ„ํ•ด์„œ ๊ฐ์ฒด ์ €์žฅ์†Œ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

 

์ธ๋ฑ์Šค ํ—ค๋” index-header

์ฐธ๊ณ ๋งํฌ:
https://grafana.com/docs/mimir/latest/references/architecture/binary-index-header/
https://grafana.com/docs/mimir/latest/references/architecture/bucket-index/#how-its-used-by-the-querier

์ฝ๊ธฐ๊ฒฝ๋กœ์—์„œ ์‚ฌ์šฉ์ž๊ฐ€ querier์—๊ฒŒ ์กฐํšŒ๋ฅผ ์š”์ฒญํ•˜๊ฑฐ๋‚˜, ruler๊ฐ€ ๋ ˆ์ฝ”๋”ฉ ๊ทœ์น™์„ ์ฒ˜๋ฆฌํ• ๋•Œ๋Š” ํ•ญ์ƒ store gateway๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
๊ฐ์ฒด ์Šคํ† ๋ฆฌ์ง€์—์„œ ๋ธ”๋ก ๋‚ด๋ถ€ ์‹œ๋ฆฌ์ฆˆ๋ฅผ ์ฟผ๋ฆฌํ•˜๋ ค๋ฉด store gateway๋Š” ๋ธ”๋ก ์ธ๋ฑ์Šค์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์–ป์–ด์•ผ ํ•œ๋‹ค.

Grafana ํŒจ๋ฐ€๋ฆฌ(loki, mimir, tempo, grafana)๋Š” ๋‹ค์–‘ํ•œ ํ˜•ํƒœ๋กœ ์ธ๋ฑ์Šค ์ •๋ณด๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.
์ธ๋ฑ์Šค๋Š” AWS Dynamodb์— ์ €์žฅํ•˜๊ณ , ์‹ค์ œ ๋ฐ์ดํ„ฐ๋Š” S3์— ์ €์žฅํ•˜๋Š” ๊ตฌ์„ฑ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
์ฆ‰, ์ธ๋ฑ์Šค์™€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„๋ฆฌํ•ด์„œ ๊ด€๋ฆฌํ•˜๊ฑฐ๋‚˜ ํ•จ๊ป˜ ๊ด€๋ฆฌํ•˜๋Š”๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด ์Šคํ† ์–ด ๊ฒŒ์ดํŠธ์›จ์ด๋Š” ๋ธ”๋ก์— ๋Œ€ํ•œ ์ธ๋ฑ์Šค ํ—ค๋”(index-header)๋ฅผ ๋งŒ๋“ค๊ณ  ๋กœ์ปฌ๋””์Šคํฌ์— ์ €์žฅํ•œ๋‹ค.

  • Index-Header๋ž€?
    • Index-header๋Š” ๋ฐ์ดํ„ฐ ๋ธ”๋ก์˜ ์ธ๋ฑ์Šค์—์„œ ํŠน์ • ์„น์…˜๋“ค์„ ํฌํ•จํ•˜๋Š” ๊ตฌ์กฐ์ด๋ฉฐ, ๋ฐ์ดํ„ฐ ๋ธ”๋ก์„ ํšจ์œจ์ ์œผ๋กœ ์กฐํšŒํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์ด๋‹ค.
    • ์ฟผ๋ฆฌ ์‹œ, store-gateway๋Š” ์ด index-header๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋น ๋ฅด๊ฒŒ ์ฐพ์•„๋‚ด๊ณ , ์ „์ฒด ๋ฐ์ดํ„ฐ ๋ธ”๋ก์„ ์Šค์บ”ํ•˜๋Š” ๋Œ€์‹  ํŠน์ • ๋ฐ์ดํ„ฐ์— ์ง์ ‘ ์ ‘๊ทผํ•œ๋‹ค.
  • GET Byte Range ์š”์ฒญ
    • store-gateway๋Š” GET byte range ์š”์ฒญ์„ ์‚ฌ์šฉํ•˜์—ฌ ์›๋ณธ ๋ธ”๋ก์˜ ์ธ๋ฑ์Šค์—์„œ ํŠน์ • ์„น์…˜๋“ค๋งŒ์„ ๋‹ค์šด๋กœ๋“œํ•œ๋‹ค.
    • ์ด๋Š” HTTP ํ”„๋กœํ† ์ฝœ์˜ ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•˜์—ฌ ํŒŒ์ผ์˜ ์ „์ฒด๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜๋Š” ๋Œ€์‹  ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ์„ ์„ ํƒ์ ์œผ๋กœ ๋‹ค์šด๋กœ๋“œํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.
    • ์ด ๋ฐฉ์‹์€ ๋„คํŠธ์›Œํฌ ๋Œ€์—ญํญ๊ณผ ์ฒ˜๋ฆฌ ์‹œ๊ฐ„์„ ์ ˆ์•ฝํ•˜๋ฉฐ, ์ „์ฒด ์ธ๋ฑ์Šค๋ฅผ ๋กœ๋“œํ•˜๊ณ  ํŒŒ์‹ฑํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ํšจ์œจ์ ์ด๋‹ค.
  • Index-Header์˜ ์ €์žฅ ๋ฐฉ์‹
    • Index-header๋Š” ๊ณ„์‚ฐ์ ์œผ๋กœ ์ƒ์„ฑํ•˜๊ธฐ ์‰ฌ์šด ๊ตฌ์กฐ์ด๊ธฐ ๋•Œ๋ฌธ์—, ์˜ค๋ธŒ์ ํŠธ ์Šคํ† ๋ฆฌ์ง€์—๋Š” ์—…๋กœ๋“œ๋˜์ง€ ์•Š๋Š”๋‹ค.
    • ๋Œ€์‹ , store-gateway ์ธ์Šคํ„ด์Šค๊ฐ€ ํ•„์š”๋กœ ํ•  ๋•Œ๋งˆ๋‹ค ๋กœ์ปฌ ๋””์Šคํฌ์—์„œ ์ง์ ‘ ์ƒ์„ฑํ•œ๋‹ค.
    • ๋งŒ์•ฝ index-header๊ฐ€ ๋กœ์ปฌ ๋””์Šคํฌ์— ์—†๊ฑฐ๋‚˜, ๋กค๋ง ์—…๋ฐ์ดํŠธ ํ›„ ์ง€์†์ ์ธ ๋””์Šคํฌ ์—†์ด ์ธ์Šคํ„ด์Šค๊ฐ€ ์žฌ์‹œ์ž‘๋˜๋ฉด, ์›๋ณธ ๋ธ”๋ก์˜ ์ธ๋ฑ์Šค์—์„œ index-header๋ฅผ ๋‹ค์‹œ ์ƒ์„ฑํ•œ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ store gateway๋Š” index-header๋ฅผ ๋‹ค์šด๋กœ๋“œ ํ•œ ํ›„ ํ•„์š”ํ• ๋•Œ๊นŒ์ง€ ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋“œํ•˜์ง€ ์•Š๊ณ  ์žˆ๋‹ค๊ฐ€, ํ•„์š” ์‹œ ์ฟผ๋ฆฌ์— ๋ฉ”๋ชจ๋ฆฌ ๋งคํ•‘ํ•˜๊ณ  lazy_loading_idle_timeout(์ฐธ๊ณ ) ์— ์ง€์ •ํ•œ ๋น„ํ™œ์„ฑ ์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด ์ธ๋ฑ์Šค ํ—ค๋”๋Š” ์Šคํ† ์–ด ๊ฒŒ์ดํŠธ์›จ์ด์—์„œ ์ž๋™์œผ๋กœ ํ•ด์ œํ•œ๋‹ค.

์ธ๋ฑ์Šค ํ—ค๋” ์ง€์—ฐ ๋กœ๋”ฉ์„ ๋น„ํ™œ์„ฑํ™” ํ•˜๊ธฐ ์œ„ํ•ด lazy_loading_enabled = false๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
๋น„ํ™œ์„ฑํ™” ํ•˜๋ฉด ์Šคํ† ์–ด ๊ฒŒ์ดํŠธ์›จ์ด๊ฐ€ ๋ชจ๋“  ์ธ๋ฑ์Šค ํ—ค๋”๋ฅผ ๋ฉ”๋ชจ๋ฆฌ ๋งคํ•‘ํ•˜์—ฌ ์ธ๋ฑ์Šค ํ—ค๋”์˜ ๋ฐ์ดํ„ฐ์— ๋น ๋ฅด๊ฒŒ ์•ก์„ธ์Šค ํ•  ์ˆ˜ ์žˆ๋‹ค.
ํ•˜์ง€๋งŒ ๋ธ”๋ก์ˆ˜๊ฐ€ ๋งŽ์€ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ๋Š” ์ฟผ๋ฆฌ ์‹œ ์‚ฌ์šฉ๋˜๋Š” ๋นˆ๋„์— ๊ด€๊ณ„์—†์ด ๊ฐ ์Šคํ† ์–ด ๊ฒŒ์ดํŠธ์›จ์ด์–ด ๋ฉ”๋ชจ๋ฆฌ ๋งคํ•‘๋œ ๋งŽ์€ ์–‘์˜ ์ธ๋ฑ์Šค ํ—ค๋”๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค.

 

ํ•ด์‹œ ๋ง hash-rings

์ฐธ๊ณ ๋งํฌ:
https://grafana.com/docs/mimir/latest/references/architecture/hash-ring/
https://grafana.com/docs/mimir/latest/configure/configure-hash-rings/

ํ•ด์‹œ๋ง์€ ์œ„์—์„œ Loki์—์„œ๋„ ํ•œ๋ฒˆ ๋‹ค๋ฃจ์—ˆ์ง€๋งŒ, mimir ๋ฌธ์„œ์—์„œ ํ›จ์”ฌ ์ž์„ธํžˆ ๋™์ž‘ํ•˜๋Š” ๋ฐฉ์‹์„ ์„ค๋ช…ํ•˜๊ณ  ์žˆ๋‹ค.

์šฐ์„  ํ•ด์‹œ๋ง์€ ์ž‘์—…์„ ์—ฌ๋Ÿฌ ์„œ๋ฒ„๊ฐ€ ๋‚˜๋ˆ ์„œ ์ฒ˜๋ฆฌํ• ๋•Œ, ํŠน์ • ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ๊ธฐ์œ„ํ•ด์„œ ์–ด๋–ค ์„œ๋ฒ„๋ฅผ ์ฐพ์•„๊ฐ€์•ผ ํ•˜๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ๋Š” ์ผ์ข…์˜ ๋งต์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
Grafana mimir๋Š” fnv32a(32๋น„ํŠธ ๋ถ€ํ˜ธ์—†๋Š” ์ •์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•ด์‹œํ•จ์ˆ˜)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ, ์ƒ์„ฑ๋œ ํ•ด์‹œ๊ฐ’(ํ† ํฐ)์€ 0๋ถ€ํ„ฐ (2^32)-1 ์‚ฌ์ด์˜ ๊ฐ’์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค.

[hashring ๋™์ž‘๋ฐฉ๋ฒ•]

Ingester Hash ring ๋™์ž‘ ๋ฐฉ์‹์„ ์„ค๋ช…ํ•˜์ž๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

  1. Ingester๋Š” ์‹œ์ž‘ํ• ๋•Œ ์ž„์˜์˜ ํ† ํฐ๊ฐ’์„ ์ƒ์„ฑํ•˜๊ณ  ์ด๋ฅผ ๋ง์— ๋“ฑ๋กํ•œ๋‹ค.
    • Ingester #1 ์€ ํ† ํฐ2์™€ ํ•จ๊ป˜ ๋ง์— ๋“ฑ๋ก๋จ
    • Ingester #2 ๋Š” ํ† ํฐ4์™€ ํ•จ๊ป˜ ๋ง์— ๋“ฑ๋ก๋จ
    • Ingester #3 ์€ ํ† ํฐ 6๊ณผ ํ•จ๊ป˜ ๋ง์— ๋“ฑ๋ก๋จ
    • Ingester #4 ๋Š” ํ† ํฐ 9์™€ ํ•จ๊ป˜ ๋ง์— ๋“ฑ๋ก๋จ
  2. ์‹œ๋ฆฌ์ฆˆ(๋ฐ์ดํ„ฐ)๊ฐ€ Distributer์— ์ž…๋ ฅ๋˜๋ฉด, fvn32aํ•ด์‹œํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์‹œ๋ฆฌ์ฆˆ์˜ ๋ ˆ์ด๋ธ”์„ ํ•ด์‹œํ•˜์—ฌ ํ† ํฐ3์ด ์ƒ์„ฑ๋œ๋‹ค.
  3. ํ† ํฐ3์€ ์‹œ๊ณ„๋ฐฉํ–ฅ ๊ธฐ์ค€ ๊ฐ€์žฅ ์ธ์ ‘ํ•œ Ingester #2 ๊ฐ€ ์†Œ์œ ํ•œ๋‹ค.
  4. ์ด๋•Œ, mimir๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์‹œ๋ฆฌ์ฆˆ(๋ฐ์ดํ„ฐ)๋ฅผ 3๊ฐœ ๋ณต์ œ๋ณธ์œผ๋กœ ๋ณต์‚ฌํ•˜๊ฒŒ ๋˜๋Š”๋ฐ,
    ์‹œ๋ฆฌ์ฆˆ์˜ ์†Œ์œ ์ž์ธ Ingester #2๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์‹œ๊ณ„๋ฐฉํ–ฅ์œผ๋กœ ๋ง์„ ์ด๋™ํ•˜์—ฌ Ingester #3, Ingester #4์— ์‹œ๋ฆฌ์ฆˆ๊ฐ€ ๋ณต์ œ๋œ๋‹ค.

ํ•ด์‹œ๋ง์€ ์ผ๊ด€๋œ ํ•ด์‹ฑ์„ ๋ณด์žฅํ•˜๋ฉฐ, ํŠน์ • ๋ง์—์„œ ์ธ์Šคํ„ด์Šค(์˜ˆ์ œ์—์„œ๋Š” Ingester)๊ฐ€ ์ถ”๊ฐ€๋˜๊ฑฐ๋‚˜ ์ œ๊ฑฐ๋ ๋•Œ ๋‹ค๋ฅธ ์ธ์Šคํ„ด์Šค๋กœ ์ด๋™๋˜๋Š” ํ† ํฐ์ˆ˜๋ฅผ ์ตœ์†Œํ™” ํ•œ๋‹ค. (์ด๋™๋˜๋Š” ํ† ํฐ ๊ฐœ์ˆ˜ = ํ† ํฐ/๋ง์— ๋“ฑ๋ก๋œ ์ธ์Šคํ„ด์Šค ๊ฐœ์ˆ˜)

 

[ํ•ด์‹œ๋ง์„ ์‚ฌ์šฉํ•˜๋Š” ๊ตฌ์„ฑ์š”์†Œ]

ํ•ด์‹œ๋ง์„ ์‚ฌ์šฉํ•˜๋Š” ๊ตฌ์„ฑ์š”์†Œ๋Š” Ingester ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์•„๋ž˜์— ๋‚˜์—ด๋œ ๊ตฌ์„ฑ์š”์†Œ์—์„œ ํ•ด์‹œ๋ง์ด ๋…๋ฆฝ์ ์ธ ํ•ด์‹œ๋ง์„ ๊ตฌ์„ฑํ•˜๊ฒŒ ๋œ๋‹ค.

  • Ingesters : ์ƒค๋”ฉ๊ณผ ์‹œ๋ฆฌ์ฆˆ๋ฅผ ๋ณต์ œํ•œ๋‹ค.
  • Distributors : ๋น„์œจ ์ œํ•œ์„ ์‹œํ–‰ํ•œ๋‹ค.
  • Compactors : ์••์ถ• ์ž‘์—… ๋ถ€ํ•˜๋ฅผ ์ƒค๋”ฉํ•œ๋‹ค.
  • Store-gateways : ์žฅ๊ธฐ์ €์žฅ์†Œ์—์„œ ์ฟผ๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๋ธ”๋ก์„ ์ƒค๋”ฉํ•œ๋‹ค.
  • (Optional) Rulers : ๊ทœ์น™๊ทธ๋ฃน์„ ํ‰๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด ์ƒค๋”ฉํ•œ๋‹ค.
  • (Optional) Alertmanagers ํ…Œ๋„ŒํŠธ๋ฅผ ์ƒค๋”ฉํ•œ๋‹ค.

 

[๊ทธ๋ผํŒŒ๋‚˜ ๋ฏธ๋ฏธ๋ฅด ์ธ์Šคํ„ด์Šค๊ฐ„ ํ•ด์‹œ๋ง์„ ๊ณต์œ ํ•˜๋Š” ๋ฐฉ๋ฒ•]

ํ•ด์‹œ๋ง์€ ๊ตฌ์„ฑ์š”์†Œ ๊ฐ„์— ๊ณต์œ  ๋˜์–ด์•ผ ํ•œ๋‹ค. 
์ง€์ •๋œ ํ•ด์‹œ๋ง์— ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ๊ตฌ์„ฑ์š”์†Œ๊ฐ„์— ์ „ํŒŒํ•˜๊ธฐ ์œ„ํ•ด ํ‚ค-๊ฐ’ ์ €์žฅ์†Œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. 
ํ‚ค-๊ฐ’ ์ €์žฅ์†Œ๋Š” ํ•„์ˆ˜์ด๋ฉฐ ๋‹ค์–‘ํ•œ ๊ตฌ์„ฑ ์š”์†Œ์˜ ํ•ด์‹œ ๋ง์— ๋Œ€ํ•ด ๋…๋ฆฝ์ ์œผ๋กœ ๊ตฌ์„ฑ๋  ์ˆ˜ ์žˆ๋‹ค.

 

[ํ•ด์‹œ๋ง์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌ์ถ•ํ•œ ๊ธฐ๋Šฅ]

Grafana Mimir๋Š” ์ฃผ๋กœ ์ƒค๋”ฉ ๋ฐ ๋ณต์ œ๋ฅผ ์œ„ํ•ด ํ•ด์‹œ ๋ง์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ, ์•„๋ž˜ ๊ธฐ๋Šฅ๋„ ํ•ด์‹œ๋ง์œผ๋กœ ๊ตฌํ˜„๋˜์—ˆ๋‹ค.

  • Service discovery: ์ธ์Šคํ„ด์Šค๋Š” ๋ง์— ๋“ฑ๋ก๋œ ์ธ์Šคํ„ด์Šค๋ฅผ ์กฐํšŒํ•˜์—ฌ ์„œ๋กœ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • Heartbeating: ์ธ์Šคํ„ด์Šค๋Š” ์ฃผ๊ธฐ์ ์œผ๋กœ ๋ง์— ํ•˜ํŠธ๋น„ํŠธ๋ฅผ ์ „์†กํ•˜์—ฌ ์‹คํ–‰์ค‘์ž„์„ ์•Œ๋ฆฐ๋‹ค. ์ผ์ •๊ธฐ๊ฐ„๋™์•ˆ ํ•˜ํŠธ๋น„ํŠธ๋ฅผ ๋†“์น˜๋ฉด ํ•ด๋‹น ์ธ์Šคํ„ด์Šค๋Š” ๋น„์ •์ƒ์œผ๋กœ ๊ฐ„์ฃผ๋œ๋‹ค.
  • Zone-aware replication: ์žฅ์•  ๋„๋ฉ”์ธ๊ฐ„์˜ ๋ฐ์ดํ„ฐ ๋ณต์ œ๋กœ, ๋„๋ฉ”์ธ ์ค‘๋‹จ๋™์•ˆ ๋ฐ์ดํ„ฐ ์†์‹ค์„ ๋ฐฉ์ง€ํ•˜๋Š”๋ฐ ๋„์Œ์„ ์ค€๋‹ค.
    ์ฐธ๊ณ :  configuring zone-aware replication.
  • Shuffle sharding: ๋ฉ€ํ‹ฐํ…Œ๋„ŒํŠธ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์…”ํ”Œ์ƒค๋”ฉ์„ ์„ ํƒ์ ์œผ๋กœ ์ง€์›ํ•˜๋ฉฐ, ์ค‘๋‹จ์˜ ํญ๋ฐœ๋ฐ˜๊ฒฝ(blast redius of an outage)์„ ์ค„์ด๊ณ  ํ…Œ๋„ŒํŠธ๋ฅผ ๊ฒฉ๋ฆฌํ•  ์ˆ˜์žˆ๋‹ค.
    ์…”ํ”Œ ์ƒคํŒ…์€ ์„œ๋กœ ๋‹ค๋ฅธ ํ…Œ๋„ŒํŠธ์˜ ์›Œํฌ๋กœ๋“œ๋ฅผ ๊ฒฉ๋ฆฌํ•˜๊ณ , ๊ณต์œ  ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์‹คํ–‰๋˜๋Š” ๊ฒฝ์šฐ์—๋„ ๊ฐ ํ…Œ๋„ŒํŠธ์— ๋‹จ์ผ ํ…Œ๋„ŒํŠธ ํ™˜๊ฒฝ์„ ์ œ๊ณตํ•˜๋Š” ๊ธฐ์ˆ ์ด๋‹ค.
    ์ฐธ๊ณ : configure shuffle sharding.

 

๋งด๋ฒ„๋ฆฌ์ŠคํŠธ์™€ ๊ฐ€์‹ญํ”„๋กœํ† ์ฝœ

์ฐธ๊ณ : https://grafana.com/docs/mimir/latest/references/architecture/memberlist-and-the-gossip-protocol/

๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฏธ๋ฏธ๋ฅด๋Š” ๋ฉค๋ฒ„๋ฆฌ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ธ์Šคํ„ด์Šค๊ฐ„์— ํ•ด์‹œ๋ง ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ๊ณต์œ ํ•˜๋Š” ํ‚ค-๊ฐ’ ์ €์žฅ์†Œ๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค.
๋งด๋ฒ„๋ฆฌ์ŠคํŠธ๋Š” Gossip ๊ธฐ๋ฐ˜ ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•˜์—ฌ ํด๋Ÿฌ์Šคํ„ฐ ๋ฉค๋ฒ„์‹ญ๊ณผ ๊ตฌ์„ฑ์› ์‹คํŒจ ๊ฐ์ง€๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” Go ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‹ค.

๊ฐ ๋ฏธ๋ฏธ๋ฅด ์ธ์Šคํ„ด์Šค๋Š” ๋กœ์ปฌ์—์„œ ํ•ด์‹œ๋ง์„ ์—…๋ฐ์ดํŠธํ•˜๊ณ , ๋ฉค๋ฒ„๋ฆฌ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ๋‹ค๋ฅธ ์ธ์Šคํ„ด์Šค์— ์ „ํŒŒํ•œ๋‹ค.
๋กœ์ปฌ์—์„œ ์ƒ์„ฑ๋œ ์—…๋ฐ์ดํŠธ์™€ ๋‹ค๋ฅธ ์ธ์Šคํ„ด์Šค์—์„œ ๋ฐ›์€ ์—…๋ฐ์ดํŠธ๋Š” ํ•จ๊ป˜ ๋ณ‘ํ•ฉ๋˜์–ด ์ธ์Šคํ„ด์Šค์—์„œ ๋ง์˜ ํ˜„์žฌ์ƒํƒœ๋ฅผ ํ˜•์„ฑํ•œ๋‹ค.

 

์ฟผ๋ฆฌ ์ƒค๋”ฉ

์ฐธ๊ณ : https://grafana.com/docs/mimir/latest/references/architecture/query-sharding/

๋ฏธ๋ฏธ๋ฅด๋Š” ํ•˜๋‚˜์˜ ์ฟผ๋ฆฌ๋ฅผ ์—ฌ๋Ÿฌ ๊ธฐ๊ณ„์—์„œ ๋™์‹œ์— ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ์ฟผ๋ฆฌ ์ƒค๋”ฉ ๊ธฐ๋Šฅ์„ ํฌํ•จํ•˜๊ณ  ์žˆ๋‹ค.
์ฟผ๋ฆฌ ์ƒค๋”ฉ ๊ธฐ๋Šฅ์€ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๋ฅผ ์ตœ์ ํ™”ํ•˜๊ณ , ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ์…‹์— ๋Œ€ํ•œ ์ฟผ๋ฆฌ ์‘๋‹ต ์‹œ๊ฐ„์„ ๋‹จ์ถ•์‹œ์ผœ, ๋” ๋น ๋ฅด๊ณ  ํšจ์œจ์ ์ธ ๋ฐ์ดํ„ฐ ์ฟผ๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋œ๋‹ค.

์ฟผ๋ฆฌ ์ƒค๋”ฉ์€ ์•„๋ž˜์™€ ๊ฐ™์ด ๋™์ž‘ํ•œ๋‹ค.

  1. ๋ฐ์ดํ„ฐ์…‹ ๋ถ„ํ• : Mimir๋Š” ํฐ ๋ฐ์ดํ„ฐ์…‹์„ ๋” ์ž‘์€ ์กฐ๊ฐ๋“ค๋กœ ๋‚˜๋ˆˆ๋‹ค. ์ด๋•Œ ์ด ์ž‘์€ ์กฐ๊ฐ๋“ค์„ '์ƒค๋“œ(shards)'๋ผ๊ณ  ํ•œ๋‹ค.
  2. ๋ถ€๋ถ„ ์ฟผ๋ฆฌ ์ƒ์„ฑ: ๊ฐ ์ƒค๋“œ๋Š” ๋ณ„๋„์˜ ๋ถ€๋ถ„ ์ฟผ๋ฆฌ(partial query)์— ํ•ด๋‹นํ•˜๋ฉฐ, ์ด๋Ÿฌํ•œ ๋ถ€๋ถ„ ์ฟผ๋ฆฌ๋“ค์ด ๋‹ค๋ฅธ ์ฟผ๋ฆฌ์–ด(queriers)์—์„œ ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰๋œ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํ•˜๋‚˜์˜ ํฐ ์ฟผ๋ฆฌ๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ž‘์€ ์ฟผ๋ฆฌ๋กœ ๋‚˜๋ˆ„์–ด ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด, ์ฒ˜๋ฆฌ ์‹œ๊ฐ„์ด ๋‹จ์ถ•๋˜๊ณ  ์‹œ์Šคํ…œ์˜ ์ „์ฒด์ ์ธ ์„ฑ๋Šฅ์ด ํ–ฅ์ƒ๋œ๋‹ค.
  3. ์ฟผ๋ฆฌ ๋ถ„๋ฐฐ: ์ฟผ๋ฆฌ-ํ”„๋ก ํŠธ์—”๋“œ(query-frontend)๋Š” ์ด ๋ถ€๋ถ„ ์ฟผ๋ฆฌ๋“ค์„ ์„œ๋กœ ๋‹ค๋ฅธ ์ฟผ๋ฆฌ์–ด์—๊ฒŒ ๋ถ„๋ฐฐํ•˜์—ฌ ๋™์‹œ์— ์‹คํ–‰ํ•˜๋„๋ก ํ•œ๋‹ค.
    ์ฟผ๋ฆฌ์–ด๋Š” Mimir ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด์˜ ์„œ๋ฒ„๋กœ, ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.
  4. ๊ฒฐ๊ณผ ์ง‘๊ณ„: ๊ฐ ์ฟผ๋ฆฌ์–ด์—์„œ ์‹คํ–‰๋œ ๋ถ€๋ถ„ ์ฟผ๋ฆฌ์˜ ๊ฒฐ๊ณผ๋Š” ๋‹ค์‹œ ์ฟผ๋ฆฌ-ํ”„๋ก ํŠธ์—”๋“œ๋กœ ๋ฐ˜ํ™˜๋˜๋ฉฐ, ์—ฌ๊ธฐ์—์„œ ์ด๋Ÿฌํ•œ ๊ฒฐ๊ณผ๋“ค์ด ์ง‘๊ณ„๋˜์–ด ์ตœ์ข… ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ํ˜•์„ฑํ•œ๋‹ค. ๊ฒฐ๊ณผ ์ง‘๊ณ„๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž๋Š” ์›๋ž˜์˜ ํ•˜๋‚˜์˜ ํฐ ์ฟผ๋ฆฌ์— ๋Œ€ํ•œ ์ „์ฒด์ ์ธ ๊ฒฐ๊ณผ๋ฅผ ์–ป๊ฒŒ ๋œ๋‹ค.

์ฟผ๋ฆฌ ์ƒค๋”ฉ์€ query์™€ query_range API์—์„œ๋งŒ ์ ์šฉ๋œ๋‹ค.

๋ชจ๋“  ์ฟผ๋ฆฌ์—์„œ ์ƒค๋”ฉ์ด ๊ฐ€๋Šฅํ•œ๊ฑด ์•„๋‹ˆ๋‹ค. ์ „์ฒด์ฟผ๋ฆฌ๋Š” ์ƒค๋”ฉํ•  ์ˆ˜ ์—†์ง€๋งŒ ์ฟผ๋ฆฌ ๋‚ด๋ถ€ ๋ถ€๋ถ„์€ ์ƒค๋”ฉํ•  ์ˆ˜ ์žˆ๋‹ค.
ํŠนํžˆ ์—ฐ๊ด€ ์ง‘๊ณ„(์˜ˆ sum: , min, max, count, avg)๋Š” ์ƒค๋”ฉ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ์ผ๋ถ€ ์ฟผ๋ฆฌ ํ•จ์ˆ˜(์˜ˆ absent: , absent_over_time, histogram_quantile, sort_desc, sort)๋Š” ์ƒค๋”ฉ ๊ฐ€๋Šฅํ•˜์ง€ ์•Š๋‹ค.

์ฟผ๋ฆฌ ์ƒค๋”ฉ์˜ ์˜ˆ์‹œ๋ฅผ ํ™•์ธํ•ด๋ณด์ž.

์ฟผ๋ฆฌ์ƒค๋”ฉ ์˜ˆ์‹œ 1. ์ „์ฒด์ฟผ๋ฆฌ ์ƒค๋”ฉ

์‚ฌ์šฉ์ž๊ฐ€ ์•„๋ž˜์™€ ๊ฐ™์€ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

sum(rate(metric[1m]))

์ฟผ๋ฆฌ ํ”„๋ก ํŠธ์—”๋“œ๋Š” ์ฟผ๋ฆฌ๋ฅผ ์ƒค๋”ฉํ•œ๋‹ค.
์ด๋•Œ __query_shard__ ๋ถ€๋ถ„์€ ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰๋˜๋ฉฐ, concat์€ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๊ฐ€ ์ฟผ๋ฆฌ ํ”„๋ŸฐํŠธ์—”๋“œ์— ์˜ํ•ด ์—ฐ๊ฒฐ/๋ณ‘ํ•ฉ๋˜๋Š” ๊ฒƒ์„ ํ‘œํ˜„ํ•œ๋‹ค.

# 3๊ฐœ ์ƒค๋“œ๋กœ ๋ถ„ํ• 
sum(
  concat(
    sum(rate(metric{__query_shard__="1_of_3"}[1m]))
    sum(rate(metric{__query_shard__="2_of_3"}[1m]))
    sum(rate(metric{__query_shard__="3_of_3"}[1m]))
  )
)

์ฟผ๋ฆฌ์ƒค๋”ฉ ์˜ˆ์‹œ2. ๋‚ด๋ถ€ ์ฟผ๋ฆฌ ์ƒค๋”ฉ

์‚ฌ์šฉ์ž๊ฐ€ ์•„๋ž˜์™€ ๊ฐ™์€ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ–ˆ๋‹ค.
์œ„์—์„œ ์–ธ๊ธ‰ํ•œ๋ฐ๋กœ, histogram_quantile๋Š” ์ฟผ๋ฆฌ ์ƒค๋”ฉ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

histogram_quantile(0.99, sum by(le) (rate(metric[1m])))

์ด๋•Œ ์ „์ฒด ์ฟผ๋ฆฌ ์ƒค๋”ฉ์€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋”๋ผ๋„ ๋‚ด๋ถ€ ๋ถ€๋ถ„(Inner part)๋Š” ์ฟผ๋ฆฌ๋ฅผ ์ƒค๋”ฉํ•œ๋‹ค.

# 3๊ฐœ ์ƒค๋“œ๋กœ ๋ถ„ํ• 
histogram_quantile(0.99, sum by(le) (
  concat(
    sum by(le) (rate(metric{__query_shard__="1_of_3"}[1m]))
    sum by(le) (rate(metric{__query_shard__="2_of_3"}[1m]))
    sum by(le) (rate(metric{__query_shard__="3_of_3"}[1m]))
  )
))

์ฟผ๋ฆฌ์ƒค๋”ฉ ์˜ˆ์‹œ3. ๋‘ ๊ฐœ์˜ ์ƒค๋”ฉ ๊ฐ€๋Šฅํ•œ ๋ถ€๋ถ„์œผ๋กœ ์ฟผ๋ฆฌ

์‚ฌ์šฉ์ž๊ฐ€ ์•„๋ž˜์™€ ๊ฐ™์€ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

sum(rate(failed[1m])) / sum(rate(total[1m]))

์ด๋•Œ, ์ฟผ๋ฆฌ ํ”„๋ก ํŠธ์—”๋“œ๋Š” ๊ฐ๊ฐ ๋‘ ๋ถ€๋ถ„์„ ์ƒค๋”ฉํ•˜์—ฌ ์ฟผ๋ฆฌํ•˜๊ณ , ์ฟผ๋ฆฌํ”„๋ก ํŠธ์—”๋“œ์—์„œ ์ฟผ๋ฆฌ๋ฅผ ๋ณ‘ํ•ฉํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

sum(
  concat( # 3๊ฐœ ์ƒค๋“œ๋กœ ๋ถ„ํ• 
    sum (rate(failed{__query_shard__="1_of_3"}[1m]))
    sum (rate(failed{__query_shard__="2_of_3"}[1m]))
    sum (rate(failed{__query_shard__="3_of_3"}[1m]))
  )
)
/
sum(
  concat( # 3๊ฐœ ์ƒค๋“œ๋กœ ๋ถ„ํ• 
    sum (rate(total{__query_shard__="1_of_3"}[1m]))
    sum (rate(total{__query_shard__="2_of_3"}[1m]))
    sum (rate(total{__query_shard__="3_of_3"}[1m]))
  )
)

 

4.4 ํ…œํฌ ์ถ”์ ๊ด€๋ฆฌ

 

4.4.1 ํ…œํฌ ๊ธฐ๋Šฅ

 

Grafana Tempo ์•„ํ‚คํ…์ณ

์ฐธ๊ณ :https://grafana.com/docs/tempo/latest/operations/architecture/

Grafana Tempo๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ํŠน์ง•์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

  • OpenTelemetry๋ฅผ ํฌํ•จํ•œ ๋‹ค์–‘ํ•œ ์ถ”์  ํ”„๋กœํ† ์ฝœ์„ ์ง€์›ํ•œ๋‹ค.
  • ํŠน์ • ์Šคํ† ๋ฆฌ์ง€์— ์ข…์†๋˜์ง€ ์•Š๊ณ , ๊ฐ์ฒด ์Šคํ† ๋ฆฌ์ง€๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. (S3, GCS, Azure Blob Storage)
  • ๋ฉ”ํŠธ๋ฆญ, ๋กœ๊ทธ์™€ ๊ธด๋ฐ€ํ•˜๊ฒŒ ํ†ตํ•ฉํ•œ๋‹ค.
  • ๋ฉ”ํŠธ๋ฆญ์ƒ์„ฑ๊ธฐ(metric generator)๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์„œ๋น„์Šค ๊ทธ๋ž˜ํ”„์™€ ์ด๊ทธ์žผ๋ธ”๋Ÿฌ(examplar)๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
  • ํ”„๋กœ๋ฉ”ํ…Œ์šฐ์Šค ๊ธฐ๋ฐ˜์ด๋ฉฐ, Loki, Mimir ๋“ฑ๊ณผ ์œ ์‚ฌํ•œ ๊ตฌ์„ฑ์š”์†Œ๋กœ ์šด์˜๋œ๋‹ค.

https://grafana.com/docs/tempo/latest/operations/architecture/

์•„ํ‚คํƒ์ณ๋ฅผ ๋ณด๋ฉด ์ •๋ง Loki, Mimir์™€ ๊ฐ™์€ ๊ตฌ์„ฑ์š”์†Œ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋Š”๊ฑธ ์•Œ ์ˆ˜ ์žˆ๋‹ค.
๊ฐ ์ปดํฌ๋„ŒํŠธ์˜ ํŠน์ง•์€ ์œ„์— Loki, Mimir์—์„œ ๋‹ค๋ฃจ์—ˆ์œผ๋‹ˆ ๊ฐ„๋‹จํ•˜๊ฒŒ๋งŒ ์•Œ์•„๋ณด๊ณ  ๋„˜์–ด๊ฐ€๋„๋ก ํ•˜์ž

  • distributor
    • Jaeger, OpenTelemetry, Zipkin์„ ํฌํ•จํ•œ ์—ฌ๋Ÿฌ ํ˜•์‹์˜ ์ŠคํŒฌ์„ ํ—ˆ์šฉํ•œ๋‹ค. 
    • traceID๋ฅผ ํ•ด์‹ฑํ•˜๊ณ  ์ผ๊ด€๋œ ํ•ด์‹œ ๋ง์„ ์‚ฌ์šฉํ•˜์—ฌ ์ŠคํŒฌ์„ Ingester๋กœ ๋ผ์šฐํŒ… ํ•œ๋‹ค.
    • OpenTelemetry Collector ์˜ receiver layer๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
    • ์ตœ์ƒ์˜ ์„ฑ๋Šฅ์„ ์œ„ํ•ด OTel Proto ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๊ฒƒ์ด ์ข‹๋‹ค. (์„ฑ๋Šฅ์„ ์œ„ํ•ด Grafana ์—์ด์ „ํŠธ๋Š” otlp exporter/receiver๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ŠคํŒฌ์„ Tempo๋กœ ์ „์†กํ•œ๋‹ค.)
  • Ingester
    • trace๋ฅผ ๋ธ”๋ก์œผ๋กœ ๋ฐฐ์น˜ํ•˜๊ณ , bloom filters ์™€ indexes๋ฅผ ์ƒ์„ฑํ•œ ๋‹ค์Œ, ๋ชจ๋‘ ๋ฐฑ์—”๋“œ๋กœ ํ”Œ๋Ÿฌ์‹œ ํ•œ๋‹ค.
    • ๋ฐฑ์—”๋“œ์˜ ๋ธ”๋ก์€ ์•„๋ž˜์™€ ๊ฐ™์ด ์ƒ์„ฑ๋œ๋‹ค.
<bucketname> / <tenantID> / <blockID> / <meta.json>
                                      / <index>
                                      / <data>
                                      / <bloom_0>
                                      / <bloom_1>
                                        ...
                                      / <bloom_n>
  • Query frontend
    • ๋“ค์–ด์˜ค๋Š” ์ฟผ๋ฆฌ์— ๋Œ€ํ•œ ๊ฒ€์ƒ‰ ๊ณต๊ฐ„์„ ๋ถ„ํ• (์ƒค๋”ฉ)ํ•˜๋Š” ์—ญํ• ์„ ๋‹ด๋‹นํ•œ๋‹ค.
    • ์ถ”์ฒ™์€ HTTP์—”๋“œํฌ์ธํŠธ GET /api/traces/<traceID> ์— ๋…ธ์ถœ๋œ๋‹ค.
    • ๋‚ด๋ถ€์ ์œผ๋กœ ์ฟผ๋ฆฌ ํ”„๋ก ํŠธ์—”๋“œ๋Š” ๋ธ”๋กID ๊ณต๊ฐ„์„ ๊ตฌ์„ฑ ๊ฐ€๋Šฅํ•œ ์ˆ˜์˜ ์ƒค๋“œ๋กœ ๋ถ„ํ• ํ•˜๊ณ  ์ด๋Ÿฌํ•œ ์š”์ฒญ์„ ํ์— ๋„ฃ๋Š”๋‹ค.
      Querier๋Š” gRPC ์—ฐ๊ฒฐ์„ ํ†ตํ•ด ์ฟผ๋ฆฌ ํ”„๋ก ํŠธ์—”๋“œ์— ์—ฐ๊ฒฐํ•˜์—ฌ ์ด๋Ÿฌํ•œ ์ƒค๋“œ ์ฟผ๋ฆฌ๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • Querier
    • ์ฟผ๋ฆฌ์–ด๋Š” Ingester ๋˜๋Š” ๋ฐฑ์—”๋“œ ์ €์žฅ์†Œ์—์„œ ์š”์ฒญ๋œ ์ถ”์  ID๋ฅผ ์ฐพ๋Š”๋‹ค.
    • ์ฟผ๋ฆฌ์–ด๋Š” HTTP ์—”๋“œํฌ์ธํŠธ GET /querier/api/traces/<traceID>์— ๋…ธ์ถœ๋˜๋‚˜, ์ง์ ‘ ์‚ฌ์šฉํ•˜์ง€๋Š” ์•Š๋Š”๋‹ค.
    • ๋งค๊ฐœ๋ณ€์ˆ˜์— ๋”ฐ๋ผ Ingester ๋ฐ ๋ธ”๋ฃธ/์ธ๋ฑ์Šค๋ฅผ ๊ฐ€์ ธ์™€์„œ ๊ฐœ์ฒด ์ €์žฅ์†Œ์˜ ๋ธ”๋ก์„ ๊ฒ€์ƒ‰ํ•œ๋‹ค.
  • Compactor
    • ๋ธ”๋ก์„ ๋ถ„์„ํ•˜๊ณ  ํ…Œ๋„ŒํŠธ์˜ ์—ฌ๋Ÿฌ ๋ธ”๋ก์„ ํ•˜๋‚˜์˜ ์ตœ์ ํ™”๋œ ๋” ํฐ ๋ธ”๋ก์œผ๋กœ ์••์ถ•ํ•˜์—ฌ ์ด ๋ธ”๋ก์ˆ˜๋ฅผ ์ค„์ธ๋‹ค.
  • Metrics generator
    • ์ˆ˜์ง‘๋œ ํŠธ๋ ˆ์ด์Šค์—์„œ ๋ฉ”ํŠธ๋ฆญ์„ ์ถ”์ถœํ•˜์—ฌ ๋ฉ”ํŠธ๋ฆญ ์ €์žฅ์†Œ์— ๊ธฐ๋กํ•˜๋Š” ์„ ํƒ์  ๊ตฌ์„ฑ ์š”์†Œ์ด๋‹ค.
      ์ฐธ๊ณ : metrics-generator documentation

 

Tempo ์ผ๊ด€๋œ ํ•ด์‹œ๋ง

์ฐธ๊ณ : https://grafana.com/docs/tempo/latest/operations/consistent_hash_ring/

Tempo๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ Cortex์˜ ์ผ๊ด€๋œ ํ•ด์‹œ๋ง์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ, ํ•„์š”ํ•œ ๊ฒฝ์šฐ  Consul ๋˜๋Š”  Etcd ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
๊ตฌ์„ฑ๋œ ๋ง ๋‚ด์˜ ๋ชจ๋“  ํ…œํฌ ์ปดํฌ๋„ŒํŠธ๊ฐ„์—๋Š” ๊ฐ€์‹ญํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•œ๋‹ค.

์•„๋ž˜๋Š” Tempo์—์„œ ์‚ฌ์šฉํ•˜๋Š” 4๊ฐ€์ง€ ํ•ด์‹œ๋ง์— ๋Œ€ํ•œ ์„ค๋ช…์ด๋‹ค.

  • Distributor
    • ์ฐธ๊ฐ€์ž: Distributor
    • ์‚ฌ์šฉ๋Œ€์ƒ: Distributor
    • ๊ฒฝ๋กœ: /distributor/ring
    • ์ด ๋ง์€ ๊ธ€๋กœ๋ฒŒ ์†๋„์ œํ•œ(global rate limits)์—๋งŒ ์‚ฌ์šฉ๋œ๋‹ค.
    • Distributor๋Š” ์ด ๋ง์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค๋ฅธ ํ™œ์„ฑ Distributor๋ฅผ ๊ณ„์‚ฐํ•œ๋‹ค.
    • ๋“ค์–ด์˜ค๋Š” ํŠธ๋ž˜ํ”ฝ์€ ๋ชจ๋“  Distributor์— ๊ท ๋“ฑํ•˜๊ฒŒ ๋ถ„์‚ฐ๋˜์–ด์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ  global_rate_limit / # of distributors ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋กœ์ปฌ ์†๋„ ์ œํ•œ์„ ์„ค์ •ํ•œ๋‹ค.
  • Ingester
    • ์ฐธ๊ฐ€์ž: Ingester
    • ์‚ฌ์šฉ๋Œ€์ƒ: Distributors, Queriers
    • ๊ฒฝ๋กœ:  /ingester/ring
    • ์ด ๋ง์€ Distributor๊ฐ€ ํŠธ๋ž˜ํ”ฝ์„ Ingester๋กœ ๋กœ๋“œ๋ฒจ๋Ÿฐ์‹ฑํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•œ๋‹ค.
      ์ŠคํŒฌ์ด ์ˆ˜์‹ ๋˜๋ฉด TraceID๊ฐ€ ํ•ด์‹œ๋˜๊ณ  ๋ง์˜ ํ† ํฐ ์†Œ์œ ๊ถŒ์— ๋”ฐ๋ผ ์ ์ ˆํ•œ Ingester๋กœ ์ „์†ก๋œ๋‹ค.
    • Querier๋Š” ์ด ๋ง์„ ์‚ฌ์šฉํ•˜์—ฌ ์ตœ๊ทผ ์ถ”์ ์„ ์ฟผ๋ฆฌํ•  Ingester๋ฅผ ์ฐพ๋Š”๋‹ค.
  • Metrics-generator
    • ์ฐธ๊ฐ€์ž: Metrics-generators
    • ์‚ฌ์šฉ๋Œ€์ƒ: Distributors
    • ๊ฒฝ๋กœ: /metrics-generator/ring
    • ์ด ๋ง์€ Distributors๊ฐ€ ํŠธ๋ž˜ํ”ฝ์„ Metrics-generators๋กœ ๋กœ๋“œ๋ฒจ๋Ÿฐ์‹ฑํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•œ๋‹ค.
      ์ŠคํŒฌ์ด ์ˆ˜์‹ ๋˜๋ฉด TracdID๊ฐ€ ํ•ด์‹œ๋˜๊ณ  ๋ง์˜ ํ† ํฐ ์†Œ์œ ๊ถŒ์— ๋”ฐ๋ผ ์ ์ ˆํ•œ Metrics-generators๋กœ ์ „์†ก๋œ๋‹ค.
  • Compactor
    • ์ฐธ๊ฐ€์ž: Compactor
    • ์‚ฌ์šฉ๋Œ€์ƒ: Compactor
    • ๊ฒฝ๋กœ:  /compactor/ring
    • ์ด ๋ง์€ ์ปดํŒฉํ„ฐ๊ฐ€ ์••์ถ• ์ž‘์—…์„ ๋ถ„ํ• ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•œ๋‹ค.
    • ์ž‘์—…์€ ๋ง์œผ๋กœ ํ•ด์‹œ๋˜๊ณ , ์†Œ์œ ํ•œ ์ปดํŒฉํ„ฐ๋งŒ์ด ํŠน์ • ๋ธ”๋ก์„ธํŠธ๋ฅผ ์••์ถ•ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉ๋˜์–ด ์••์ถ•์‹œ ๊ฒฝ์Ÿ์กฐ๊ฑด์„ ๋ฐฉ์ง€ํ•œ๋‹ค.

 

Tempo ์šด์˜์‹œ ๊ถŒ์žฅ์‚ฌํ•ญ

  1. ์ฝ๊ธฐ์— ์บ์‹œ๋ฅผ ํ™œ์šฉํ•ด์•ผํ•œ๋‹ค. ์ฐธ๊ณ : Improve performance with caching 
    • ๋ธ”๋ก์Šคํ† ๋ฆฌ์ง€์™€ WAL์—์„œ ์ฝ๋Š”๊ฒƒ์€ ์บ์‹œ๋ณด๋‹ค ๋Š๋ฆฌ๋‹ค.
    • ์บ์‹œ์˜ ์šฉ๋Ÿ‰์„ ํ™•๋ณดํ•˜๊ณ  ๊ฐ€๋Šฅํ•˜๋ฉด ์บ์‹œ์—์„œ ๊ฒฐ๊ณผ๋ฅผ ์กฐํšŒํ•˜๋„๋ก ํ•œ๋‹ค.
    • ๋˜ํ•œ ์ฃผ๊ธฐ์ ์œผ๋กœ ์‹คํ–‰๋˜๋ฉด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐฑ์‹ ํ•˜๋Š” ๋Œ€์‹œ๋ณด๋“œ๋„ ์บ์‹œ์—์„œ ์ฝ๋„๋ก ๋ณ€๊ฒฝํ•˜๋Š”๊ฒƒ์„ ๊ถŒ์žฅํ•œ๋‹ค.
    • ์˜ค๋ž˜๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ธ”๋ก์Šคํ† ๋ฆฌ์ง€์—์„œ ์กฐํšŒํ•˜๋ฉด ์†๋„๊ฐ€ ๋Š๋ ค์ง„๋‹ค.
  2. ๋ณ‘๋ ฌ์ฒ˜๋ฆฌ๊ฐ€ ์ž˜ ์ด๋ฃจ์–ด์ง€๊ณ  ์žˆ๋Š”์ง€ ์กฐ์‚ฌํ•œ๋‹ค.
    • ๋Œ€์šฉ๋Ÿ‰ ์ฟผ๋ฆฌ๋ฅผ ๋ถ„ํ• ํ•˜๊ณ  ๋ณ‘๋ ฌ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋ฉด ํ›จ์”ฌ ๋น ๋ฅด๊ฒŒ ์ฝ๊ธฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.
  3. ์ธ์ œ์Šคํ„ฐ์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ถฉ๋ถ„ํžˆ ํ• ๋‹นํ•œ๋‹ค.
    • ์ธ์ œ์Šคํ„ฐ๋Š” ๋‹ค์ˆ˜์˜ replication_factor๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ๊ด€๋ฆฌํ•˜๊ณ , ๋‹ค๋ฅธ ๊ตฌ์„ฑ์š”์†Œ์™€ ์ƒํ˜ธ์ž‘์šฉ์„ ํ•„์š”๋กœ ํ•˜๋Š” ๋ฌด๊ฑฐ์šด ํ”„๋กœ์„ธ์Šค๋‹ค.
    • ํ”Œ๋Ÿฌ์‹œ ์ฃผ๊ธฐ๊ฐ€ ๋‘์‹œ๊ฐ„์ด๋ผ๋ฉด, ์ธ์ œ์Šคํ„ฐ๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ์— ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๊ด€ํ•˜๊ณ  ๋‘์‹œ๊ฐ„๋งˆ๋‹ค ๋””์Šคํฌ์— ๋ธ”๋ก์„ ์ƒ์„ฑํ•˜๊ธฐ๋•Œ๋ฌธ์ด๋‹ค.
  4. ๊ฐœ๋ณ„ ํŒŒ๋ผ๋ฉ”ํ„ฐ ํŠœ๋‹๋ณด๋‹ค ์ƒค๋“œ์˜ ์ˆ˜๋ฅผ ๋Š˜๋ ค์•ผํ•œ๋‹ค.
    • ์˜คํ† ์Šค์ผ€์ผ๋ง์„ ์ ์šฉํ•ด์„œ ์ƒค๋“œ๋ฅผ ๋Š˜๋ฆฌ๊ณ  ์ถฉ๋ถ„ํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ํ™•๋ณดํ•œ๋‹ค.
    • ์Šค์ผ€์ผ ์ธ ์‹œ์—๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์œ ์‹ค๋˜์ง€ ์•Š๋„๋ก ํŠนํžˆ ์ฃผ์˜ํ•ด์•ผํ•œ๋‹ค
    • ๋ฐ์ดํ„ฐ๊ฐ€ ์œ ์‹ค๋˜์ง€ ์•Š๋„๋ก ๋ฆฌ๋ฒจ๋Ÿฐ์‹ฑ์ด ์ž์ฃผ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋„๋ก ์ฃผ์˜ํ•˜๊ณ , ๊ฐ€๊ธ‰์  WAL๊ณผ ๋ ˆํ”Œ๋ฆฌ์ผ€์ด์…˜ ํŒฉํ„ฐ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ณต๊ตฌ๋ฅผ ์ง„ํ–‰ํ•œ๋‹ค.

 

4.5 Jeager ์ถ”์ ๊ด€๋ฆฌ

 

4.5.1 Jeager ๊ตฌ์„ฑ

 

4.4์—์„œ ์•Œ์•„๋ดค๋˜ Tempo๋Š” ๋ฉ€ํ‹ฐํ…Œ๋„ŒํŠธ, ๊ฐ์ฒด์Šคํ† ๋ฆฌ์ง€, ์ŠคํŒฌ๋ฉ”ํŠธ๋ฆญ๊ณผ ์„œ๋น„์Šค๋งต์˜ ์ž๋™์ƒ์„ฑ, ์ƒ๊ด€๊ด€๊ณ„๊ตฌํ˜„์ด ์‰ฝ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์—ˆ๋‹ค.
Jeager๋Š” ๊ฐ์ฒด์Šคํ† ๋ฆฌ์ง€๋ฅผ ์ œ์™ธํ•œ ๋‹ค์–‘ํ•œ ๋ฐฑ์—”๋“œ ์Šคํ† ๋ฆฌ์ง€๋ฅผ ์ง€์›ํ•˜๊ณ , ํ”„๋กœํŒŒ์ผ๊ณผ์˜ ์†์‰ฌ์šด ์—ฐ๊ณ„, ์ŠคํŒฌ ๋ฉ”ํŠธ๋ฆญ ์ž๋™์ƒ์„ฑ, ๊ทผ๋ณธ์›์ธ ๋ถ„์„๋“ฑ์˜ ์žฅ์ ์ด ์žˆ๋‹ค. 

์•„๋ž˜์˜ ํ‘œ๋Š” ์ฐธ๊ณ ํ•  ์ˆ˜์žˆ๋„๋ก ๊ฐ€์ ธ์™€ ๋ดค๋‹ค.

https://codersociety.com/blog/articles/jaeger-vs-zipkin-vs-tempo

 

Jeager ์•„ํ‚คํ…์ณ ๋ฐ ์ฃผ์š” ์ปดํฌ๋„ŒํŠธ

์ฐธ๊ณ :https://grafana.com/docs/tempo/latest/operations/architecture/

https://www.jaegertracing.io/docs/1.55/architecture/

Jeager ์—ญ์‹œ ์ฝ๊ธฐ์™€ ์“ฐ๊ธฐ๊ฐ€ ๋ถ„๋ฆฌ๋˜์—ˆ๋‹ค.
Jeager SDKs, Agent(2024๋…„ 3์›” ๊ธฐ์ค€ Agent๋Š” deprecated๋˜์—ˆ๋‹ค)์™€ ์ปฌ๋ ‰ํ„ฐ๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์“ฐ๊ธฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ , ์ฝ๊ธฐ๋Š” Jeager UI์—์„œ ์ฟผ๋ฆฌ๋ฅผ ํ†ตํ•ด ์ˆ˜ํ–‰ํ•œ๋‹ค.
Spark jobs์„ ํ†ตํ•ด์„œ ์ƒค๋”ฉ๊ณผ ํŒŒํ‹ฐ์…”๋‹์„ ๊ตฌํ˜„ํ•œ๋‹ค.

Jeager์˜ ๊ตฌ์„ฑ์š”์†Œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.
์ฐธ๊ณ : https://www.jaegertracing.io/docs/1.55/deployment

  • Agent (2024๋…„ 3์›” ๊ธฐ์ค€ Agent๋Š” deprecated๋˜์—ˆ๋‹ค)
    • UDP๋ฅผ ํ†ตํ•ด ์ถ”์  ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์‹ ํ•˜๊ณ  ํ˜ธ์ŠคํŠธ ์—์ด์ „ํŠธ/๋ฐ๋ชฌ ๋˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‚ฌ์ด๋“œ์นด๋กœ ๊ฐ ํ˜ธ์ŠคํŠธ์—์„œ ๋กœ์ปฌ๋กœ ์‹คํ–‰๋˜๋„๋ก ์„ค๊ณ„๋˜์—ˆ๋‹ค. 

Docker๋กœ ์‹คํ–‰๋ฐฉ๋ฒ• ๋”๋ณด๊ธฐ ๐Ÿ‘‡

๋”๋ณด๊ธฐ
docker run \
  --rm \
  -p5775:5775/udp \
  -p6831:6831/udp \
  -p6832:6832/udp \
  -p5778:5778/tcp \
  jaegertracing/jaeger-agent:1.55 \
  --reporter.grpc.host-port=jaeger-collector.jaeger-infra.svc:14250
  • Collector
    • ์ถ”์ ์„ ์ˆ˜์‹ ํ•˜๊ณ , ์ฒ˜๋ฆฌ ํŒŒ์ดํ”„๋ผ์ธ์„ ํ†ตํ•ด ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ๋ฐ ์ •๋ฆฌ/๋ณด๊ฐ•์„ ์œ„ํ•ด ์‹คํ–‰ํ•œ ๋‹ค์Œ, ์Šคํ† ๋ฆฌ์ง€ ๋ฐฑ์—”๋“œ์— ์ €์žฅํ•œ๋‹ค.
    • stateless ์ปดํฌ๋„ŒํŠธ๋กœ, ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ์—ฌ๋Ÿฌ ์Šคํ† ๋ฆฌ์ง€ ๋ฐฑ์—”๋“œ์— ๋Œ€ํ•œ ๊ธฐ๋ณธ ์ง€์›(๋ฐฐํฌ ์ฐธ์กฐ)๊ณผ ์‚ฌ์šฉ์ž ์ •์˜ ์Šคํ† ๋ฆฌ์ง€ ํ”Œ๋Ÿฌ๊ทธ์ธ ๊ตฌํ˜„์„ ์œ„ํ•œ ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ํ•จ๊ป˜ ์ œ๊ณต๋œ๋‹ค. 

Docker๋กœ ์‹คํ–‰๋ฐฉ๋ฒ• ๋”๋ณด๊ธฐ ๐Ÿ‘‡

๋”๋ณด๊ธฐ
docker run \
  --rm \
  -p14268:14268 \
  -p14250:14250 \
  -p9411:9411 \
  jaegertracing/jaeger-collector:1.55 \
  --storage.type=elasticsearch \
  --es.server-urls=http://elasticsearch:9200
  • Query
    • ์Šคํ† ๋ฆฌ์ง€์—์„œ ์ถ”์ ์„ ๊ฒ€์ƒ‰ํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ์ด๋‹ค.

Docker๋กœ ์‹คํ–‰๋ฐฉ๋ฒ• ๋”๋ณด๊ธฐ ๐Ÿ‘‡

๋”๋ณด๊ธฐ
docker run \
  --rm \
  -p16686:16686 \
  jaegertracing/jaeger-query:1.55 \
  --query.service-name=jaeger-query \
  --query.base-path=/jaeger \
  --storage.type=elasticsearch \
  --es.server-urls=http://elasticsearch:9200
  • Ingester
    • ์—๊ฑฐ๋Š” ์ˆ˜์ง‘๊ธฐ์™€ ์‹ค์ œ ๋ฐฑ์—… ์Šคํ† ๋ฆฌ์ง€(ElasticSearch)๊ฐ„์˜ ๋ฒ„ํผ๋กœ ์นดํ”„์นด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
    • Ingester๋Š” ์นดํ”„์นด์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ณ  ๋‹ค๋ฅธ ์Šคํ† ๋ฆฌ์ง€ ๋ฐฑ์—”๋“œ์— ์“ฐ๋Š” ์„œ๋น„์Šค๋‹ค.

Docker๋กœ ์‹คํ–‰๋ฐฉ๋ฒ• ๋”๋ณด๊ธฐ ๐Ÿ‘‡

๋”๋ณด๊ธฐ
docker run \
  --rm \
  jaegertracing/jaeger-ingester:1.55 \
  --kafka.consumer.brokers=kafka-broker1:9092,kafka-broker2:9092 \
  --kafka.consumer.topic=jaeger-spans \
  --kafka.consumer.group-id=jaeger-ingester \
  --storage.type=elasticsearch \
  --es.server-urls=http://elasticsearch:9200

 

Jeager helm ์„ค์น˜

์ฐธ๊ณ ๋ฌธ์„œ: https://github.com/jaegertracing/helm-charts

# helm ๋ ˆํฌ์ง€ํ† ๋ฆฌ ์ถ”๊ฐ€
helm repo add jaegertracing https://jaegertracing.github.io/helm-charts

# ๋ ˆํฌ์ง€ํ† ๋ฆฌ ํ™•์ธ
helm search repo jaegertracing

# (์ฑ…์—์„œ)jeager ์„ค์น˜
# Hot ROD ๋ผ๋Š” ์˜ˆ์ œ๋ฅผ ํ•จ๊ป˜ ๋ฐฐํฌ (https://github.com/jaegertracing/jaeger/tree/main/examples/hotrod)
helm install jaegertracing/jaeger --set hotrod.enabled=true --generate-name

# ์ตœ๊ทผ์—” jeager-operator๋ฅผ ์„ค์น˜ํ•˜๋Š”๊ฒƒ ๊ฐ™์Œ
helm install jaeger-operator jaegertracing/jaeger-operator

 

 

4.5.2 Jeager ๋ฐ์ดํ„ฐ ๋ชจ๋ธ

์ด ์ฑ…์—์„œ๋Š” ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜๊ณ  ์žˆ์ง€๋งŒ, ์ „ํ˜€ ์•Œ์•„๋“ค์„ ์ˆ˜ ์—†๋Š” ๊ด€๊ณ„๋กœ (๋ฌธ์„œ๋„ ๋ชป์ฐพ์Œ ๐Ÿ˜“) ๋‚˜๋ฆ„๋Œ€๋กœ Jeager์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ์„ ์ดํ•ดํ•ด ๋ณด์ž.

๋จผ์ €, Jeager๋Š” OpenTracing Specification ์—์„œ ์˜๊ฐ์„ ๋ฐ›์€ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ๋กœ ์ถ”์  ๋ฐ์ดํ„ฐ๋ฅผ ํ‘œํ•œํ•˜๊ณ  ์žˆ์œผ๋ฉฐ,
๋ฐ์ดํ„ฐ ๋ชจ๋ธ์€ ๋…ผ๋ฆฌ์ ์œผ๋กœ OpenTelemetry Traces ์™€ ์œ ์‚ฌํ•˜๋‹ค.

๊ตฌ์กฐ์ฒด์— ๋Œ€ํ•œ ์–ธ๊ธ‰์„ ํ•˜๊ณ ์žˆ์œผ๋‹ˆ, ์ฝ”๋“œ์—์„œ ๊ตฌ์กฐ ๋ถ€๋ถ„์„ ๋ณต์‚ฌํ•ด์™€์„œ ์ดํ•ดํ•ด๋ณด์ž.

* Jeager์˜ ๊ตฌ์กฐ์ฒด(struct) ์ฐธ๊ณ ๋งํฌ: https://github.com/jaegertracing/jaeger/blob/main/model/json/model.go

const (
	ChildOf ReferenceType = "CHILD_OF"
	FollowsFrom ReferenceType = "FOLLOWS_FROM"
//..์ƒ๋žต..
)

// Trace ๊ตฌ์กฐ์ฒด
type Trace struct {
	TraceID   TraceID               `json:"traceID"` # ํŠน์ • ํŠธ๋ ˆ์ด์Šค๋ฅผ ์œ ์ผํ•˜๊ฒŒ ์‹๋ณ„ํ•˜๋Š” ID
	Spans     []Span                `json:"spans"`
	Processes map[ProcessID]Process `json:"processes"`
	Warnings  []string              `json:"warnings"`
}

// Span ๊ตฌ์กฐ์ฒด
type Span struct {
	TraceID       TraceID     `json:"traceID"` # ํŠน์ • ์ŠคํŒฌ์„ ์œ ์ผํ•˜๊ฒŒ ์‹๋ณ„ํ•˜๋Š” ID
	SpanID        SpanID      `json:"spanID"`
	ParentSpanID  SpanID      `json:"parentSpanID,omitempty"` // deprecated
	Flags         uint32      `json:"flags,omitempty"`
	OperationName string      `json:"operationName"`
	References    []Reference `json:"references"`
	StartTime     uint64      `json:"startTime"` 
	Duration      uint64      `json:"duration"`  
	Tags          []KeyValue  `json:"tags"` #  ํŠธ๋ ˆ์ด์Šค ๋ฐ์ดํ„ฐ์— ์ถ”๊ฐ€์ ์ธ ์ •๋ณด ๋ถ€์—ฌ (์ค‘์ฒฉ๋ถˆ๊ฐ€)
	Logs          []Log       `json:"logs"`
	ProcessID     ProcessID   `json:"processID,omitempty"`
	Process       *Process    `json:"process,omitempty"`
	Warnings      []string    `json:"warnings"`
}

// Reference ๊ตฌ์กฐ์ฒด
type Reference struct {
	RefType ReferenceType `json:"refType"` # ์ŠคํŒฌ๊ฐ„์˜ ์ฐธ์กฐ์œ ํ˜• (CHILD_OF/FOLLOWS_FROM)
	TraceID TraceID       `json:"traceID"`
	SpanID  SpanID        `json:"spanID"`
}

// Log ๊ตฌ์กฐ์ฒด (์ŠคํŒฌ์—์„œ ๋ฐœ์ƒํ•œ ๋กœ๊ทธ)
// ์ŠคํŒฌ์˜ ํŠน์ • ์‹œ์  ์ด๋ฒคํŠธ๋ฅผ ๊ตฌ์กฐํ™”๋œ ํ˜•ํƒœ๋กœ ๊ธฐ๋ก
type Log struct {
	Timestamp uint64     `json:"timestamp"`
	Fields    []KeyValue `json:"fields"`
}

// Process ๊ตฌ์กฐ์ฒด 
// ํ”„๋กœ์„ธ์Šค๋Š” ์ŠคํŒฌ์ด ๊ธฐ๋ก๋œ ์„œ๋น„์Šค์˜ ์ด๋ฆ„๊ณผ ์„œ๋น„์Šค๋ฅผ ์„ค๋ช…ํ•˜๋Š” ํƒœ๊ทธ(ํ‚ค-๊ฐ’ ์Œ,๋ฉ”ํƒ€๋ฐ์ดํ„ฐ)์ถ”๊ฐ€
type Process struct {
	ServiceName string     `json:"serviceName"`
	Tags        []KeyValue `json:"tags"`
}