๊ณ ์„ฑ๋Šฅ TSDB ๋ฒค์น˜๋งˆํฌ VictoriaMetrics vs TimescaleDB vs InfluxDB

VictoriaMetrics, TimescaleDB ๋ฐ InfluxDB๋Š” ๋‹ค์Œ์—์„œ ๋น„๊ต๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์ „ ๊ธฐ์‚ฌ 40K ๊ณ ์œ  ์‹œ๊ณ„์—ด์— ์†ํ•˜๋Š” XNUMX์–ต ๊ฐœ์˜ ๋ฐ์ดํ„ฐ ํฌ์ธํŠธ๊ฐ€ ์žˆ๋Š” ๋ฐ์ดํ„ฐ์„ธํŠธ์— ๋Œ€ํ•ด

๋ช‡ ๋…„ ์ „, Zabbix์˜ ์‹œ๋Œ€๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ ๋ฒ ์–ด๋ฉ”ํƒˆ ์„œ๋ฒ„์—๋Š” CPU ์‚ฌ์šฉ๋Ÿ‰, RAM ์‚ฌ์šฉ๋Ÿ‰, ๋””์Šคํฌ ์‚ฌ์šฉ๋Ÿ‰, ๋„คํŠธ์›Œํฌ ์‚ฌ์šฉ๋Ÿ‰ ๋“ฑ ๋ช‡ ๊ฐ€์ง€ ์ง€ํ‘œ๋งŒ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ˆ˜์ฒœ ๋Œ€์˜ ์„œ๋ฒ„์—์„œ ์–ป์€ ์ธก์ • ํ•ญ๋ชฉ์„ 40๋งŒ ๊ฐœ์˜ ๊ณ ์œ ํ•œ ์‹œ๊ณ„์—ด์— ๋งž์ถœ ์ˆ˜ ์žˆ์œผ๋ฉฐ Zabbix๋Š” MySQL์„ ์‹œ๊ณ„์—ด ๋ฐ์ดํ„ฐ์˜ ๋ฐฑ์—”๋“œ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. :)

ํ˜„์žฌ ํ˜ผ์ž node_exporter ๊ธฐ๋ณธ ๊ตฌ์„ฑ์„ ์‚ฌ์šฉํ•˜๋ฉด ํ‰๊ท  ํ˜ธ์ŠคํŠธ์—์„œ 500๊ฐœ ์ด์ƒ์˜ ์ธก์ •ํ•ญ๋ชฉ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋งŽ์ด์žˆ๋‹ค ์ˆ˜์ถœ์—…์ž ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค, ์›น ์„œ๋ฒ„, ํ•˜๋“œ์›จ์–ด ์‹œ์Šคํ…œ ๋“ฑ์— ๋Œ€ํ•ด ๋‹ค์–‘ํ•˜๊ณ  ์œ ์šฉํ•œ ์ธก์ •ํ•ญ๋ชฉ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋‘ ์ ์  ๋” ๋งŽ์€ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ์Šค์Šค๋กœ ๋‹ค์–‘ํ•œ ์ง€ํ‘œ๋ฅผ ์„ค์ •ํ•˜๊ธฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๋งŽ์€ ์ง€ํ‘œ๋ฅผ ๋…ธ์ถœํ•˜๋Š” ํด๋Ÿฌ์Šคํ„ฐ์™€ ํฌ๋“œ๊ฐ€ ์žˆ๋Š” Kubernetes๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด ์„œ๋ฒ„๋Š” ํ˜ธ์ŠคํŠธ๋‹น ์ˆ˜์ฒœ ๊ฐœ์˜ ๊ณ ์œ ํ•œ ์ธก์ •ํ•ญ๋ชฉ์„ ๋…ธ์ถœํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ณ ์œ ํ•œ 40K ์‹œ๊ณ„์—ด์€ ๋” ์ด์ƒ ๊ณ ์ „๋ ฅ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ด๋Š” ์ฃผ๋ฅ˜๊ฐ€ ๋˜๊ณ  ์žˆ์œผ๋ฉฐ ๋‹จ์ผ ์„œ๋ฒ„์˜ ๋ชจ๋“  ์ตœ์‹  TSDB์—์„œ ์‰ฝ๊ฒŒ ์ฒ˜๋ฆฌ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํ˜„์žฌ ๋Œ€๋Ÿ‰์˜ ๊ณ ์œ ํ•œ ์‹œ๊ณ„์—ด์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์•„๋งˆ๋„ 400K ๋˜๋Š” 4M์ผ๊นŒ์š”? ์•„๋‹ˆ๋ฉด 40m? ์ตœ์‹  TSDB๋ฅผ ์ด ์ˆ˜์น˜์™€ ๋น„๊ตํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ฒค์น˜๋งˆํฌ ์„ค์น˜

