๐Ÿ™

Retrospect and Prospect

Limits of Facebook Prophet

Specific purpose and applications

โ€ข
Time series data with patterns and seasonality
โ€ข
Strong seasonality patterns: Data with similar patterns depends on timeย โ†’ย Login patterns, employee entry, commute patterns
โ€ข
Naver Online Payment Reference -ย https://d2.naver.com/helloworld/0065813
๊ณผ๊ฑฐ์˜ ์žฅ๊ธฐ์ ์ธ ์ถ”์„ธ๋ฅผ ๋ณด๊ณ  ์ดํ›„์˜ ๋Œ€๋žต์ ์ธ ์ถ”์„ธ๋ฅผ ํ™•์ธํ•˜๋Š” ์šฉ๋„๋กœ ์‚ฌ์šฉํ•  ๋•Œ Prophet ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ํ›Œ๋ฅญํ•œ ๊ฒฐ๊ณผ๋ฌผ์„ ๋ณด์—ฌ ์ค€๋‹ค. ํŠนํžˆ ๊ฐ‘์ž‘์Šค๋Ÿฐ ๋ฐ์ดํ„ฐ์˜ ๋ณ€๋™์ด ์—†๋Š” ์ƒํ™ฉ์—์„œ๋Š” ์‹ค์ œ ๋ฐ์ดํ„ฐ์™€ ์•„์ฃผ ๊ทผ์ ‘ํ•œ ์˜ˆ์ธก ๊ฒฐ๊ณผ๋ฅผ ๋ณด์—ฌ ์ค€๋‹ค.ํ•˜์ง€๋งŒ ๋ช…์ ˆ์ด๋‚˜ ๊ธฐํƒ€ ์ƒํ™ฉ์— ์˜ํ•ด ๊ฑฐ๋ž˜๋Ÿ‰์ด ํ•œ์‹œ์ ์œผ๋กœ ํ•˜๋ฝํ•˜๊ฑฐ๋‚˜ ์ฆ๊ฐ€ํ•˜๋Š” ๊ฒฝ์šฐ, ์‚ฌ์—… ํ™•๋Œ€ ๋“ฑ์œผ๋กœ ์ธํ•ด ์ „๋ฐ˜์ ์ธ ๊ฑฐ๋ž˜๋Ÿ‰ ์ž์ฒด๊ฐ€ ๋ณ€๋™๋˜๋Š” ๊ฒฝ์šฐ ๋“ฑ์—์„œ๋Š” ์ ์ ˆํ•œ ์˜ˆ์ธก ๊ฒฐ๊ณผ๋ฅผ ๋ณด์—ฌ ์ฃผ์ง€ ๋ชปํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค. ๊ณผ๊ฑฐ์˜ ์ถ”์„ธ๋ฅผ ๋”ฐ๋ผ ์ฃผ๊ธฐ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค๊ณ  ์ดํ›„์˜ ๊ฑฐ๋ž˜๋ฅผ ์˜ˆ์ธกํ•˜๋Š” ๋ชจ๋ธ์˜ ํ•œ๊ณ„ ๋•Œ๋ฌธ์ด๋‹ค.

DB Active Session๊ณผ ํŠน์ • ์ƒํ’ˆ์˜ ํŒ๋งค ์ถ”์ด๋ฅผ ๊ด€๋ จ์‹œ์ผœ ์˜ˆ์ธกํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๊ฐ€๋Šฅํ•œ๊ฐ€?

๊ณ ๋ ค๋˜์–ด์•ผ ํ•  Factor๊ฐ€ ๋„ˆ๋ฌด ๋งŽ๋‹ค!ย โ†’ย ๋ฐ์ดํ„ฐ ๊ณผํ•™์ž ๋ฐ AI ์˜ ์˜์—ญ
โ€ข
์š”์ผ: ์›”์š”์ผ์— ์ž˜ ํŒ”๋ฆฌ๋˜ ์ œํ’ˆ์ด ์ผ์š”์ผ์—๋„ ์ž˜ ํŒ”๋ฆฌ๋‚˜?
โ€ข
์‹œ๊ฐ„: ์ €๋… 8์‹œ์— ์ž˜ ํŒ”๋ฆฌ๋˜ ์ œํ’ˆ์ด ์˜ค์ „ 8์‹œ์—๋„ ์ž˜ ํŒ”๋ฆฌ๋‚˜?
โ€ข
ํœด์ผ: ํ‰์ผ์— ์ž˜ ํŒ”๋ฆฌ๋˜ ์ œํ’ˆ์ด ํœด์ผ์—๋„ ์ž˜ ํŒ”๋ฆฌ๋‚˜?
โ€ข
์™ธ๋ถ€ ์š”์ธ: ๋‚ ์”จ, ๊ณ„์ ˆ, ์‚ฌํšŒ์  ์ด์Šˆ(๋งˆ์Šคํฌ)์— ๋”ฐ๋ผ ์ž˜ ํŒ”๋ฆฌ๊ณ  ๋œ ํŒ”๋ฆฌ๋Š”๋ฐ ์–ด๋–ป๊ฒŒ ๊ฐ€์ค‘์น˜๋ฅผ ๋‘˜ ๊ฒƒ ์ธ๊ฐ€?

