Backend Auto Scaling.md - 100-hours-a-week/KTB4-17th-wiki GitHub Wiki

BE Auto Scaling ์„ ์ • ๊ทผ๊ฑฐ

BE Auto Scaling

Task ์ŠคํŽ™: 1 vCPU / 2 GiB

๊ฒฐ์ •

BE๋Š” Task๋‹น 500 RPS๋ฅผ ์šด์˜ ๊ธฐ์ค€์œผ๋กœ Target Tracking์„ ์ ์šฉํ•œ๋‹ค.

์ผ๋ฐ˜์ ์ธ ํŠธ๋ž˜ํ”ฝ ์ฆ๊ฐ€๋Š” ALB RequestCountPerTarget์œผ๋กœ ๋Œ€์‘ํ•˜๊ณ , ๋™์ผํ•œ RPS์—์„œ๋„ ์—ฐ์‚ฐ๋Ÿ‰์ด ๋†’์€ ์š”์ฒญ์œผ๋กœ CPU ๋ถ€ํ•˜๊ฐ€ ์ฆ๊ฐ€ํ•˜๋Š” ์ƒํ™ฉ์— ๋Œ€์‘ํ•˜๊ธฐ ์œ„ํ•ด CPU 60%๋ฅผ Secondary Metric์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

์ฒ˜๋ฆฌ๋Ÿ‰ ๊ธฐ์ค€ ์˜ˆ์ƒ ํ”ผํฌ Task๋Š” 3๊ฐœ์ด๋ฉฐ, ๊ฐ€์šฉ์„ฑ์„ ์œ„ํ•ด ์ตœ์†Œ 2๊ฐœ์˜ Task๋ฅผ ์œ ์ง€ํ•œ๋‹ค.

Scale-Out์€ ํŠธ๋ž˜ํ”ฝ ์ฆ๊ฐ€์— ๋น ๋ฅด๊ฒŒ ๋Œ€์‘ํ•˜๊ธฐ ์œ„ํ•ด 60์ดˆ, Scale-In์€ ๋ฐ˜๋ณต์ ์ธ Task ์ฆ๊ฐ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด 300์ดˆ์˜ Cooldown์„ ์ดˆ๊ธฐ๊ฐ’์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

ํ•ญ๋ชฉ ์„ค์ •
Primary 30,000 req/min/Task (500 RPS)
Secondary CPU 60%
Min Task 2
์˜ˆ์ƒ Peak Task 3
Max Task 6
Scale-Out Cooldown 60์ดˆ
Scale-In Cooldown 300์ดˆ
์„ ์ • ๊ทผ๊ฑฐ

Task 1๊ฐœ์˜ ์ ์ • ์ฒ˜๋ฆฌ๋Ÿ‰์„ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์‹ค์ œ ์„œ๋น„์Šค์˜ READ : WRITE = 3 : 4 ๋น„์œจ๋กœ ๋ถ€ํ•˜ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•˜์˜€๋‹ค.

RPS CPU p95 p99
200 23.6% 4.1 ms 48.8 ms
400 29.6% 6.3 ms 89.7 ms
500 42.8% 2.7 ms 43.3 ms
600 41.6% 83.7 ms 185.8 ms
800 59.6% 105.0 ms 211.6 ms

500 RPS๊นŒ์ง€๋Š” ์•ˆ์ •์ ์ธ ์‘๋‹ต์‹œ๊ฐ„์„ ์œ ์ง€ํ–ˆ์ง€๋งŒ, 600 RPS๋ถ€ํ„ฐ p95๊ฐ€ 83.7ms๋กœ ์ฆ๊ฐ€ํ•˜์˜€๋‹ค.

๋”ฐ๋ผ์„œ ์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ์ „์ธ 500 RPS๋ฅผ Task 1๊ฐœ์˜ ์šด์˜ ๊ธฐ์ค€์œผ๋กœ ์„ค์ •ํ•˜์˜€๋‹ค.

500 RPS ร— 60์ดˆ = 30,000 req/min/Task

CPU๋Š” RPS ์ฆ๊ฐ€์™€ ์ผ์ •ํ•˜๊ฒŒ ๋น„๋ก€ํ•˜์ง€ ์•Š๊ณ  ๋™์ผํ•œ RPS์—์„œ๋„ ๋ณ€๋™์„ฑ์ด ํฌ๊ฒŒ ๋‚˜ํƒ€๋‚ฌ๋‹ค.

RPS CPU ํ‰๊ท  ์ตœ์†Œ ์ตœ๋Œ€ ๋ณ€๋™๊ณ„์ˆ˜
200 23.8% 16.3% 29.0% 14.6%
400 30.5% 24.0% 37.6% 13.9%
500 45.6% 26.3% 97.5% 50.8%
600 43.5% 25.6% 63.2% 29.4%
800 53.9% 30.6% 72.5% 23.4%

๋”ฐ๋ผ์„œ CPU๋ฅผ ์š”์ฒญ๋Ÿ‰์„ ๋Œ€ํ‘œํ•˜๋Š” Primary Metric์œผ๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.