TSBS TSDB๋ฅผ ์œ„ํ•œ ํ›Œ๋ฅญํ•œ ๋ฒค์น˜๋งˆํ‚น ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ์‹œ๊ณ„์—ด ์ˆ˜๋ฅผ 10์œผ๋กœ ๋‚˜๋ˆˆ ๊ฐ’์„ ์ „๋‹ฌํ•˜์—ฌ ์ž„์˜ ์ˆ˜์˜ ์ธก์ •ํ•ญ๋ชฉ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ”Œ๋ž˜๊ทธ -๊ทœ๋ชจ (์ด์ „์˜ -scale-var). 10์€ ๊ฐ ํ˜ธ์ŠคํŠธ ๋˜๋Š” ์„œ๋ฒ„์—์„œ ์ƒ์„ฑ๋œ ์ธก์ •๊ฐ’(๋ฉ”ํŠธ๋ฆญ) ์ˆ˜์ž…๋‹ˆ๋‹ค. ๋ฒค์น˜๋งˆํฌ๋ฅผ ์œ„ํ•ด TSBS๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์Œ ๋ฐ์ดํ„ฐ ์„ธํŠธ๊ฐ€ ์ƒ์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

  • 400K ๊ณ ์œ  ์‹œ๊ณ„์—ด, ๋ฐ์ดํ„ฐ ํฌ์ธํŠธ ๊ฐ„ 60์ดˆ ๊ฐ„๊ฒฉ, ๋ฐ์ดํ„ฐ๋Š” ์ „์ฒด 3์ผ์— ๊ฑธ์ณ ์žˆ์œผ๋ฉฐ ์ด ๋ฐ์ดํ„ฐ ํฌ์ธํŠธ ์ˆ˜๋Š” ์ตœ๋Œ€ 1.7์–ต ๊ฐœ์ž…๋‹ˆ๋‹ค.
  • 4M ๊ณ ์œ  ์‹œ๊ณ„์—ด, 600์ดˆ ๊ฐ„๊ฒฉ, ๋ฐ์ดํ„ฐ๋Š” 3์ผ ๋™์•ˆ ์ง€์†๋˜๋ฉฐ ์ด ๋ฐ์ดํ„ฐ ํฌ์ธํŠธ ์ˆ˜๋Š” ~1.7์–ต ๊ฐœ์ž…๋‹ˆ๋‹ค.
  • 40์ฒœ๋งŒ ๊ฐœ์˜ ๊ณ ์œ ํ•œ ์‹œ๊ณ„์—ด, 1์‹œ๊ฐ„ ๊ฐ„๊ฒฉ, ๋ฐ์ดํ„ฐ๋Š” 3์ผ ๋™์•ˆ, ์ด ๋ฐ์ดํ„ฐ ํฌ์ธํŠธ ์ˆ˜๋Š” ~2.8์–ต ๊ฐœ์ž…๋‹ˆ๋‹ค.

ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๊ฐ€ ์ „์šฉ ์ธ์Šคํ„ด์Šค์—์„œ ์‹คํ–‰ ์ค‘์ด์—ˆ์Šต๋‹ˆ๋‹ค. n1-ํ‘œ์ค€-16 Google ํด๋ผ์šฐ๋“œ์—์„œ. ์ด๋Ÿฌํ•œ ์ธ์Šคํ„ด์Šค์˜ ๊ตฌ์„ฑ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • vCPU: 16
  • RAM : 60GB
  • ์ €์žฅ๊ณต๊ฐ„: ํ‘œ์ค€ 1TB HDD. 120Mbps ์ฝ๊ธฐ/์“ฐ๊ธฐ ์ฒ˜๋ฆฌ๋Ÿ‰, ์ดˆ๋‹น 750ํšŒ์˜ ์ฝ๊ธฐ ์ž‘์—… ๋ฐ ์ดˆ๋‹น 1,5K ์“ฐ๊ธฐ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

TSDB๋Š” ๊ณต์‹ Docker ์ด๋ฏธ์ง€์—์„œ ์ถ”์ถœ๋˜์—ˆ์œผ๋ฉฐ ๋‹ค์Œ ๊ตฌ์„ฑ์œผ๋กœ Docker์—์„œ ์‹คํ–‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

  • ๋น…ํ† ๋ฆฌ์•„๋ฉ”ํŠธ๋ฆญ์Šค:

    docker run -it --rm -v /mnt/disks/storage/vmetrics-data:/victoria-metrics-data -p 8080:8080 valyala/victoria-metrics

  • ๊ณ ์ „๋ ฅ์„ ์ง€์›ํ•˜๋ ค๋ฉด InfluxDB(-e) ๊ฐ’์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์„ ์  ์„œ๋ฅ˜ ๋น„์น˜):

    docker run -it --rm -p 8086:8086 
    -e INFLUXDB_DATA_MAX_VALUES_PER_TAG=4000000 
    -e INFLUXDB_DATA_CACHE_MAX_MEMORY_SIZE=100g 
    -e INFLUXDB_DATA_MAX_SERIES_PER_DATABASE=0 
    -v /mnt/disks/storage/influx-data:/var/lib/influxdb influxdb

  • TimescaleDB(๊ตฌ์„ฑ์€ ๋‹ค์Œ์—์„œ ๊ฐ€์ ธ์˜ด) ๊ทธ๊ฒƒ ํŒŒ์ผ):