DB Active Session๊ณผ Plain ์ƒํ’ˆ ํŒ๋งค ์ถ”์ด๋งŒ ์กฐํ•ฉํ•˜์—ฌ ์˜ˆ์ธก ๋ชจ๋ธ์„ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์˜๋ฏธ๊ฐ€ ์žˆ๋Š” ๊ฒƒ์ผ๊นŒ?

๊ณ ๋ ค๋˜๋Š” Factor (์‚ฌ์šฉ๊ฐ€๋Šฅ)
โ€ข
์š”์ผ
โ€ข
์‹œ๊ฐ„
โ€ข
ํœด์ผ
Active Session ์นด์šดํŠธ์™€ ์ฃผ๋ฌธ ์ˆ˜๋Ÿ‰์„ ์–ด๋–ป๊ฒŒ ์กฐํ•ฉํ•ด์„œ ์˜ˆ์ธก ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•  ์ง€ ์ƒ๊ฐํ•ด๋ณด์ž (Prophet ์œผ๋กœ ๊ฐ€๋Šฅํ•œ๊ฐ€?)

PoC

๊ทธ๋ ‡๋‹ค๋ฉด ์šฐ์„  DB Active Session ๋งŒ ๊ฐ–๊ณ  ์˜ˆ์ธก์„ ํ•ด ๋ดค์„๋•Œ ์–ด๋А ์ •๋„ ๋งž๋Š”์ง€๋ฅผ ์‚ดํŽด๋ณด์ž

โ€ข
DB Active Session ์นด์šดํŠธ์ˆ˜๋งŒ์œผ๋กœ ์˜ˆ์ธก ๋ฐ์ดํ„ฐ๋ฅผ ๋Œ€์ž…ํ•ด๋ณด๊ณ  ์–ผ์ถ” ๋งž๋Š”์ง€ PoC ํ•ด๋ณด์žย 
โ€ข
DB Active ์‹œ๊ณ„์—ด ๋ฐ์ดํ„ฐ๋ฅผ InfluxDB ์— ์ˆ˜์ง‘ํ•œ๋‹ค
โ€ข
์™œ? ๊ทธ๋ž˜๋„ Static ํ•œ ์•Œ๋ฆผ ํ•œ๊ณ„์น˜๋ฅผ ์„ค์ •ํ•ด์„œ ํ•˜๋Š” ๊ฒƒ ๋ณด๋‹ค ์ข€ ๋” Flexible ํ•œ ์•Œ๋ฆผ ์ˆ˜์น˜๋ฅผ ์ œ์‹œํ•ด ์ค„ ์ˆ˜ ๋„ ์žˆ๋‹ค.

WebDB Active User Session Count ์ˆ˜์ง‘ ๋ฐ ์˜ˆ์ธก

์ค‘์œ„๊ฐ’์„ ๋ฐ”ํƒ•์œผ๋กœ ๊ณตํœด์ผ ๋ฐ์ดํ„ฐ ์ž…๋ ฅํ•˜์—ฌ ์ ์šฉํ•œ ๊ฒฐ๊ณผ

โ€ข
๊ธฐ์กด ์„ธ์…˜์ˆ˜๊ฐ€ ๋‚ฎ์€ ๊ฒฝ์šฐ ์•Œ๋ฆผ์„ ๋ฐ›๋Š” ์„ค์ •์€ ์—†๋‹ค๊ณ  ํ•จ
โ€ข
์„ธ์…˜์ˆ˜๋ฅผ 120์ •๋„๊ฐ€ ๋„˜๋Š” ๊ฒฝ์šฐ ์•Œ๋ฆผ์„ ๋ฐ›๊ณ  ์žˆ๋‹ค๊ณ  ํ•จ
โ€ข
๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๋Š” ์ผ€์ด์Šค๋ฅผ ์‚ดํŽด๋ณด์ž
โ—ฆ
๋งค์ผ ์ƒˆ๋ฒฝ 2์‹œ ๋ฐฐ์น˜ ์ž‘์—…์‹œ ์นด์šดํŠธ ํА
โ–ช
Sub-Daily ์˜ต์…˜์„ ํ™œ์šฉํ•ด์„œ Fitting ํ•ด๋ณด์žย 
โ–ช
On/Off Seasonality ๋ฅผ ํ™œ์šฉํ•ด์„œ Fitting ํ•ด๋ณด์ž

