์‹œ๊ณ„์—ด DB. InfluxDB์™€ TimescaleDB

[์›๋ณธ ๋งํฌ]

๋Œ€ํ‘œ์ ์ธ ์‹œ๊ณ„์—ด DB์ธ InfluxDB๊ฐ€ ๊ธฐ์กด์˜ DB์™€ ์–ด๋–ค ๊ตฌ์กฐ๋ฅผ ๊ฐ–๊ณ  ์žˆ์œผ๋ฉฐ, ์–ด๋–ค ์žฅ์ ๊ณผ ๋‹จ์ ์„ ๊ฐ–๊ณ  ์žˆ๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ๊ทธ์— ๋Œ€ํ•ญํ•˜๋Š” TimescaleDB์€ ์–ด๋–ค ๋…€์„์ธ์ง€ ํ•œ๋ฒˆ ๋ถ„์„ํ•ด๋ณด๋Š” ์‹œ๊ฐ„์„ ๊ฐ€์ง€๊ฒ ๋‹ค.




์‹œ๊ณ„์—ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค(time series database)

์‹œ๊ณ„์—ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ ์ €์žฅ์˜ ๊ธฐ์ค€์„ ์‹œ๊ฐ„(time)์œผ๋กœ ์‚ผ๋Š” ๊ฒƒ์ด๋‹ค. ๊ธฐ๋ณธํ‚ค๋ฅผ ์ „๋ถ€ ํƒ€์ž„์Šคํƒฌํ”„ ๊ฐ™์€ ๊ฐ’์œผ๋กœ ์‚ผ๋Š”๋‹ค๋Š” ๋œป์ด๋‹ค.

์‹œ๊ณ„์—ดDB๊ฐ€ ๊ฐ€์žฅ ์ฒ˜์Œ ์‚ฌ์šฉ๋œ ๋ถ„์•ผ๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์ˆ˜์น˜๊ฐ’๋“ค์ด ์‹ค์‹œ๊ฐ„์œผ๋กœ ์Œ“์ด๋Š” ํ™˜๊ฒฝ์ด์—ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์„ผ์„œ๋กœ ์ธก์ •๋œ ์ˆ˜์น˜๋“ค์„ ์‹œ๊ฐ„๋Œ€๋ณ„๋กœ ์ €์žฅํ•œ๋‹ค๋“ ๊ฐ€ ํ•˜๋Š” ๊ฒƒ๋“ค ๋ง์ด๋‹ค.

ํ•˜์ง€๋งŒ ํ˜„์žฌ์— ์ด๋ฅด๋Ÿฌ์„œ๋Š” "์‹œ๊ฐ„"์ด ์ค‘์š”ํ•œ ์‹œ์Šคํ…œ์—์„œ๋Š” ๊ฝค๋‚˜ ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ ์‚ฌ์šฉ๋˜๋Š” ํŽธ์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด "์ฃผ์‹ ๊ฑฐ๋ž˜"๋‚˜ "์•”ํ˜ธํ™”ํ ๊ฑฐ๋ž˜" ๋“ฑ์˜ ๊ฑฐ๋ž˜ ์‹œ๊ฐ„์ด ์ค‘์š”ํ•œ ๊ฒฝ์šฐ์—๋Š” ์‹œ๊ณ„์—ด์„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋Œ€์ฒด๋กœ, ๋ฐ์ดํ„ฐ ์ €์žฅ์— ์••์ถ•์„ ์ข€๋” ์ ๊ทน์ ์œผ๋กœ ํ•˜๋Š” ํŽธ์ด๋ผ ๋Œ€ํ˜• ๋ฐ์ดํ„ฐ ์ €์žฅ์—๋„ ์œ ๋ฆฌํ•œ ํŽธ์ด๋‹ค.