MEM=`free -m | grep "Mem" | awk โ€˜{print $7}โ€™`
let "SHARED=$MEM/4"
let "CACHE=2*$MEM/3"
let "WORK=($MEM-$SHARED)/30"
let "MAINT=$MEM/16"
let "WAL=$MEM/16"
docker run -it โ€” rm -p 5432:5432 
--shm-size=${SHARED}MB 
-v /mnt/disks/storage/timescaledb-data:/var/lib/postgresql/data 
timescale/timescaledb:latest-pg10 postgres 
-cmax_wal_size=${WAL}MB 
-clog_line_prefix="%m [%p]: [%x] %u@%d" 
-clogging_collector=off 
-csynchronous_commit=off 
-cshared_buffers=${SHARED}MB 
-ceffective_cache_size=${CACHE}MB 
-cwork_mem=${WORK}MB 
-cmaintenance_work_mem=${MAINT}MB 
-cmax_files_per_process=100

๋ฐ์ดํ„ฐ ๋กœ๋”๋Š” 16๊ฐœ์˜ ๋ณ‘๋ ฌ ์Šค๋ ˆ๋“œ๋กœ ์‹คํ–‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์„œ์—๋Š” ์‚ฝ์ž… ๋ฒค์น˜๋งˆํฌ ๊ฒฐ๊ณผ๋งŒ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์„ ๋ณ„์  ๋ฒค์น˜๋งˆํฌ ๊ฒฐ๊ณผ๋Š” ๋ณ„๋„์˜ ๊ธฐ์‚ฌ๋กœ ๊ณต๊ฐœ๋  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.

400K ๊ณ ์œ  ์‹œ๊ณ„์—ด

๊ฐ„๋‹จํ•œ ์š”์†Œ์ธ 400K๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ฒค์น˜๋งˆํฌ ๊ฒฐ๊ณผ:

  • VictoriaMetrics: ์ดˆ๋‹น 2,6M ๋ฐ์ดํ„ฐ ํฌ์ธํŠธ; RAM ์‚ฌ์šฉ๋Ÿ‰: 3GB; ๋””์Šคํฌ์˜ ์ตœ์ข… ๋ฐ์ดํ„ฐ ํฌ๊ธฐ: 965MB
  • InfluxDB: ์ดˆ๋‹น 1.2M ๋ฐ์ดํ„ฐ ํฌ์ธํŠธ; RAM ์‚ฌ์šฉ๋Ÿ‰: 8.5GB; ๋””์Šคํฌ์˜ ์ตœ์ข… ๋ฐ์ดํ„ฐ ํฌ๊ธฐ: 1.6GB
  • ๊ธฐ๊ฐ„: ์ดˆ๋‹น 849K ๋ฐ์ดํ„ฐ ํฌ์ธํŠธ; RAM ์‚ฌ์šฉ๋Ÿ‰: 2,5GB; ๋””์Šคํฌ์˜ ์ตœ์ข… ๋ฐ์ดํ„ฐ ํฌ๊ธฐ: 50GB

์œ„ ๊ฒฐ๊ณผ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด ์‚ฝ์ž… ์„ฑ๋Šฅ๊ณผ ์••์ถ•๋ฅ ์—์„œ๋Š” VictoriaMetrics๊ฐ€ ์Šน๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ํƒ€์ž„๋ผ์ธ์€ RAM ์‚ฌ์šฉ๋Ÿ‰ ์ธก๋ฉด์—์„œ ์šฐ์œ„์— ์žˆ์ง€๋งŒ ๋ฐ์ดํ„ฐ ํฌ์ธํŠธ๋‹น 29๋ฐ”์ดํŠธ๋ผ๋Š” ๋งŽ์€ ๋””์Šคํฌ ๊ณต๊ฐ„์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ๋ฒค์น˜๋งˆํฌ ์ค‘ ๊ฐ TSDB์˜ CPU ์‚ฌ์šฉ๋Ÿ‰ ๊ทธ๋ž˜ํ”„์ž…๋‹ˆ๋‹ค.

๊ณ ์„ฑ๋Šฅ TSDB ๋ฒค์น˜๋งˆํฌ VictoriaMetrics vs TimescaleDB vs InfluxDB

์œ„ ์Šคํฌ๋ฆฐ์ƒท์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. VictoriaMetrics - ๊ณ ์œ ํ•œ 400K ์ธก์ •ํ•ญ๋ชฉ์— ๋Œ€ํ•œ ์‚ฝ์ž… ํ…Œ์ŠคํŠธ ์ค‘ CPU ๋กœ๋“œ์ž…๋‹ˆ๋‹ค.

๊ณ ์„ฑ๋Šฅ TSDB ๋ฒค์น˜๋งˆํฌ VictoriaMetrics vs TimescaleDB vs InfluxDB

์œ„ ์Šคํฌ๋ฆฐ์ƒท์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค: InfluxDB - ๊ณ ์œ  ๋ฉ”ํŠธ๋ฆญ 400K์— ๋Œ€ํ•œ ์‚ฝ์ž… ํ…Œ์ŠคํŠธ ์ค‘ CPU ๋กœ๋“œ.

๊ณ ์„ฑ๋Šฅ TSDB ๋ฒค์น˜๋งˆํฌ VictoriaMetrics vs TimescaleDB vs InfluxDB