๋งค์ผ 02:03~02:06 ์‚ฌ์ด ๋ฐฐ์น˜์ž‘์—…์— ๋ฐ์ดํ„ฐ๋Š” ๊ทธ๋ž˜ํ”„์—์„œ ์•ˆ๋ณด์ด๊ฒŒ ์ฒ˜๋ฆฌ

โ€ข
์ฟผ๋ฆฌ์— ์กฐ๊ฑด์„ ์ถ”๊ฐ€ํ•œ ์ด์œ : ์˜ˆ์™ธ ์‹œ๊ฐ„์„ ๊ฐ–๊ณ  ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•œ ์‹œ๋ฆฌ์ฆˆ์— ๋ฏธ๋ฆฌ ๋„ฃ๊ณ  Alert ์—์„œ ์กฐ๊ฑด์„ ๊ฑฐ๋Š” ์žฅ์‹์€ ๋‚˜์ค‘์— ์‚ฌ์šฉ ์˜ˆ์ • (๋ณผ ์ˆ˜๊ฐ€ ์—†์œผ๋ฉฐ, ํ•„์š”์‹œ ์ˆ˜์ •ํ•ด์•ผํ•˜๋ฏ€๋กœ)
โ€ข
์ถ”ํ›„์—๋Š” ์—ฌ๋Ÿฌ ์ž‘์—…๋“ค์ด ์žˆ๋Š” ์‹œ๊ฐ„์˜ ๊ฒฝ์šฐ ๋ณ„๋„ ์‹œ๋ฆฌ์ฆˆ๋กœ ๋‹ด๊ณ , ํ•ด๋‹น Alert ์กฐ๊ฑด์— ํ•ด๋‹น ์‹œ๊ฐ„์—๋Š” ์•Œ๋ฆผ ๋ณด๋‚ด์ง€ ์•Š๋„๋ก ์„ค์ • ํ•˜๋ฉด ๊ฐ€๋Šฅ
โ€ข
์• ์ดˆ์— ๋ฐฐ์น˜ ์ž‘์—…์‹œ ์‚ฌ์šฉ๋˜๋Š” ์„ธ์…˜์€ ์ œ์™ธํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด์„ ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธ ํ•„์š”ย โ†’ ์ž‘์—…์ค‘์— ์ž˜๋ชป๋˜๋Š” ๊ฒฝ์šฐ๋„ ๋ด์•ผํ•˜๋ฏ€๋กœ ๋ฐ์ดํ„ฐ ๋ณด์œ ํ•ด์•ผํ•จ
โ€ข
Grafana ์—์„œ๋Š” ํŠน์ • ์‹œ๊ฐ„๋Œ€์— ์•Œ๋ฆผ์„ ์•ˆ๋ณด๋‚ด๋Š” ๋ฐฉ์‹์€ ์š”์ฒญ์ด ๋งŽ์•˜์ง€๋งŒ ์•„์ง ๊ฐœ๋ฐœ๋˜์ง€ ์•Š์Œ
โ€ข
๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ, ํ•ด๋‹น ์‹œ๊ฐ„/๋ถ„์„ ๊ฐ™์€ ํ…Œ์ด๋ธ”์— ์ž…๋ ฅํ•˜๋„๋ก ํ•˜์—ฌ, query ์กฐ๊ฑด์— ์ž…๋ ฅํ•จ
SELECT max("qty") FROM "active_session_webdb" WHERE $timeFilter and (hour != 2 and minute < 6 and minute > 3) GROUP BY time($__interval) fill(linear)
SQL
๋ณต์‚ฌ

Redis ์ •๋ณด ์ˆ˜์ง‘ ๋ฐ ์˜ˆ์ธก ๋ฐ์ดํ„ฐ ์ƒ์„ฑ - Data ๊ธฐ๋ฐ˜ ์žฅ์•  ์ด์ƒ์ง•ํ›„ ๊ฐ์ง€ PoC