ํ•˜์ง€๋งŒ ์‹œ๊ณ„์—ด์˜ ํ‘œ์ค€์ด ์žˆ๋Š” ๊ฒƒ๋„ ์•„๋‹ˆ๋ผ์„œ, DB๋งˆ๋‹ค ๊ฐœ์„ฑ์ด ๋šœ๋ ทํ•˜๊ณ  ์ฐจ์ด์ ์ด ๊ต‰์žฅํžˆ ํฌ๋‹ค. ๊ทธ๋ž˜์„œ ์‹œ๊ณ„์—ด์ด ๋”ฑ ๋ญ๋ผ๊ณ  ๋ช…ํ™•ํ•˜๊ฒŒ ์ •์˜ํ•˜๊ธฐ๋Š” ํž˜๋“ค๋‹ค.




InfluxDB

InfluxDB๋Š” ๋ช…์‹ค์ƒ๋ถ€ํ•œ ์‹œ๊ณ„์—ด์˜ ๋Œ€ํ‘œ์ฃผ์ž๋‹ค. ๊ฐ€์žฅ ์œ ๋ช…ํ•˜๊ณ , ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋œ๋‹ค.
์ฃผ๋ณ€ํ™˜๊ฒฝ์ด ํŠผํŠผํ•˜๊ณ , ์ „์šฉ ํด๋ผ์šฐ๋“œ ์„œ๋น„์Šค๋„ ์ž˜ ์ œ๊ณตํ•˜๋Š” ํŽธ์ด๋‹ค. (๋…ผ๋ž€์ด ๋งŽ๊ธด ํ•˜์ง€๋งŒ)



InfluxDB vs RDBMS

๊ธฐ์กด์˜ RDB๋“ค์ด Tree ๊ธฐ๋ฐ˜์˜ ์ธ๋ฑ์Šค๋ฅผ ํ†ตํ•ด ์ €์žฅ์ด ๋œ๋‹ค๋ฉด, InfluxDB๋ฅผ ์œ„์‹œํ•œ ์‹œ๊ณ„์—ด DB๋“ค์€ ์˜ค์ง "์‹œ๊ฐ„"์— ๊ธฐ๋ฐ˜ํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•œ๋‹ค.

์ถœ์ฒ˜ https://devconnected.com/the-definitive-guide-to-influxdb-in-2019/
๊ทธ๋Ÿฐ๋ฐ ์™œ ์ด๋ ‡๊ฒŒ ํ•ด์•ผํ• ๊นŒ?

๊ธฐ๋ณธ์ ์œผ๋กœ RDB๋“ค์€ ๋‹จ์ผ ๋…ธ๋“œ์—์„œ ์ดˆ๋‹น 20000-100000 ์ˆ˜์ค€์˜ insert๋„ ๊ณง์ž˜ ๊ฐ๋‹นํ•ด๋‚ด๊ณค ํ•œ๋‹ค.
ํ•˜์ง€๋งŒ RDB์—๋Š” ๋งน์ ์ด ์ƒ๋‹นํžˆ ๋งŽ์€๋ฐ, ์ฃผ๋กœ ์‚ฌ์šฉํ•˜๋Š” B-Tree ๊ธฐ๋ฐ˜์˜ ์ธ๋ฑ์Šค๋Š” ์‹œ๊ฐ„์ด ์ง€๋‚˜๊ณ  ๋ฐ์ดํ„ฐ ์ง‘ํ•ฉ์ด ์ปค์ง์— ๋”ฐ๋ผ insert ์„ฑ๋Šฅ์ด ๊ณ„์†ํ•ด์„œ ๋–จ์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

๋ฐ˜๋ฉด ์‹œ๊ณ„์—ด DB๋Š” ์ผ์ •ํ•˜๊ณ  ๋น ๋ฅธ ์ˆ˜์ง‘์— ์ตœ์ ํ™”๋œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง„๋‹ค. ํƒ€์ž„์Šคํƒฌํ”„ ์ธ๋ฑ์Šค์— B-Tree๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„์„œ ๋А๋ฆฐ Rebalancing ๋™์ž‘์ด ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋Œ€์‹  Time Structured Merge Tree๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ํŠน์ˆ˜ํ™”๋œ ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
๊ทธ๋ž˜์„œ ๋‹จ์ผ ๋…ธ๋“œ๋‹น 50000-100000๊ฑด ์ •๋„์˜ insert๋ฅผ ๋ฌด๋ฆฌ์—†์ด ๊ฐ๋‹นํ•  ์ˆ˜ ์žˆ๋‹ค.
RDB์™€ ์„ฑ๋Šฅ์ด ์•„์ฃผ ํฌ๊ฒŒ ์ฐจ์ด๋‚˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ, ์•ˆ์ •์ ์œผ๋กœ ๊ทธ ์„ฑ๋Šฅ์ด ๊ณ„์† ์œ ์ง€๋œ๋‹ค๋Š” ์ ์ด ์ฃผํšจํ•˜๋‹ค.