์œ„ ์Šคํฌ๋ฆฐ์ƒท์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. TimescaleDB - 400K์˜ ๊ณ ์œ  ์ธก์ •ํ•ญ๋ชฉ์— ๋Œ€ํ•œ ์‚ฝ์ž… ํ…Œ์ŠคํŠธ ์ค‘ CPU ๋กœ๋“œ์ž…๋‹ˆ๋‹ค.

VictoriaMetrics๋Š” ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  vCPU๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ˜๋ฉด InfluxDB๋Š” vCPU 2๊ฐœ ์ค‘ ~16๊ฐœ๋ฅผ ์ถฉ๋ถ„ํžˆ ํ™œ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Timescale์€ vCPU 3๊ฐœ ์ค‘ 4~16๊ฐœ๋งŒ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. TimescaleDB ์‹œ๊ฐ„ ์ฒ™๋„ ๊ทธ๋ž˜ํ”„์—์„œ iowait ๋ฐ system์˜ ๋น„์œจ์ด ๋†’์œผ๋ฉด I/O(์ž…/์ถœ๋ ฅ) ํ•˜์œ„ ์‹œ์Šคํ…œ์— ๋ณ‘๋ชฉ ํ˜„์ƒ์ด ์žˆ์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ๋””์Šคํฌ ๋Œ€์—ญํญ ์‚ฌ์šฉ๋Ÿ‰ ๊ทธ๋ž˜ํ”„๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ณ ์„ฑ๋Šฅ TSDB ๋ฒค์น˜๋งˆํฌ VictoriaMetrics vs TimescaleDB vs InfluxDB

์œ„ ์Šคํฌ๋ฆฐ์ƒท์€ VictoriaMetrics - Unique Metrics 400K์— ๋Œ€ํ•œ ์‚ฝ์ž… ํ…Œ์ŠคํŠธ์˜ ๋””์Šคํฌ ๋Œ€์—ญํญ ์‚ฌ์šฉ๋Ÿ‰์ž…๋‹ˆ๋‹ค.

๊ณ ์„ฑ๋Šฅ TSDB ๋ฒค์น˜๋งˆํฌ VictoriaMetrics vs TimescaleDB vs InfluxDB

์œ„๋Š” ์Šคํฌ๋ฆฐ์ƒท์ž…๋‹ˆ๋‹ค: InfluxDB - ๊ณ ์œ  ์ง€ํ‘œ 400K์— ๋Œ€ํ•œ ์‚ฝ์ž… ํ…Œ์ŠคํŠธ ์‹œ ๋””์Šคํฌ ๋Œ€์—ญํญ ์‚ฌ์šฉ๋Ÿ‰.

๊ณ ์„ฑ๋Šฅ TSDB ๋ฒค์น˜๋งˆํฌ VictoriaMetrics vs TimescaleDB vs InfluxDB

์œ„ ์Šคํฌ๋ฆฐ์ƒท์€ TimescaleDB - ๊ณ ์œ  ์ธก์ •ํ•ญ๋ชฉ 400K์— ๋Œ€ํ•œ ์‚ฝ์ž… ํ…Œ์ŠคํŠธ ์‹œ ๋””์Šคํฌ ๋Œ€์—ญํญ ์‚ฌ์šฉ๋Ÿ‰์ž…๋‹ˆ๋‹ค.

VictoriaMetrics๋Š” 20Mbps์˜ ์†๋„๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋กํ•˜๋ฉฐ ์ตœ๋Œ€ ์†๋„๋Š” 45Mbps์ž…๋‹ˆ๋‹ค. ํ”ผํฌ๋Š” ํŠธ๋ฆฌ์˜ ๋Œ€๊ทœ๋ชจ ๋ถ€๋ถ„ ๋ณ‘ํ•ฉ์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค. NGO.

InfluxDB๋Š” 160MB/s์˜ ์†๋„๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์“ฐ๋Š” ๋ฐ˜๋ฉด 1TB ๋“œ๋ผ์ด๋ธŒ๋Š” ์ œํ•œ๋˜์–ด์•ผ ํ•œ๋‹ค ์“ฐ๊ธฐ ์ฒ˜๋ฆฌ๋Ÿ‰ 120MB/s.

TimescaleDB๋Š” ์“ฐ๊ธฐ ์ฒ˜๋ฆฌ๋Ÿ‰์„ 120Mbps๋กœ ์ œํ•œํ•˜์ง€๋งŒ ๋•Œ๋กœ๋Š” ์ด ์ œํ•œ์„ ๊นจ๊ณ  ์ตœ๋Œ€ ๊ฐ’์ด 220Mbps์— ๋„๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ตœ๊ณ ์ ์€ ์ด์ „ ๊ทธ๋ž˜ํ”„์—์„œ CPU ์‚ฌ์šฉ๋ฅ ์ด ๋ถ€์กฑํ•œ ์ตœ์ €์ ์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค.

์ž…์ถœ๋ ฅ(I/O) ์‚ฌ์šฉ๋Ÿ‰ ๊ทธ๋ž˜ํ”„๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ณ ์„ฑ๋Šฅ TSDB ๋ฒค์น˜๋งˆํฌ VictoriaMetrics vs TimescaleDB vs InfluxDB

์œ„ ์Šคํฌ๋ฆฐ์ƒท์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. VictoriaMetrics - 400K ๊ณ ์œ  ์ง€ํ‘œ์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ I/O ์‚ฌ์šฉ๋Ÿ‰์„ ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค.