โ€ข
ํ˜„์žฌ: Prometheus ๋กœ ์ˆ˜์ง‘๋˜๊ณ  ์žˆ๋Š” ์ž๋ฃŒ๋ฅผ Grafana์— ์—ฐ๋™ํ•˜์—ฌ ๋ชจ๋‹ˆํ„ฐ๋ง ์ง„ํ–‰์ค‘
โ€ข
Redis์˜ Key ์นด์šดํŠธ๊ฐ€ ์ฆ๊ฐ€๋งŒ ํ•˜๊ณ  ์ค„์–ด๋“ค์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ์žฅ์•  ๋ฐœ์ƒ ํ•  ์ˆ˜ ์žˆ์Œ (๋ฉ”๋ชจ๋ฆฌ ์†Œ์ง„)
โ€ข
Key ์นด์šดํŠธ๋ฅผ ๋ณด๋ฉด ํŒจํ„ด์ด ๋ณด์ด๊ธฐ๋Š” ํ•˜์—ฌ ์ ์šฉ ๊ฐ€๋Šฅ์„ฑ์ด ๋ณด์ž„
โ€ข
๊ฐ™์€ Category ์—์„œ๋Š” Load Balancing ์ด ๋˜์–ด ์žˆ๋Š”์ง€ ๊ฑฐ์˜ ์ผ์น˜ํ•˜๋Š” ํŒจํ„ด์„ ๋ณด์ž„ (์ž‘์—…์‹œ์ ์„ ์ œ์™ธํ•˜๋ฉด ๋‹ค๋ฅธ ํŒจํ„ด์„ ๋ณด์ด๋Š” ๊ฒฝ์šฐ ์•Œ๋ฆผ์„ ์ ์šฉ ํ•  ์ˆ˜ ์žˆ์„์ง€๋„...)
โ€ข
Redis ๋ฅผ ๋ฐ”๋ผ๋ณด๋Š” WAS์˜ ๋Œ“์ˆ˜๋ฅผ ์–ผ์ถ” ๋น„์Šทํ•˜๊ฒŒ ๋‚˜๋ˆ ๋†“๊ณ  ์‚ฌ์šฉํ•˜๋Š” ํ‚ค์—ฌ์„œ ๊ฐ™์€ ์นดํ…Œ๊ณ ๋ฆฌ์˜ ์ˆ˜๊ฐ€ ๋‹ฌ๋ผ๋„ ์ด์ƒํ•  ๊ฒƒ์ด ์—†์Œ
โ€ข
Key Count ๋Š” ์ œ์™ธ: MC ๊ฐœ์ธํ™”์˜ ๊ฒฝ์šฐ 0์ด์—ฌ๋„ ์ด์ƒํ•œ ๊ฒƒ์ด ์•„๋‹˜, ๊ทธ๋ƒฅ DB ์šฉ๋„๋กœ ์‚ฌ์šฉํ•˜์—ฌ ์ œ์™ธ

Data ์ €์žฅ ๊ณ„ํš: Prometheusย โ†’ InfluxDB

โ€ข
Redis ์ •๋ณด๋Š” Prometheus ๋กœ ์ €์žฅ๋˜์–ด ์žˆ์Œ
โ€ข
Prometheus ์— ์˜ˆ์ธก ๋ฐ์ดํ„ฐ๋ฅผ ์ž…ํžˆ๋Š” ์ž‘์—…์€ ์ถ”์ฒœ๋˜์ง€ ์•Š์Œ
โ—ฆ
์˜ˆ์ „ ๋ฐ์ดํ„ฐ, ๋ฏธ๋ž˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ์ž˜ ๋™์ž‘ํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ๋“ค์Œ

Data ์ถ”์ถœ