์žฅ์ 

์ง€์†์ ์ธ ๋ฐ์ดํ„ฐ ๋Œ€๋Ÿ‰์ˆ˜์ง‘์— ์œ ๋ฆฌํ•˜๋‹ค.
InfluxDB ๊ทธ๋ฃน์˜ ๊ธฐ์ˆ ์ง€์›์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค. (์œ ๋ฃŒ)


๋‹จ์ 

์‹œ๋ฆฌ์ฆˆ ์นด๋””๋„๋ฆฌํ‹ฐ, ๊ทธ๋Ÿฌ๋‹ˆ๊นŒ ํƒœ๊ทธ๋‚˜ ํ•„๋“œ์— ์˜ํ•ด ์ธ๋ฑ์‹ฑ๋˜๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๊ฐ€ ๋†’์•„์งˆ์ˆ˜๋ก? insert๋‚˜ read ์ฟผ๋ฆฌ๊ฐ€ ์‹ฌ๊ฐํ•˜๊ฒŒ ๋А๋ ค์ง€๊ณ  ๋ฆฌ์†Œ์Šค๋ฅผ ๊ณผ๋„ํ•˜๊ฒŒ ์†Œ๋ชจํ•œ๋‹ค.
์‹ฌ๊ฐํ•œ ๊ฒฝ์šฐ์—๋Š” ์ˆ˜๋ฐฑ๋งŒ-์ˆ˜์ฒœ๋งŒ๊ฐœ๊ฐ€ ๋˜๋Š” ์ƒํƒœ์—์„œ ์•ฝ๊ฐ„์˜ ๋ถ„์„ ์ฟผ๋ฆฌ๋งŒ ์‚ฌ์šฉํ•ด๋„ ์ˆ˜์‹ญ์ดˆ-๋ถ„ ๋‹จ์œ„๊นŒ์ง€ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆด ์ˆ˜ ์žˆ๋‹ค.
์ด๊ฑด ๋ฐ์ดํ„ฐ ์ž์ฒด๋ฅผ ์‹œ๊ฐ„์œผ๋กœ๋งŒ ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ƒ๊ธฐ๋Š” ํ•œ๊ณ„์ธ๋ฐ, ๋ฌด์กฐ๊ฑด ํ’€์Šค์บ”์„ ๋•Œ๋ ค์„œ ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋“œํ•˜๊ณ  ๋ถ„์„์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๊ธฐ๋„ ํ•˜๋‹ค.




TimescaleDB

TimescaleDB๋Š” PostgreSQL ์—”์ง„์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋งŒ๋“ค์–ด์ง„ ์‹œ๊ณ„์—ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋‹ค.
๊ทธ๋ž˜์„œ ๊ธฐ๋ณธ์ ์ธ ์ €์žฅ ์ „๋žต์€ ๊ธฐ์กด์˜ RDB๋“ค๊ณผ ํฌ๊ฒŒ ๋‹ค๋ฅผ ๊ฒƒ์€ ์—†๋‹ค. ์—ฌ๋Ÿฌ๊ฐ€์ง€ ํŠธ๋ฆญ๋“ค๊ณผ ์ค‘๊ฐ„ ์ถ”์ƒํ™”๋ฅผ ์ ์šฉํ•ด์„œ ์‹œ๊ณ„์—ด DB์ฒ˜๋Ÿผ "๋ณด์ด๊ฒŒ" ๊ตฌํ˜„ํ•œ ๊ฒƒ์ด๋‹ค.