๊ณ ์„ฑ๋Šฅ TSDB ๋ฒค์น˜๋งˆํฌ VictoriaMetrics vs TimescaleDB vs InfluxDB

์œ„ ์Šคํฌ๋ฆฐ์ƒท์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. InfluxDB - 400K ๊ณ ์œ  ์ง€ํ‘œ์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ I/O ์‚ฌ์šฉ๋Ÿ‰์„ ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค.

๊ณ ์„ฑ๋Šฅ TSDB ๋ฒค์น˜๋งˆํฌ VictoriaMetrics vs TimescaleDB vs InfluxDB

์œ„ ์Šคํฌ๋ฆฐ์ƒท์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. TimescaleDB - 400K ๊ณ ์œ  ์ง€ํ‘œ์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ I/O ์‚ฌ์šฉ๋Ÿ‰์„ ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค.

์ด์ œ TimescaleDB๊ฐ€ I/O ์ œํ•œ์— ๋„๋‹ฌํ•˜์—ฌ ๋‚˜๋จธ์ง€ 12๊ฐœ์˜ vCPU๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ด ๋ถ„๋ช…ํ•ด์กŒ์Šต๋‹ˆ๋‹ค.

4M ๊ณ ์œ  ์‹œ๊ณ„์—ด

4M ์‹œ๊ณ„์—ด์€ ์•ฝ๊ฐ„ ์–ด๋ ค์›Œ ๋ณด์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ ๊ฒฝ์Ÿ์ž๋“ค์€ ์ด ์‹œํ—˜์„ ์„ฑ๊ณต์ ์œผ๋กœ ํ†ต๊ณผํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฒค์น˜๋งˆํฌ ๊ฒฐ๊ณผ:

  • VictoriaMetrics: ์ดˆ๋‹น 2,2M ๋ฐ์ดํ„ฐ ํฌ์ธํŠธ; RAM ์‚ฌ์šฉ๋Ÿ‰: 6GB; ๋””์Šคํฌ์˜ ์ตœ์ข… ๋ฐ์ดํ„ฐ ํฌ๊ธฐ: 3GB.
  • InfluxDB: ์ดˆ๋‹น 330K ๋ฐ์ดํ„ฐ ํฌ์ธํŠธ; RAM ์‚ฌ์šฉ๋Ÿ‰: 20,5GB; ๋””์Šคํฌ์˜ ์ตœ์ข… ๋ฐ์ดํ„ฐ ํฌ๊ธฐ: 18,4GB.
  • TimescaleDB: ์ดˆ๋‹น 480K ๋ฐ์ดํ„ฐ ํฌ์ธํŠธ; RAM ์‚ฌ์šฉ๋Ÿ‰: 2,5GB; ๋””์Šคํฌ์˜ ์ตœ์ข… ๋ฐ์ดํ„ฐ ํฌ๊ธฐ: 52GB.

InfluxDB ์„ฑ๋Šฅ์€ 1,2K ์‹œ๊ณ„์—ด์˜ ๊ฒฝ์šฐ ์ดˆ๋‹น 400M ๋ฐ์ดํ„ฐ ํฌ์ธํŠธ์—์„œ 330M ์‹œ๊ณ„์—ด์˜ ๊ฒฝ์šฐ ์ดˆ๋‹น 4K ๋ฐ์ดํ„ฐ ํฌ์ธํŠธ๋กœ ๋–จ์–ด์กŒ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋‹ค๋ฅธ ๊ฒฝ์Ÿ์‚ฌ์— ๋น„ํ•ด ์ƒ๋‹นํ•œ ์„ฑ๋Šฅ ์†์‹ค์ด๋‹ค. ์ด ์†์‹ค์˜ ๊ทผ๋ณธ ์›์ธ์„ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด CPU ์‚ฌ์šฉ๋Ÿ‰ ๊ทธ๋ž˜ํ”„๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ณ ์„ฑ๋Šฅ TSDB ๋ฒค์น˜๋งˆํฌ VictoriaMetrics vs TimescaleDB vs InfluxDB

์œ„ ์Šคํฌ๋ฆฐ์ƒท์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. VictoriaMetrics - ๊ณ ์œ ํ•œ 4M ์‹œ๊ณ„์—ด์— ๋Œ€ํ•œ ์‚ฝ์ž… ํ…Œ์ŠคํŠธ ์ค‘ CPU ์‚ฌ์šฉ๋Ÿ‰์ž…๋‹ˆ๋‹ค.

๊ณ ์„ฑ๋Šฅ TSDB ๋ฒค์น˜๋งˆํฌ VictoriaMetrics vs TimescaleDB vs InfluxDB

์œ„ ์Šคํฌ๋ฆฐ์ƒท์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค: InfluxDB - ๊ณ ์œ ํ•œ 4M ์‹œ๊ณ„์—ด์— ๋Œ€ํ•œ ์‚ฝ์ž… ํ…Œ์ŠคํŠธ ์ค‘ CPU ์‚ฌ์šฉ๋Ÿ‰.

๊ณ ์„ฑ๋Šฅ TSDB ๋ฒค์น˜๋งˆํฌ VictoriaMetrics vs TimescaleDB vs InfluxDB