โ€ข
Prometheus RestAPI ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”์ถœ
โ€ข
Python Pandas ๋ฅผ ํ†ตํ•ด DataFrame ์„ Merge ํ•˜์—ฌ ํ•œ๊ฐœ์˜ InfluxDB์— ์ฃผ์ž…
โ€ข
InfluxDB ์ฃผ์ž…์‹œ Facebook Prophet ์˜ˆ์ธก ๋ฐ์ดํ„ฐ๋„ ํ•จ๊ป˜ ์ถ”๊ฐ€ย โ†’ Prometheus ์™€ InfluxDB ์‹ฑํฌ ํ”„๋กœ์„ธ์Šค๋ฅผ ์†Œ๋Ÿ‰์œผ๋กœ ์ž์ฃผํ•˜๊ณ , ๋ณ„๋„ ํ”„๋กœ์„ธ์Šค๋กœ ์˜ˆ์ธก ๋ฐ์ดํ„ฐ ์ƒ์„ฑ ๋ฐฐ์น˜๊ฐ€ ํ•„์š”ํ•จ
โ€ข
Prometheus ์—์„œ ์ถ”์ถœ์‹œ ์‹œ๋ฆฌ์ฆˆ๋‹น 11,000 ํฌ์ธํŠธ ์ด์ƒ ์ถ”์ถœ์‹œ 400 ์—๋Ÿฌ ๋ฐœ์ƒย โ†’ ๋ฒ”์œ„๋ฅผ ์ข๊ฒŒ ๋˜๋Š” ๊ทธ๋ฃนํ•‘ ํ•ด์„œ ํ•ด์•ผํ•จ

Data ํ™•์ธ

Local ํ™˜๊ฒฝ์— InfluxDB ์‹คํ–‰

docker run -p 8086:8086 -v influxdb:/var/lib/influxdb influxdb

Local ํ™˜๊ฒฝ์— Chronograf ์‹คํ–‰

docker run -it --rm -p 18888:8888 chronograf --influxdb-url=http://*.*.*.*:8086

Data ์ฃผ์ž…

Crontab ์„ค์ •

โ€ข
Prometheusย โ†’ InfluxDB ๋กœ ์‹ฑํฌ๋Š” 1๋ถ„ ์ฃผ๊ธฐ๋กœ ๋งˆ์ง€๋ง‰ 2๋ถ„ ๊ฐ„์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ์ž…
โ€ข
์˜ˆ์ธก ๋ฐ์ดํ„ฐ ์ƒ์„ฑ์€ 30์ผ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ˜„์žฌ ์‹œ๊ฐ„ + 3์‹œ๊ฐ„ ์˜ˆ์ธก ๋ฐ์ดํ„ฐ๋ฅผ ์‹œ๊ฐ„๋‹จ์œ„๋กœ 10๋ถ„์— ์‹œ์ž‘ํ•˜์—ฌ 3์„ธํŠธ(๊ณตํ†ต, ๋งค์žฅ, ๊ณตํ†ต)์˜ ์˜ˆ์ธก ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ์ž… (๋ฐ์Šคํฌํƒ‘์—์„œ ์‹คํ–‰์‹œ 28๋ถ„์ •๋„ ์†Œ์š” ๋จ)
* * * * * /home/phil/Documents/prophet/redisSync.sh >> /home/phil/Documents/prophet/log_redisSync.log 2>&1 30 * * * * /home/phil/Documents/prophet/forecastRedisKeyCount.sh >> /home/phil/Documents/prophet/log_redisForecast.log 2>&1
Bash
๋ณต์‚ฌ

Data ์ ์šฉ ์˜ˆ์ • ๋ฒ”์œ„

โ€ข
Key Count: ์™„๋ฃŒ
โ€ข
Client

์•Œ๋ฆผ ์„ค์ • ์ž‘์šฉ ์˜ˆ์ • ๋ฒ”์œ„

โ€ข
์ƒํ•˜์œ„ ์˜ˆ์ธก ๊ฐ’ ๋ฒ—์–ด๋‚˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์•Œ๋ฆผ (๊ฒฝ๊ณ )
โ€ข
์„ธํŠธ๋กœ ๊ตฌ์„ฑ๋œ ์„œ๋น„์Šค์— ๋Œ€ํ•ด์„œ๋Š” ๋‘ ๊ทธ๋ž˜ํ”„์˜ ์ฐจ์ด๊ฐ€ ํŠน์ • ๊ฐ’์ด์ƒ ๋ฒŒ์–ด์ง€๋Š” ๊ฒฝ์šฐ ์•Œ๋ฆผ (๊ฒฝ๊ณ )
โ—ฆ
์˜ˆ) ๊ณตํ†ต 1 vs ๊ณตํ†ต 2 ๊ฐ’์ด ๊ฐ‘์ž๊ธฐ ๋งŽ์ด ์ฐจ์ด๋‚˜๋Š” ๊ฒฝ์šฐ (์˜ˆ์ธก๋ฒ”์œ„์—์„œ ๋ฒ—์–ด๋‚˜๋Š” ๊ฒƒ์œผ๋กœ๋„ ์ปค๋ฒ„๊ฐ€ ๋  ๋“ฏ)

Grafana ์ ์šฉ

Alternatives

Comming soon