๐ ์ด ๋ด์ฉ์ ์ฑ
๋ด์ฉ ๋ฉ๋ชจ์
๋๋ค.
๊ฐ์ธ์ ์ธ ์๊ฐ๊ณผ ๊ฒฝํ ๊ทธ๋ฆฌ๊ณ ์ฌ๋ฌ ์ก๋ด์ด ์์ผ๋, ์ฑ
์ ์ฝ์ผ๋ฉฐ ์๊ฒฌ์ ๋๋๊ณ ์ถ์๋ถ์ด ๋ด์ฃผ์๋ฉด ์ข๊ฒ ์ต๋๋ค.
์ด๋ฒ 4์ฅ์์๋ ๊ทธ๋ผํ๋ LGTM์คํ์ ์ค์นํ๊ณ , ๊ธฐ๋ฐ๊ธฐ์ ์ ์ดํดํ ์ ์๋๋ก ์ค๋ช ํ๋ค.
4.1 ๊ทธ๋ผํ๋ ๊ด์ธก๊ฐ๋ฅ์ฑ
4.1.1 ๋ชฉ์ ๊ณผ ๋ฒ์
์ด ์ฑ
์์ ๋งํ๋ ๊ด์ธก๊ฐ๋ฅ์ฑ์ LGTM Stack(Loki, Grafanam Tempo, Mimir)์ด๋ค.
๊ทธ ๋ง์ ํด ์ค์ LGTM Stack์ ์ ์ ํ ์ด์ ๋ ์๋์ ๊ฐ๋ค๊ณ ํ๋ค.
- ๋์ค์ ์ด๊ณ ๋ผ์ด์ ์ค์ ์์ ๋ก์ด ์คํ์์ค
- ์ง์์ ์ด๊ณ ์ฅ๊ธฐ์ ์ธ ๋ก๋๋งต๊ณผ ๋ง์ ์ปค๋ฎค๋ํฐ
- ๊ธฐ์ ์ ์ผ๋ก ์ฐ์ํ๊ณ ํด๋ฌ์คํฐ ๊ตฌ์์ด ๊ฐ๋ฅํ๋ฉฐ ๋ง์ API ์ ๊ณต
์๊ฐํด๋ณด๋ฉด ElastiSearch๋ ์ด์ ๋์ด์ ์คํ์์ค๊ฐ ์๋๋ผ OpenSearch๋ก ๊ฐ๋ผ์ ๋ฐ๋ฉด์ LGTM์ ์คํ์์ค๋ก ๋์์์ด ๊ฐ๋ฐ๋๊ณ ๊ด๋ฆฌ๋๋๊ฒ ๊ฐ๋ค. ์ด ์ฑ ์์ ๊ธฐ๋ฐ๊ธฐ์ ์ ๋ํด ๋ฐฐ์ฐ๋ฉด์๋ ์ผ๋ง๋ ๊ธฐ์ ์ ์ผ๋ก ์ฐ์ํ์ง๋ ํ์ธํ๊ธฐ๋๋ฌธ์ LGTM์ ์ ์ ํ ์ด์ ๋ ๋ฉ๋์ด ๊ฐ๋ฅํ๋ค. ๐
๊ทธ๋ผ LGTM Stack์ ๋ํด ์์๋ณด์!
- 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 ๋ฐ์ดํฐ ํ๋ฆ์ฒ๋ผ ๋ฐ์ดํฐ๊ฐ ์ฐ์ด๊ณ ์ฝํ๋ค.
์ด๋ ์ค์ํ๊ฒ ๋ด์ผํ ๋ถ๋ถ์ ํ์ธํด๋ณด์.
- 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์ ์ ๋ฌํ๋ ์ญํ ์ ํ๋ค.
๋์ํ๋ ์์๋ ์๋์ ๊ฐ๋ค.
- ์ ํจ์ฑ ๊ฒ์ฆ:
- ์์ ๋ ๋ก๊ทธ ๋ฐ์ดํฐ๊ฐ Loki์ ์ฌ์๊ณผ ์ผ์นํ๋์ง ํ์ธํ๋ค.
- ์ ํจํ ๋ ์ด๋ธ์ธ์ง, ํ์์คํฌํ๊ฐ ์ฌ๋ฐ๋ฅธ์ง, ๋ก๊ทธ ์ค์ด ๋๋ฌด ๊ธธ์ง ์์์ง ๋ฐ์ดํฐ๊ฐ ์ฒ๋ฆฌ ํ์ดํ๋ผ์ธ์ผ๋ก ์งํ๋๊ธฐ ์ ์ ๊ธฐ๋ณธ์ ์ธ ๊ฒ์ฆ์ ์ํํ๋ค.
- ํ
๋ํธ๋น ์ต๋ ๋นํธ ์ ์ก๋ฅ (Maximum per-tenent bitrate)๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์์ ๋ก๊ทธ์ ์๋๋ฅผ ์ ํํ๋ค.
์๋ฅผ๋ค์ด A ํ ๋ํธ์ ์๋์ ํ์ด 10MB/s๋ผ๋ฉด, ๋์คํธ๋ฆฌ๋ทฐํฐ๊ฐ 5๊ฐ์ผ๋ ๊ฐ 2MB/s๋ฅผ, ๋์คํธ๋ฆฌ๋ทฐํฐ๊ฐ 10๊ฐ์ผ๋ ๊ฐ 1MB/s๋ฅผ ์ฒ๋ฆฌํ๋๋ก ํ๋ค.์ด๋ฐ ๋น์จ ์ ํ(rate limiting)์ ํตํด ๋กํค ํด๋ฌ์คํฐ๋ฅผ ์์ ํ๊ฒ ๋์ํ ์ ์๋ค. (DDos๋ก ๋ถํฐ์ ๋ณดํธ)
- ํด์ ๋ง์ ํตํ ์ธ์ ์คํฐ ์ ํ [์ฐธ๊ณ Loki ํด์ ๋ง]:
- ๋ก๊ทธ ๋ฐ์ดํฐ๋ ํ๋ ์ด์์ ๋ ์ด๋ธ(label) ์ธํธ๋ก ๊ตฌ์ฑ๋ ์คํธ๋ฆผ(stream)์ด๋ฉฐ, ์ด ๋ ์ด๋ธ ์ธํธ์ ํด์๊ฐ์ ๊ณ์ฐํ์ฌ ์ด๋ Ingester๊ฐ ํด๋น ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ ์ง ๊ฒฐ์ ํ๋ค.
- ํด์ ๋ง(Consistent Hashing Ring)์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ Ingester์ ๋ถ์ฐํ๋ค.
๋ ์ด๋ธ ์ธํธ์ ํด์๊ฐ์ด ํด์๋ง์์ ํน์ ์์น๋ฅผ ๊ฐ๋ฆฌํค๊ณ , ์ด ์์น๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ์ด์์ Ingester๊ฐ ์ ํ๋๋ค. - ์ต๊ทผ ๋ฒ์ ์ Loki๋ Memberlist๋ฅผ ํตํด ํด์๋ง์ ๊ตฌํํ์ง๋ง, ์ด ์ฑ ์์๋ Consul์ ํตํด ์ค์ตํ๊ณ ๊ฐ๋ ์ ์ค๋ช ํ๋ค.
- ๋ ํ๋ฆฌ์ผ์ด์
ํฉํฐ์ ๋ฐ์ดํฐ ๋ณต์ :
- ์ด ๋ถ๋ถ์ 2์ฅ, ๋ฐ์ดํฐ ๋ค์คํ ๋ถ๋ถ์์ ๋ค๋ฃฌ์ ์ด ์๋๋ฐ, ๋ฐ์ดํฐ์ ๊ฐ์ฉ์ฑ๊ณผ ๋ด๊ตฌ์ฑ์ ๋์ด๊ธฐ ์ํด ์ค์ํ ์ค์ ์ด๋ค.
๋ฐ์ดํฐ ์์ค ๊ฐ๋ฅ์ฑ์ ์ค์ด๊ธฐ ์ํด์ ์ฌ์ฉํ๋ฉฐ, ๋ณต์ ๋ฅผ ํตํด ๋กค์์(์๋น์ค ์ฌ๋ฐฐํฌ, ์ ๋ฐ์ดํธ), ์ฌ์์ ์ค์์๋ ๋ฐ์ดํฐ์ ์์ค์์ด ์์ ์ ๊ณ์ ํ ์ ์๋ค. - ๋ ํ๋ฆฌ์ผ์ด์ ํฉํฐ ์ค์ ์ ํตํด ๋ฐ์ดํฐ๊ฐ ๋ช๊ฐ์ Ingester์ ๋ณต์ ๋ ์ง ๊ฒฐ์ ๋๋ฉฐ, ๋ ํ๋ ์ผ์ด์ ํฉํฐ๊ฐ 3 ์ด๋ผ๋ฉด, ํด์๋ง์ ํตํด ์ ํ๋ Ingester์ ์ด์ํ๋ ๋ Ingester์ ๋์ผํ ๋ฐ์ดํฐ๊ฐ ๋ณต์ ๋์ด ์ด 3๊ฐ์ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋๋ค.
- Distributor ์ปดํฌ๋ํธ๋ ๋ก๊ทธ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ ์ฌ๋ฌ Ingester ์ธ์คํด์ค์๊ฒ ์ ๋ฌํ๋๋ฐ, ์ด๋ ์ค์ ๋ ๋ ํ๋ฆฌ์ผ์ด์ ํฉํฐ์ ๋ฐ๋ผ(๊ธฐ๋ณธ๊ฐ 3) ๋์ผํ ๋ฐ์ดํฐ๋ฅผ ์ฌ๋ฌ Ingester์ ๋ณต์ ํ๋ค.
- ์ด ๋ถ๋ถ์ 2์ฅ, ๋ฐ์ดํฐ ๋ค์คํ ๋ถ๋ถ์์ ๋ค๋ฃฌ์ ์ด ์๋๋ฐ, ๋ฐ์ดํฐ์ ๊ฐ์ฉ์ฑ๊ณผ ๋ด๊ตฌ์ฑ์ ๋์ด๊ธฐ ์ํด ์ค์ํ ์ค์ ์ด๋ค.
- ๋์ผํ ๋ฐ์ดํฐ์ ์ฐ๊ธฐ ์๋ (ํฌ์๋ฉ):
- ํด์๋ง์ ํตํด ์ ํ๋ 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 ์ํ๋ก ๋ง๋ค ์ ์์.
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)์ด๋, ์๊ณ์ด์์ ๋จ์ผ ์์ ์ ํด๋นํ๋ ๋ฐ์ดํฐ ํฌ์ธํธ๋ฅผ ์๋ฏธํ๋ค.
- ์ฐ๊ธฐ๊ฒฝ๋ก ์ปดํฌ๋ํธ
- ํ๋ก๋ฉํ
์ฐ์ค prometheus
- ํ๋ก๋ฉํ ์ฐ์ค๋ ๋ค์ํ ๋์์์ ์ํ์ ์คํฌ๋ฉํ๊ณ ํ๋ก๋ฉํ ์ฐ์ค์ ์๊ฒฉ์ฐ๊ธฐ API๋ฅผ ์ฌ์ฉํ์ฌ ๋ฏธ๋ฏธ๋ฅด๋ก ํธ์ํ๋ค.
- ์๊ฒฉ์ฐ๊ธฐ API๋ HTTP Put ์์ฒญ ๋ณธ๋ฌธ ๋ด์์ ์ผ๊ด ์ฒ๋ฆฌ๋ ์ค๋ดํผ(snappy) ์์ถ ํ๋กํ ์ฝ ๋ฒํผ ๋ฉ์ธ์ง๋ฅผ ๋ณด๋ธ๋ค.
- HTTP์์ฒญ์๋ ํ ๋ํธID ํค๋๊ฐ ์์ด์ผ ํ๋ค.
- ๋์คํธ๋ฆฌ๋ทฐํฐ distributor [์ฐธ๊ณ ]
- Prometheus ๋๋ Grafana ์์ด์ ํธ๋ก๋ถํฐ ์๊ณ์ด ๋ฐ์ดํฐ๋ฅผ ์์ ํ๋ ์ํ ๋น์ ์ฅ ์ปดํฌ๋ํธ์ด๋ค.
- ๋ฐ์ดํฐ์ ์ ํ์ฑ์ ๊ฒ์ฆํ๊ณ ํด๋น ๋ฐ์ดํฐ๊ฐ ํน์ ํ ๋ํธ์ ๋ํด ๊ตฌ์ฑ๋ ์ ํ ๋ด์ ์๋์ง ํ์ธํ๋ค.
- ์ดํ ๋ฐ์ดํฐ๋ฅผ ์ฌ๋ฌ Ingester์ ๋ณ๋ ฌ๋ก ๋ณด๋ธ๋ค. (์ฌ๊ธฐ์๋ Replication-factor)
- ์ธ์ ์คํฐ ingester [์ฐธ๊ณ ]
- Distributer์์ ๋ค์ด์จ ์๋ฆฌ์ฆ๋ฅผ ์ฐ๊ธฐ๊ฒฝ๋ก์ ์๊ตฌ์คํ ๋ฆฌ์ง์ ์ฐ๊ณ , ์ฝ๊ธฐ ๊ฒฝ๋ก์ ์ฟผ๋ฆฌ์ ๋ํ ์๋ฆฌ์ฆ ์ํ์ ๋ฐํํ๋ ์ํ์ ์ฅ ์ปดํฌ๋ํธ ์ด๋ค.
- Distributer์์ ๋ค์ด์ค๋ ์๊ณ์ด ๋ฐ์ดํฐ๋ Ingester ๋ฉ๋ชจ๋ฆฌ์ ๋ณด๊ด๋๊ณ WAL์ ๊ธฐ๋ก๋๋ฉฐ, ์ต์ข ์ ์ผ๋ก ์๊ตฌ์คํ ๋ฆฌ์ง์ ์ ๋ก๋ ๋๋ค. (๊ธฐ๋ณธ์ ์ผ๋ก 2์๊ฐ๋ง๋ค)
- ์ปดํํฐ compactor [์ฐธ๊ณ ]
- ์ปดํํฐ๋ ์ฌ๋ฌ ์์ง๊ธฐ์ ๋ธ๋ก์ ๋จ์ผ ๋ธ๋ก์ผ๋ก ๋ณํฉํ๊ณ ์ค๋ณต ์ํ์ ์ ๊ฑฐํ๋ค.
- ํ๋ก๋ฉํ
์ฐ์ค prometheus
- ์ฝ๊ธฐ๊ฒฝ๋ก ์ปดํฌ๋ํธ
- ์ฟผ๋ฆฌํ๋ฐํธ์๋ query-frontend [์ฐธ๊ณ ]
- Querier์ ๋์ผํ API๋ฅผ ์ ๊ณตํ๋ฉฐ, ์ฝ๊ธฐ๋ฅผ ๊ฐ์ํํ๋๋ฐ ์ฌ์ฉํ๋ ์ํ ๋น์ ์ฅ ์ปดํฌ๋ํธ ์ด๋ค.
- ํ์ ๊ตฌ์ฑ์์๋ ์๋์ง๋ง ๋ฐฐํฌํ๋๊ฒ์ ๊ถ์ฅํ๋ค.
- ์ฟผ๋ฆฌ๊ฐ ๋ค์ด์ค๋ฉด, query-frontend๋ ์ฟผ๋ฆฌ๋ฅผ ์ฌ๋ฌ๊ฐ์ ๋ ์์ ์ฟผ๋ฆฌ๋ก ๋ถํ ํ๋ค.
- ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๊ฐ ์บ์์ ์๋ค๋ฉด ์บ์๋ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๊ณ , ์บ์์์ ์๋ตํ ์ ์๋ ์ฟผ๋ฆฌ๋ ํ๋ฐํธ์๋ ๋ด์ ๋ฉ๋ชจ๋ฆฌํ์ ๋ฃ๋๋ค.
- ์ฟผ๋ฆฌ์ด querier [์ฐธ๊ณ ]
- ์ฟผ๋ฆฌ์ด๋ ์ฝ๊ธฐ ๊ฒฝ๋ก์์ ์๊ณ์ด๊ณผ ๋ ์ด๋ธ์ ๊ฐ์ ธ์ PromQL ์์ ํ๊ฐํ๋ ์ํ ๋น์ ์ฅ ๊ตฌ์ฑ ์์์ด๋ค.
- querier๋ quert-frontend ๋๊ธฐ์ด(๋ฉ๋ชจ๋ฆฌํ)์์ ์์ ์ ๊ฐ์ ธ์์ ์คํํ๊ณ ์ง๊ณ๋ฅผ ์ํด ์ฟผ๋ฆฌ ํ๋ฐํธ์๋์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ ์์ ์ ์ญํ ์ ํ๋ค.
- Storage Gateway์ Ingester์ ์ฐ๊ฒฐํ์ฌ ์ฟผ๋ฆฌ๋ฅผ ์คํํ๋๋ฐ ํ์ํ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์จ๋ค.
- ์คํ ๋ฆฌ์ง ๊ฒ์ดํธ์จ์ด store-gateway [์ฐธ๊ณ ]
- ์คํ ๋ฆฌ์ง ๊ฒ์ดํธ์จ์ด๋ ์ํ์ ์ฅ ์ปดํฌ๋ํธ์ด๋ฉฐ, ์๊ตฌ์คํ ๋ฆฌ์ง์์ ๋ธ๋ก์ ์กฐํํ๋ ๊ธฐ๋ฅ์ ์ํํ๋ค.
- ์ฟผ๋ฆฌํ๋ฐํธ์๋ query-frontend [์ฐธ๊ณ ]
- ์คํ ๋ฆฌ์ง ๋ฐฉ์
- ๋ฏธ๋ฏธ๋ฅด๋ ๊ฐ ํ ๋ํธ์ ์๊ณ์ด์ ์์ฒด 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 ๋์ ๋ฐฉ์์ ์ค๋ช
ํ์๋ฉด ์๋์ ๊ฐ๋ค.
- Ingester๋ ์์ํ ๋ ์์์ ํ ํฐ๊ฐ์ ์์ฑํ๊ณ ์ด๋ฅผ ๋ง์ ๋ฑ๋กํ๋ค.
- Ingester #1 ์ ํ ํฐ2์ ํจ๊ป ๋ง์ ๋ฑ๋ก๋จ
- Ingester #2 ๋ ํ ํฐ4์ ํจ๊ป ๋ง์ ๋ฑ๋ก๋จ
- Ingester #3 ์ ํ ํฐ 6๊ณผ ํจ๊ป ๋ง์ ๋ฑ๋ก๋จ
- Ingester #4 ๋ ํ ํฐ 9์ ํจ๊ป ๋ง์ ๋ฑ๋ก๋จ
- ์๋ฆฌ์ฆ(๋ฐ์ดํฐ)๊ฐ Distributer์ ์ ๋ ฅ๋๋ฉด, fvn32aํด์ํจ์๋ฅผ ํตํด ์๋ฆฌ์ฆ์ ๋ ์ด๋ธ์ ํด์ํ์ฌ ํ ํฐ3์ด ์์ฑ๋๋ค.
- ํ ํฐ3์ ์๊ณ๋ฐฉํฅ ๊ธฐ์ค ๊ฐ์ฅ ์ธ์ ํ Ingester #2 ๊ฐ ์์ ํ๋ค.
- ์ด๋, mimir๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์๋ฆฌ์ฆ(๋ฐ์ดํฐ)๋ฅผ 3๊ฐ ๋ณต์ ๋ณธ์ผ๋ก ๋ณต์ฌํ๊ฒ ๋๋๋ฐ,
์๋ฆฌ์ฆ์ ์์ ์์ธ Ingester #2๋ฅผ ๊ธฐ์ค์ผ๋ก ์๊ณ๋ฐฉํฅ์ผ๋ก ๋ง์ ์ด๋ํ์ฌ Ingester #3, Ingester #4์ ์๋ฆฌ์ฆ๊ฐ ๋ณต์ ๋๋ค.
ํด์๋ง์ ์ผ๊ด๋ ํด์ฑ์ ๋ณด์ฅํ๋ฉฐ, ํน์ ๋ง์์ ์ธ์คํด์ค(์์ ์์๋ Ingester)๊ฐ ์ถ๊ฐ๋๊ฑฐ๋ ์ ๊ฑฐ๋ ๋ ๋ค๋ฅธ ์ธ์คํด์ค๋ก ์ด๋๋๋ ํ ํฐ์๋ฅผ ์ต์ํ ํ๋ค. (์ด๋๋๋ ํ ํฐ ๊ฐ์ = ํ ํฐ/๋ง์ ๋ฑ๋ก๋ ์ธ์คํด์ค ๊ฐ์)
[ํด์๋ง์ ์ฌ์ฉํ๋ ๊ตฌ์ฑ์์]
ํด์๋ง์ ์ฌ์ฉํ๋ ๊ตฌ์ฑ์์๋ Ingester ๋ฟ๋ง ์๋๋ผ ์๋์ ๋์ด๋ ๊ตฌ์ฑ์์์์ ํด์๋ง์ด ๋ ๋ฆฝ์ ์ธ ํด์๋ง์ ๊ตฌ์ฑํ๊ฒ ๋๋ค.
- Ingesters : ์ค๋ฉ๊ณผ ์๋ฆฌ์ฆ๋ฅผ ๋ณต์ ํ๋ค.
- Distributors : ๋น์จ ์ ํ์ ์ํํ๋ค.
- Compactors : ์์ถ ์์ ๋ถํ๋ฅผ ์ค๋ฉํ๋ค.
- Store-gateways : ์ฅ๊ธฐ์ ์ฅ์์์ ์ฟผ๋ฆฌํ๊ธฐ ์ํด ๋ธ๋ก์ ์ค๋ฉํ๋ค.
- (Optional) Rulers : ๊ท์น๊ทธ๋ฃน์ ํ๊ฐํ๊ธฐ ์ํด ์ค๋ฉํ๋ค.
- (Optional) Alertmanagers ํ ๋ํธ๋ฅผ ์ค๋ฉํ๋ค.
[๊ทธ๋ผํ๋ ๋ฏธ๋ฏธ๋ฅด ์ธ์คํด์ค๊ฐ ํด์๋ง์ ๊ณต์ ํ๋ ๋ฐฉ๋ฒ]
ํด์๋ง์ ๊ตฌ์ฑ์์ ๊ฐ์ ๊ณต์ ๋์ด์ผ ํ๋ค.
์ง์ ๋ ํด์๋ง์ ๋ณ๊ฒฝ์ฌํญ์ ๊ตฌ์ฑ์์๊ฐ์ ์ ํํ๊ธฐ ์ํด ํค-๊ฐ ์ ์ฅ์๋ฅผ ์ฌ์ฉํ๋ค.
ํค-๊ฐ ์ ์ฅ์๋ ํ์์ด๋ฉฐ ๋ค์ํ ๊ตฌ์ฑ ์์์ ํด์ ๋ง์ ๋ํด ๋
๋ฆฝ์ ์ผ๋ก ๊ตฌ์ฑ๋ ์ ์๋ค.
- Gossip-based memberlist protocol (default)
- Consul
- Etcd
[ํด์๋ง์ ์ฌ์ฉํ์ฌ ๊ตฌ์ถํ ๊ธฐ๋ฅ]
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/
๋ฏธ๋ฏธ๋ฅด๋ ํ๋์ ์ฟผ๋ฆฌ๋ฅผ ์ฌ๋ฌ ๊ธฐ๊ณ์์ ๋์์ ์คํํ ์ ์๊ฒ ํ๋ ์ฟผ๋ฆฌ ์ค๋ฉ ๊ธฐ๋ฅ์ ํฌํจํ๊ณ ์๋ค.
์ฟผ๋ฆฌ ์ค๋ฉ ๊ธฐ๋ฅ์ ๋ฐ์ดํฐ ์ฒ๋ฆฌ๋ฅผ ์ต์ ํํ๊ณ , ๋๊ท๋ชจ ๋ฐ์ดํฐ์
์ ๋ํ ์ฟผ๋ฆฌ ์๋ต ์๊ฐ์ ๋จ์ถ์์ผ, ๋ ๋น ๋ฅด๊ณ ํจ์จ์ ์ธ ๋ฐ์ดํฐ ์ฟผ๋ฆฌ๊ฐ ๊ฐ๋ฅํ๊ฒ ๋๋ค.
์ฟผ๋ฆฌ ์ค๋ฉ์ ์๋์ ๊ฐ์ด ๋์ํ๋ค.
- ๋ฐ์ดํฐ์ ๋ถํ : Mimir๋ ํฐ ๋ฐ์ดํฐ์ ์ ๋ ์์ ์กฐ๊ฐ๋ค๋ก ๋๋๋ค. ์ด๋ ์ด ์์ ์กฐ๊ฐ๋ค์ '์ค๋(shards)'๋ผ๊ณ ํ๋ค.
- ๋ถ๋ถ ์ฟผ๋ฆฌ ์์ฑ: ๊ฐ ์ค๋๋ ๋ณ๋์ ๋ถ๋ถ ์ฟผ๋ฆฌ(partial query)์ ํด๋นํ๋ฉฐ, ์ด๋ฌํ ๋ถ๋ถ ์ฟผ๋ฆฌ๋ค์ด ๋ค๋ฅธ ์ฟผ๋ฆฌ์ด(queriers)์์ ๋ณ๋ ฌ๋ก ์คํ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ํ๋์ ํฐ ์ฟผ๋ฆฌ๋ฅผ ์ฌ๋ฌ ๊ฐ์ ์์ ์ฟผ๋ฆฌ๋ก ๋๋์ด ์ฒ๋ฆฌํ ์ ์์ด, ์ฒ๋ฆฌ ์๊ฐ์ด ๋จ์ถ๋๊ณ ์์คํ ์ ์ ์ฒด์ ์ธ ์ฑ๋ฅ์ด ํฅ์๋๋ค.
- ์ฟผ๋ฆฌ ๋ถ๋ฐฐ: ์ฟผ๋ฆฌ-ํ๋ก ํธ์๋(query-frontend)๋ ์ด ๋ถ๋ถ ์ฟผ๋ฆฌ๋ค์ ์๋ก ๋ค๋ฅธ ์ฟผ๋ฆฌ์ด์๊ฒ ๋ถ๋ฐฐํ์ฌ ๋์์ ์คํํ๋๋ก ํ๋ค.
์ฟผ๋ฆฌ์ด๋ Mimir ํด๋ฌ์คํฐ ๋ด์ ์๋ฒ๋ก, ์ฟผ๋ฆฌ๋ฅผ ์คํํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ ์ญํ ์ ํ๋ค. - ๊ฒฐ๊ณผ ์ง๊ณ: ๊ฐ ์ฟผ๋ฆฌ์ด์์ ์คํ๋ ๋ถ๋ถ ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๋ ๋ค์ ์ฟผ๋ฆฌ-ํ๋ก ํธ์๋๋ก ๋ฐํ๋๋ฉฐ, ์ฌ๊ธฐ์์ ์ด๋ฌํ ๊ฒฐ๊ณผ๋ค์ด ์ง๊ณ๋์ด ์ต์ข ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ํ์ฑํ๋ค. ๊ฒฐ๊ณผ ์ง๊ณ๋ฅผ ํตํด ์ฌ์ฉ์๋ ์๋์ ํ๋์ ํฐ ์ฟผ๋ฆฌ์ ๋ํ ์ ์ฒด์ ์ธ ๊ฒฐ๊ณผ๋ฅผ ์ป๊ฒ ๋๋ค.
์ฟผ๋ฆฌ ์ค๋ฉ์ 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 ๋ฑ๊ณผ ์ ์ฌํ ๊ตฌ์ฑ์์๋ก ์ด์๋๋ค.
์ํคํ์ณ๋ฅผ ๋ณด๋ฉด ์ ๋ง 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 ์ด์์ ๊ถ์ฅ์ฌํญ
- ์ฝ๊ธฐ์ ์บ์๋ฅผ ํ์ฉํด์ผํ๋ค. ์ฐธ๊ณ : Improve performance with caching
- ๋ธ๋ก์คํ ๋ฆฌ์ง์ WAL์์ ์ฝ๋๊ฒ์ ์บ์๋ณด๋ค ๋๋ฆฌ๋ค.
- ์บ์์ ์ฉ๋์ ํ๋ณดํ๊ณ ๊ฐ๋ฅํ๋ฉด ์บ์์์ ๊ฒฐ๊ณผ๋ฅผ ์กฐํํ๋๋ก ํ๋ค.
- ๋ํ ์ฃผ๊ธฐ์ ์ผ๋ก ์คํ๋๋ฉด์ ๋ฐ์ดํฐ๋ฅผ ๊ฐฑ์ ํ๋ ๋์๋ณด๋๋ ์บ์์์ ์ฝ๋๋ก ๋ณ๊ฒฝํ๋๊ฒ์ ๊ถ์ฅํ๋ค.
- ์ค๋๋ ๋ฐ์ดํฐ๋ฅผ ๋ธ๋ก์คํ ๋ฆฌ์ง์์ ์กฐํํ๋ฉด ์๋๊ฐ ๋๋ ค์ง๋ค.
- ๋ณ๋ ฌ์ฒ๋ฆฌ๊ฐ ์ ์ด๋ฃจ์ด์ง๊ณ ์๋์ง ์กฐ์ฌํ๋ค.
- ๋์ฉ๋ ์ฟผ๋ฆฌ๋ฅผ ๋ถํ ํ๊ณ ๋ณ๋ ฌ์ฒ๋ฆฌ๋ฅผ ํ๋ฉด ํจ์ฌ ๋น ๋ฅด๊ฒ ์ฝ๊ธฐ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ค.
- ์ธ์ ์คํฐ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ถฉ๋ถํ ํ ๋นํ๋ค.
- ์ธ์ ์คํฐ๋ ๋ค์์ replication_factor๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ๊ด๋ฆฌํ๊ณ , ๋ค๋ฅธ ๊ตฌ์ฑ์์์ ์ํธ์์ฉ์ ํ์๋ก ํ๋ ๋ฌด๊ฑฐ์ด ํ๋ก์ธ์ค๋ค.
- ํ๋ฌ์ ์ฃผ๊ธฐ๊ฐ ๋์๊ฐ์ด๋ผ๋ฉด, ์ธ์ ์คํฐ๋ ๋ด๋ถ์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ์ ๋ฐ์ดํฐ๋ฅผ ๋ณด๊ดํ๊ณ ๋์๊ฐ๋ง๋ค ๋์คํฌ์ ๋ธ๋ก์ ์์ฑํ๊ธฐ๋๋ฌธ์ด๋ค.
- ๊ฐ๋ณ ํ๋ผ๋ฉํฐ ํ๋๋ณด๋ค ์ค๋์ ์๋ฅผ ๋๋ ค์ผํ๋ค.
- ์คํ ์ค์ผ์ผ๋ง์ ์ ์ฉํด์ ์ค๋๋ฅผ ๋๋ฆฌ๊ณ ์ถฉ๋ถํ ๋ฆฌ์์ค๋ฅผ ํ๋ณดํ๋ค.
- ์ค์ผ์ผ ์ธ ์์๋ ๋ฐ์ดํฐ๊ฐ ์ ์ค๋์ง ์๋๋ก ํนํ ์ฃผ์ํด์ผํ๋ค
- ๋ฐ์ดํฐ๊ฐ ์ ์ค๋์ง ์๋๋ก ๋ฆฌ๋ฒจ๋ฐ์ฑ์ด ์์ฃผ ๋ฐ์ํ์ง ์๋๋ก ์ฃผ์ํ๊ณ , ๊ฐ๊ธ์ WAL๊ณผ ๋ ํ๋ฆฌ์ผ์ด์ ํฉํฐ๋ฅผ ์ฌ์ฉํด์ ๋ณต๊ตฌ๋ฅผ ์งํํ๋ค.
4.5 Jeager ์ถ์ ๊ด๋ฆฌ
4.5.1 Jeager ๊ตฌ์ฑ
4.4์์ ์์๋ดค๋ Tempo๋ ๋ฉํฐํ
๋ํธ, ๊ฐ์ฒด์คํ ๋ฆฌ์ง, ์คํฌ๋ฉํธ๋ฆญ๊ณผ ์๋น์ค๋งต์ ์๋์์ฑ, ์๊ด๊ด๊ณ๊ตฌํ์ด ์ฝ๋ค๋ ์ฅ์ ์ด ์์๋ค.
Jeager๋ ๊ฐ์ฒด์คํ ๋ฆฌ์ง๋ฅผ ์ ์ธํ ๋ค์ํ ๋ฐฑ์๋ ์คํ ๋ฆฌ์ง๋ฅผ ์ง์ํ๊ณ , ํ๋กํ์ผ๊ณผ์ ์์ฌ์ด ์ฐ๊ณ, ์คํฌ ๋ฉํธ๋ฆญ ์๋์์ฑ, ๊ทผ๋ณธ์์ธ ๋ถ์๋ฑ์ ์ฅ์ ์ด ์๋ค.
์๋์ ํ๋ ์ฐธ๊ณ ํ ์์๋๋ก ๊ฐ์ ธ์ ๋ดค๋ค.
Jeager ์ํคํ ์ณ ๋ฐ ์ฃผ์ ์ปดํฌ๋ํธ
์ฐธ๊ณ :https://grafana.com/docs/tempo/latest/operations/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"`
}