์œ„ ์Šคํฌ๋ฆฐ์ƒท์€ TimescaleDB - ๊ณ ์œ ํ•œ 4M ์‹œ๊ณ„์—ด์— ๋Œ€ํ•œ ์‚ฝ์ž… ํ…Œ์ŠคํŠธ ์ค‘ CPU ์‚ฌ์šฉ๋Ÿ‰์ž…๋‹ˆ๋‹ค.

VictoriaMetrics๋Š” ๊ฑฐ์˜ ๋ชจ๋“  ์ฒ˜๋ฆฌ ์žฅ์น˜(CPU) ์ „๋ ฅ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋์— ์žˆ๋Š” ๋“œ๋กญ์€ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๊ฐ€ ์‚ฝ์ž…๋œ ํ›„ ๋‚˜๋จธ์ง€ LSM ๋ณ‘ํ•ฉ์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค.

InfluxDB๋Š” vCPU 8๊ฐœ ์ค‘ 16๊ฐœ๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ˜๋ฉด TimsecaleDB๋Š” vCPU 4๊ฐœ ์ค‘ 16๊ฐœ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋“ค์˜ ๊ทธ๋ž˜ํ”„์—๋Š” ์–ด๋–ค ๊ณตํ†ต์ ์ด ์žˆ๋‚˜์š”? ๋†’์€ ์ ์œ ์œจ iowait, ์ด๋Š” ๋‹ค์‹œ I/O ๋ณ‘๋ชฉ ํ˜„์ƒ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

TimescaleDB์˜ ์ ์œ ์œจ์ด ๋†’์Šต๋‹ˆ๋‹ค system. ์šฐ๋ฆฌ๋Š” ๋†’์€ ์ „๋ ฅ์œผ๋กœ ์ธํ•ด ๋งŽ์€ ์‹œ์Šคํ…œ ํ˜ธ์ถœ์ด ๋ฐœ์ƒํ•˜๊ฑฐ๋‚˜ ๋‹ค์ˆ˜์˜ ์‹œ์Šคํ…œ ํ˜ธ์ถœ์ด ๋ฐœ์ƒํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์†Œํ•œ ํŽ˜์ด์ง€ ์˜ค๋ฅ˜.

๋””์Šคํฌ ์ฒ˜๋ฆฌ๋Ÿ‰ ๊ทธ๋ž˜ํ”„๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ณ ์„ฑ๋Šฅ TSDB ๋ฒค์น˜๋งˆํฌ VictoriaMetrics vs TimescaleDB vs InfluxDB

์œ„ ์Šคํฌ๋ฆฐ์ƒท์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. VictoriaMetrics - ๋””์Šคํฌ ๋Œ€์—ญํญ์„ ์‚ฌ์šฉํ•˜์—ฌ 4M ๊ณ ์œ  ๋ฉ”ํŠธ๋ฆญ์„ ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค.

๊ณ ์„ฑ๋Šฅ TSDB ๋ฒค์น˜๋งˆํฌ VictoriaMetrics vs TimescaleDB vs InfluxDB

์œ„ ์Šคํฌ๋ฆฐ์ƒท์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. InfluxDB - ๋””์Šคํฌ ๋Œ€์—ญํญ์„ ์‚ฌ์šฉํ•˜์—ฌ 4M ๊ณ ์œ  ๋ฉ”ํŠธ๋ฆญ์„ ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค.

๊ณ ์„ฑ๋Šฅ TSDB ๋ฒค์น˜๋งˆํฌ VictoriaMetrics vs TimescaleDB vs InfluxDB

์œ„ ์Šคํฌ๋ฆฐ์ƒท์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. TimescaleDB - ๋””์Šคํฌ ๋Œ€์—ญํญ์„ ์‚ฌ์šฉํ•˜์—ฌ 4M ๊ณ ์œ  ๋ฉ”ํŠธ๋ฆญ์„ ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค.

VictoriaMetrics๋Š” ์ตœ๋Œ€ 120MB/s ์ œํ•œ์— ๋„๋‹ฌํ–ˆ์œผ๋ฉฐ ํ‰๊ท  ์“ฐ๊ธฐ ์†๋„๋Š” 40MB/s์˜€์Šต๋‹ˆ๋‹ค. ํ”ผํฌ ๋™์•ˆ ์—ฌ๋Ÿฌ ๋ฒˆ์˜ ๋ฌด๊ฑฐ์šด LSM ์œตํ•ฉ์ด ์ˆ˜ํ–‰๋˜์—ˆ์„ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค.

InfluxDB๋Š” ์“ฐ๊ธฐ ์ œํ•œ์ด 200MB/s์ธ ๋””์Šคํฌ์—์„œ ์ตœ๋Œ€ 340MB/s์˜ ํ‰๊ท  ์“ฐ๊ธฐ ์ฒ˜๋ฆฌ๋Ÿ‰ 120MB/s๋ฅผ ๋‹ค์‹œ ํ•œ๋ฒˆ ์งœ๋ƒˆ์Šต๋‹ˆ๋‹ค. :)