๋‹ค๋งŒ ๋™์ผํ•œ RPS์—์„œ๋„ ์—ฐ์‚ฐ๋Ÿ‰์ด ๋†’์€ ์š”์ฒญ์ด ํŠน์ • Task์— ์ง‘์ค‘๋  ๊ฒฝ์šฐ RPS๊ฐ€ 500์— ๋„๋‹ฌํ•˜๊ธฐ ์ „์— CPU๊ฐ€ ๋จผ์ € ๋†’์•„์งˆ ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฅผ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด CPU 60%๋ฅผ Secondary Metric์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

60%๋Š” RPS ๊ธฐ๋ฐ˜ Scale-Out๋ณด๋‹ค CPU๊ฐ€ ๋จผ์ € ํฌํ™”๋˜๋Š” ์ƒํ™ฉ์— ๋Œ€์‘ํ•˜๊ธฐ ์œ„ํ•œ ์ดˆ๊ธฐ ์šด์˜๊ฐ’์ด๋ฉฐ, ์šด์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํ†ตํ•ด ์žฌ์กฐ์ •ํ•œ๋‹ค.

ํ˜„์žฌ ์˜ˆ์ƒ ํŠธ๋ž˜ํ”ฝ์€ ํ‰๊ท  272 RPS, ํ”ผํฌ 1,470 RPS์ด๋‹ค.

ํ‰๊ท : 272 / 500 = 0.54 Task

ํ”ผํฌ: 1,470 / 500 = 2.94 โ†’ 3 Tasks

์ฒ˜๋ฆฌ๋Ÿ‰๋งŒ ๊ณ ๋ คํ•˜๋ฉด ํ‰์ƒ์‹œ 1 Task๋กœ๋„ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ๊ฐ€์šฉ์„ฑ์„ ์œ„ํ•ด Min Task๋Š” 2๊ฐœ๋กœ ์„ค์ •ํ•œ๋‹ค.

์˜ˆ์ƒ ํ”ผํฌ์—๋Š” 3๊ฐœ์˜ Task๊ฐ€ ํ•„์š”ํ•˜๋ฉฐ, ํ˜„์žฌ ์„œ๋น„์Šค๊ฐ€ ๋น ๋ฅด๊ฒŒ ์„ฑ์žฅํ•˜๊ณ  ์žˆ๋Š” ์ ์„ ๊ณ ๋ คํ•˜์—ฌ ์˜ˆ์ƒ Peak Task์˜ 2๋ฐฐ์ธ 6๊ฐœ๋ฅผ Max Task๋กœ ์„ค์ •ํ•œ๋‹ค.

Cooldown

Scale-Out Cooldown์€ 60์ดˆ๋ฅผ ์ดˆ๊ธฐ๊ฐ’์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

ํ˜„์žฌ ์„œ๋น„์Šค๋Š” ์ˆœ๊ฐ„์ ์ธ Spike๋ณด๋‹ค ์ˆ˜ ์‹œ๊ฐ„์— ๊ฑธ์ณ ํ”ผํฌ๊นŒ์ง€ ํŠธ๋ž˜ํ”ฝ์ด ์ฆ๊ฐ€ํ•˜๋Š” ํŒจํ„ด์„ ๊ฐ€์ง€๋ฉฐ, 500 RPS์—์„œ Scale-Out์„ ์‹œ์ž‘ํ•œ๋‹ค.

Scale-Out ์ดํ›„ ์ถ”๊ฐ€๋œ Capacity๊ฐ€ Metric์— ๋ฐ˜์˜๋  ์‹œ๊ฐ„์„ ํ™•๋ณดํ•˜๋ฉด์„œ๋„ ํŠธ๋ž˜ํ”ฝ ์ฆ๊ฐ€์— ๋น ๋ฅด๊ฒŒ ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ๋„๋ก 60์ดˆ๋ฅผ ์ดˆ๊ธฐ๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•˜๊ณ , ์‹ค์ œ Task ์ƒ์„ฑ ๋ฐ ํŠธ๋ž˜ํ”ฝ ๋ถ„์‚ฐ ์‹œ๊ฐ„์„ ์ธก์ •ํ•œ ์ดํ›„ ์กฐ์ •ํ•œ๋‹ค.

Scale-In์€ Target Tracking์˜ ๊ธฐ๋ณธ ๋™์ž‘์„ ์‚ฌ์šฉํ•˜๋ฉฐ, ์ผ์‹œ์ ์ธ ํŠธ๋ž˜ํ”ฝ ๊ฐ์†Œ์— ๋”ฐ๋ฅธ ๋ฐ˜๋ณต์ ์ธ Task ์ฆ๊ฐ์„ ์ค„์ด๊ธฐ ์œ„ํ•ด 300์ดˆ๋ฅผ ์ดˆ๊ธฐ๊ฐ’์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.


โš ๏ธ **GitHub.com Fallback** โš ๏ธ