๊ทธ๋ž˜๋„ ์žˆ์„ ๊ฒƒ์€ ๋‹ค ์žˆ๋‹ค.
์‹œ๊ณ„์—ด DB๋“ค ํŠน์œ ์˜ ๋ฐ์ดํ„ฐ ์••์ถ•์„ ํ†ตํ•œ ์ €์žฅ๊ณต๊ฐ„ ํšจ์œจํ™”๋„ ์ œ๊ณตํ•˜๊ณ , ์•„์ฃผ ํ›Œ๋ฅญํ•œ SQL ๊ธฐ๋ฐ˜์˜ ๋ถ„์„ ๊ธฐ๋Šฅ๋„ ์ œ๊ณตํ•œ๋‹ค. RDB๋ฅผ ๊ทธ๋Œ€๋กœ ๊ฐ–๋‹ค์ผ์œผ๋‹ˆ ๋‹น์—ฐํžˆ RDB ์ˆ˜์ค€์˜ ๋ถ„์„์„ฑ๋Šฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.
InfluxDB๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์นด๋””๋„๋ฆฌํ‹ฐ ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค.

๊ทธ๋ฆฌ๊ณ  B-Tree ์ธ๋ฑ์Šค๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜์ง€๋งŒ, Tree์— ์‹œ๊ฐ„ ๊ฐ’์— ๊ธฐ๋ฐ˜ํ•œ Chunk ๋‹จ์œ„๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„ํ•  ์ €์žฅํ•ด์„œ ์‹œ๊ณ„์—ด ํŠน์œ ์˜ ์•ˆ์ •์ ์ธ insert ์„ฑ๋Šฅ๋„ ๋ณด์žฅํ•œ๋‹ค.

์—ฌ๋Ÿฌ๋ชจ๋กœ InfluxDB์˜ ๋‹จ์ ๋“ค์„ ์ž˜ ๊ทน๋ณตํ•œ ํ›Œ๋ฅญํ•œ ์‹œ๊ณ„์—ดDB๋กœ ํ‰๊ฐ€๋ฅผ ๋ฐ›๋Š” ๊ฒƒ ๊ฐ™๋‹ค.

์•„๋ž˜๋Š” InfluxDB์™€ ๋ฒค์น˜๋งˆํฌ๋ฅผ ๋Œ๋ฆฐ ํ‘œ๋‹ค.

https://www.timescale.com/blog/timescaledb-vs-influxdb-for-time-series-data-timescale-influx-sql-nosql-36489299877/
์นด๋””๋„๋ฆฌํ‹ฐ๊ฐ€ ๋‚ฎ์„ ๋•Œ๋Š” InfluxDB๊ฐ€ ๋” ๋น ๋ฅด์ง€๋งŒ, ์นด๋””๋„๋ฆฌํ‹ฐ๊ฐ€ ์กฐ๊ธˆ๋งŒ ๋” ์˜ฌ๋ผ๊ฐ€๋„ timescaleDB์˜ ์„ฑ๋Šฅ์ด ๋” ๋†’์•„์ง€๋Š” ๋ฉด์ด ์žˆ๋‹ค.



์žฅ์ 

RDB์˜ ํ’๋ถ€ํ•œ ๊ธฐ๋Šฅ์„ ์ „๋ถ€ ๋‹ค ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์ธ๋ฑ์Šค ์ถ”๊ฐ€๋ฅผ ํ†ตํ•œ read ์ฟผ๋ฆฌ ์ตœ์ ํ™”์—๋„ ์ œํ•œ์ด ์—†๋‹ค.
์นด๋””๋„๋ฆฌํ‹ฐ ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค.


๋‹จ์ 

์นด๋””๋„๋ฆฌํ‹ฐ๊ฐ€ ๋‚ฎ์„ ๋•Œ๋Š” InfluxDB๋ณด๋‹ค ๋А๋ฆด ์ˆ˜ ์žˆ๋‹ค.



์ฐธ์กฐ
https://stackoverflow.com/questions/34492966/what-is-time-series-database
https://stackoverflow.com/questions/47581703/influx-index-and-high-cardinality