TimescaleDB๋Š” ๋” ์ด์ƒ ๋””์Šคํฌ ์ œํ•œ์ด ์—†์Šต๋‹ˆ๋‹ค. ๋†’์€ ๋น„์œจ๊ณผ ๊ด€๋ จ๋œ ๋‹ค๋ฅธ ๊ฒƒ์— ์˜ํ•ด ์ œํ•œ๋˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. ัะธัั‚ะตะผะฝะพะน CPU ๋ถ€ํ•˜.

IO ์‚ฌ์šฉ๋Ÿ‰ ๊ทธ๋ž˜ํ”„๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ณ ์„ฑ๋Šฅ TSDB ๋ฒค์น˜๋งˆํฌ VictoriaMetrics vs TimescaleDB vs InfluxDB

์œ„ ์Šคํฌ๋ฆฐ์ƒท์€ VictoriaMetrics - ๊ณ ์œ ํ•œ 4M ์‹œ๊ณ„์—ด์— ๋Œ€ํ•œ ์‚ฝ์ž… ํ…Œ์ŠคํŠธ ์ค‘์— I/O๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ณ ์„ฑ๋Šฅ TSDB ๋ฒค์น˜๋งˆํฌ VictoriaMetrics vs TimescaleDB vs InfluxDB

์œ„ ์Šคํฌ๋ฆฐ์ƒท์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. InfluxDB - ๊ณ ์œ ํ•œ 4M ์‹œ๊ณ„์—ด์— ๋Œ€ํ•œ ์‚ฝ์ž… ํ…Œ์ŠคํŠธ ์ค‘์— I/O ์‚ฌ์šฉ.

๊ณ ์„ฑ๋Šฅ TSDB ๋ฒค์น˜๋งˆํฌ VictoriaMetrics vs TimescaleDB vs InfluxDB

์œ„ ์Šคํฌ๋ฆฐ์ƒท์€ TimescaleDB - ๊ณ ์œ ํ•œ 4M ์‹œ๊ณ„์—ด์— ๋Œ€ํ•œ ์‚ฝ์ž… ํ…Œ์ŠคํŠธ ์ค‘ I/O ์‚ฌ์šฉ๋Ÿ‰์ž…๋‹ˆ๋‹ค.

IO ์‚ฌ์šฉ ํŒจํ„ด์€ ๋””์Šคํฌ ๋Œ€์—ญํญ ํŒจํ„ด์„ ๋ฐ˜์˜ํ•ฉ๋‹ˆ๋‹ค. InfluxDB๋Š” IO๊ฐ€ ์ œํ•œ๋˜์–ด ์žˆ๋Š” ๋ฐ˜๋ฉด VictoriaMetrics ๋ฐ TimescaleDB์—๋Š” ์—ฌ์œ  IO ๋ฆฌ์†Œ์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

40์ฒœ๋งŒ ๊ฐœ์˜ ๊ณ ์œ ํ•œ ์‹œ๊ณ„์—ด

40์ฒœ๋งŒ ๊ฐœ์˜ ๊ณ ์œ  ์‹œ๊ณ„์—ด์€ InfluxDB์— ๋น„ํ•ด ๋„ˆ๋ฌด ์ปธ์Šต๋‹ˆ๋‹ค :)

๋ฒค์น˜๋งˆํฌ ๊ฒฐ๊ณผ:

  • VictoriaMetrics: ์ดˆ๋‹น 1,7๋งŒ ๋ฐ์ดํ„ฐ ํฌ์ธํŠธ; RAM ์‚ฌ์šฉ๋Ÿ‰: 29GB; ๋””์Šคํฌ ๊ณต๊ฐ„ ์‚ฌ์šฉ๋Ÿ‰: 17GB.
  • InfluxDB: 60GB ์ด์ƒ์˜ RAM์ด ํ•„์š”ํ•ด์„œ ์™„๋ฃŒ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
  • TimescaleDB: ์ดˆ๋‹น 330K ๋ฐ์ดํ„ฐ ํฌ์ธํŠธ, RAM ์‚ฌ์šฉ๋Ÿ‰: 2,5GB; ๋””์Šคํฌ ๊ณต๊ฐ„ ์‚ฌ์šฉ๋Ÿ‰: 84GB.

TimescaleDB๋Š” ๊ณ ์œ ํ•œ 2,5M ๋ฐ 4K ์ธก์ •ํ•ญ๋ชฉ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ 400GB์—์„œ ๋งค์šฐ ๋‚ฎ๊ณ  ์•ˆ์ •์ ์ธ RAM ์‚ฌ์šฉ๋Ÿ‰์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

VictoriaMetrics๋Š” 100์ฒœ๋งŒ ๊ฐœ์˜ ํƒœ๊ทธ๊ฐ€ ์ง€์ •๋œ ์ง€ํ‘œ ์ด๋ฆ„์ด ๋ชจ๋‘ ์ฒ˜๋ฆฌ๋  ๋•Œ๊นŒ์ง€ ์ดˆ๋‹น 40๊ฐœ ๋ฐ์ดํ„ฐ ํฌ์ธํŠธ์˜ ์†๋„๋กœ ์ฒœ์ฒœํžˆ ํ™•์žฅ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๊ทธ๋Š” ์ดˆ๋‹น 1,5-2,0M ๋ฐ์ดํ„ฐ ํฌ์ธํŠธ์˜ ์ง€์†์ ์ธ ์‚ฝ์ž… ์†๋„๋ฅผ ๋‹ฌ์„ฑํ–ˆ์œผ๋ฏ€๋กœ ์ตœ์ข… ๊ฒฐ๊ณผ๋Š” ์ดˆ๋‹น 1,7M ๋ฐ์ดํ„ฐ ํฌ์ธํŠธ์˜€์Šต๋‹ˆ๋‹ค.

40M ๊ณ ์œ  ์‹œ๊ณ„์—ด์— ๋Œ€ํ•œ ๊ทธ๋ž˜ํ”„๋Š” 4M ๊ณ ์œ  ์‹œ๊ณ„์—ด์— ๋Œ€ํ•œ ๊ทธ๋ž˜ํ”„์™€ ์œ ์‚ฌํ•˜๋ฏ€๋กœ ๊ฑด๋„ˆ๋›ฐ๊ฒ ์Šต๋‹ˆ๋‹ค.

์กฐ์‚ฌ ๊ฒฐ๊ณผ

  • ์ตœ์‹  TSDB๋Š” ๋‹จ์ผ ์„œ๋ฒ„์—์„œ ์ˆ˜๋ฐฑ๋งŒ ๊ฐœ์˜ ๊ณ ์œ ํ•œ ์‹œ๊ณ„์—ด์— ๋Œ€ํ•œ ์‚ฝ์ž…์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ๊ธฐ์‚ฌ์—์„œ๋Š” TSDB๊ฐ€ ์ˆ˜๋ฐฑ๋งŒ ๊ฐœ์˜ ๊ณ ์œ ํ•œ ์‹œ๊ณ„์—ด์—์„œ ์„ ํƒ์„ ์–ผ๋งˆ๋‚˜ ์ž˜ ์ˆ˜ํ–‰ํ•˜๋Š”์ง€ ํ…Œ์ŠคํŠธํ•ฉ๋‹ˆ๋‹ค.
  • CPU ์‚ฌ์šฉ๋ฅ ์ด ๋ถ€์กฑํ•˜๋ฉด ์ผ๋ฐ˜์ ์œผ๋กœ I/O ๋ณ‘๋ชฉ ํ˜„์ƒ์ด ๋ฐœ์ƒํ•จ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ๋˜ํ•œ ํ•œ ๋ฒˆ์— ๋ช‡ ๊ฐœ์˜ ์Šค๋ ˆ๋“œ๋งŒ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์–ด ์ฐจ๋‹จ์ด ๋„ˆ๋ฌด ๊ฑฐ์น ๋‹ค๋Š” ๊ฒƒ์„ ๋‚˜ํƒ€๋‚ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
  • I/O ๋ณ‘๋ชฉ ํ˜„์ƒ์€ ํŠนํžˆ ํด๋ผ์šฐ๋“œ ๊ณต๊ธ‰์ž์˜ ๊ฐ€์ƒํ™”๋œ ๋ธ”๋ก ์žฅ์น˜์™€ ๊ฐ™์€ ๋น„ SSD ์Šคํ† ๋ฆฌ์ง€์—์„œ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.
  • VictoriaMetrics๋Š” ๋Š๋ฆฌ๊ณ  ๋‚ฎ์€ I/O ์Šคํ† ๋ฆฌ์ง€์— ๋Œ€ํ•œ ์ตœ์ƒ์˜ ์ตœ์ ํ™”๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ตœ๊ณ ์˜ ์†๋„์™€ ์ตœ๊ณ ์˜ ์••์ถ•๋ฅ ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์šด๋กœ๋“œ VictoriaMetrics ๋‹จ์ผ ์„œ๋ฒ„ ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ์— ์‚ฌ์šฉํ•ด ๋ณด์„ธ์š”. ํ•ด๋‹น ์ •์  ๋ฐ”์ด๋„ˆ๋ฆฌ๋Š” ๋‹ค์Œ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. GitHub์˜.

์—ฌ๊ธฐ์—์„œ VictoriaMetrics์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณด์„ธ์š”. ๊ธฐ์‚ฌ.

์—…๋ฐ์ดํŠธ: ๊ฒŒ์‹œ๋จ VictoriaMetrics์™€ InfluxDB์˜ ์‚ฝ์ž… ์„ฑ๋Šฅ์„ ๋น„๊ตํ•˜๋Š” ๊ธฐ์‚ฌ ์žฌํ˜„ ๊ฐ€๋Šฅํ•œ ๊ฒฐ๊ณผ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์—…๋ฐ์ดํŠธ #2: ๋˜ํ•œ ์ฝ์–ด๋ณด์„ธ์š” ์ˆ˜์ง ํ™•์žฅ์„ฑ์— ๊ด€ํ•œ ๊ธฐ์‚ฌ VictoriaMetrics vs InfluxDB vs TimescaleDB.

์—…๋ฐ์ดํŠธ #3: VictoriaMetrics๋Š” ์ด์ œ ์˜คํ”ˆ ์†Œ์Šค์ž…๋‹ˆ๋‹ค.!

๋ฒˆ์—ญ: https://t.me/VictoriaMetrics_ru1

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€