Skip to content

oOccasio/loadBalancing

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

39 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

๐Ÿš€ ๋กœ๋“œ๋ฐธ๋Ÿฐ์‹ฑ ๊ตฌํ˜„ ๋ฐ ๋ถ€ํ•˜ํ…Œ์ŠคํŠธ

โš–๏ธ Load Balancer โ€” 6๊ฐ€์ง€ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ตฌํ˜„ ๋ฐ ์„ฑ๋Šฅ ๋น„๊ต ๋ถ„์„

6๊ฐ€์ง€ ๋กœ๋“œ๋ฐธ๋Ÿฐ์‹ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ง์ ‘ ๊ตฌํ˜„ํ•˜๊ณ , 3๊ฐ€์ง€ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ ์ฒด๊ณ„์ ์œผ๋กœ ์„ฑ๋Šฅ์„ ๋น„๊ตํ•œ ํ”„๋กœ์ ํŠธ

๐Ÿ“Œ ํ”„๋กœ์ ํŠธ ๊ฐœ์š”

"์–ด๋–ค ๋กœ๋“œ๋ฐธ๋Ÿฐ์‹ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๊ฐ€์žฅ ์ข‹์€๊ฐ€?"๋ผ๋Š” ์งˆ๋ฌธ์— ๋ฐ์ดํ„ฐ ๊ธฐ๋ฐ˜์œผ๋กœ ๋‹ตํ•˜๊ธฐ ์œ„ํ•œ ํ”„๋กœ์ ํŠธ์ž…๋‹ˆ๋‹ค.

6๊ฐ€์ง€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ Spring Boot๋กœ ์ง์ ‘ ๊ตฌํ˜„ํ•˜๊ณ , Docker ๊ธฐ๋ฐ˜ 4๋Œ€ ์„œ๋ฒ„ ํ™˜๊ฒฝ์—์„œ K6 ๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. Prometheus + Grafana๋กœ 8๊ฐœ ๋ฉ”ํŠธ๋ฆญ์„ ์‹ค์‹œ๊ฐ„ ์ˆ˜์ง‘ํ•˜์—ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜๋ณ„ ์„ฑ๋Šฅ ํŠน์„ฑ, ์žฅ์•  ๋Œ€์‘๋ ฅ, ๋ถ€ํ•˜ ๋ถ„์‚ฐ ํŒจํ„ด์„ ์ •๋Ÿ‰์ ์œผ๋กœ ๋น„๊ตํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ•ต์‹ฌ ์„ฑ๊ณผ

  • Least Connections๊ฐ€ RPS, ์‘๋‹ต์‹œ๊ฐ„, ๋ถ„์‚ฐ ๊ท ๋“ฑ์„ฑ ๋ชจ๋‘์—์„œ 1์œ„๋ฅผ ๊ธฐ๋ก
  • Least Response Time์—์„œ ์Šค๋…ธ์šฐ๋ณผ ํšจ๊ณผ ๋ฐœ๊ฒฌ โ€” ์ด๋ก ์  ์ตœ์  ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์‹ค์ œ๋กœ๋Š” ๋‹จ์ผ ์žฅ์• ์ ์„ ์ƒ์„ฑ
  • IP Hash๊ฐ€ ์žฅ์•  ๋Œ€์‘ ์—๋Ÿฌ์œจ 0.00%(3๊ฑด/41,320๊ฑด)์œผ๋กœ ์‚ฌ์‹ค์ƒ ๋ฌด์ค‘๋‹จ ๋‹ฌ์„ฑ
  • ๋ฝํ”„๋ฆฌ ๋™์‹œ์„ฑ ์ œ์–ด ์„ค๊ณ„ ๋ฐ blocking I/O ํ™˜๊ฒฝ์—์„œ์˜ ๋ณ‘๋ชฉ ๋ถ„์„

๐Ÿ—๏ธ ์‹œ์Šคํ…œ ์•„ํ‚คํ…์ฒ˜

์•„ํ‚คํ…์ฒ˜

๐Ÿ› ๏ธ ๊ธฐ์ˆ  ์Šคํƒ

๋ถ„๋ฅ˜ ๊ธฐ์ˆ 
๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ Spring Boot, Java 21, WebClient
๋ฐฑ์—”๋“œ ์„œ๋ฒ„ Docker Compose (4๊ฐœ ์ปจํ…Œ์ด๋„ˆ)
๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ K6
๋ชจ๋‹ˆํ„ฐ๋ง Prometheus, Grafana, Micrometer
๋™์‹œ์„ฑ ์ œ์–ด AtomicInteger, volatile, ConcurrentHashMap, ConcurrentSkipListMap, ThreadLocal, CopyOnWriteArrayList

โš™๏ธ ๊ตฌํ˜„ ์•Œ๊ณ ๋ฆฌ์ฆ˜

์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ถ„๋ฅ˜ ํ•ต์‹ฌ ์›๋ฆฌ
Round Robin ์ •์  ์ˆœ์ฐจ์  ์„œ๋ฒ„ ์„ ํƒ
Weighted Round Robin ์ •์  ๊ฐ€์ค‘์น˜ ๊ธฐ๋ฐ˜ ๋น„๋ก€ ๋ถ„๋ฐฐ (6:3:2:1)
Least Connections ๋™์  ํ˜„์žฌ ํ™œ์„ฑ ์—ฐ๊ฒฐ ์ˆ˜ ์ตœ์†Œ์ธ ์„œ๋ฒ„ ์„ ํƒ
IP Hash ํ•ด์‹œ ํด๋ผ์ด์–ธํŠธ IP ํ•ด์‹œ๋กœ ์„œ๋ฒ„ ๊ณ ์ • + ์บ์‹œ ๋งคํ•‘
Consistent Hashing ํ•ด์‹œ ํ•ด์‹œ ๋ง + ๊ฐ€์ƒ ๋…ธ๋“œ(150๊ฐœ)๋กœ ์ตœ์†Œ ์žฌ๋ฐฐ์น˜
Least Response Time ๋™์  ํ‰๊ท  ์‘๋‹ต์‹œ๊ฐ„ ์ตœ์ € ์„œ๋ฒ„ ์„ ํƒ (Circular Buffer)

๐Ÿ“Š ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ

Steady Load (VU 100, 3๋ถ„)

์•Œ๊ณ ๋ฆฌ์ฆ˜ RPS avg (ms) Active Conn ๋ถ„ํฌ
Round Robin 281.9 253.58 4 / 11 / 22 / 36
Weighted RR 387.4 157.10 6 / 14 / 18 / 16
Least Connections 421.0 136.58 14 / 14 / 14 / 14
IP Hash 281.9 253.61 2 / 13 / 19 / 32
Consistent Hashing 279.5 256.64 ์œ ์‚ฌ ํŒจํ„ด
Least Response Time 640.4* 55.68* 35 / 0 / 0 / 0

*LRT๋Š” server-1์— 100% ์ง‘์ค‘ โ€” ๋กœ๋“œ๋ฐธ๋Ÿฐ์‹ฑ์ด ์•„๋‹Œ ๋‹จ์ผ ์„œ๋ฒ„ ์„ ํƒ

Server Failure (server-1 ๋‹ค์šด)

์•Œ๊ณ ๋ฆฌ์ฆ˜ RPS ์—๋Ÿฌ์œจ ์—๋Ÿฌ ๊ฑด์ˆ˜ RPS ํ•˜๋ฝํญ
Round Robin 229.7 0.83% 345 18.5%
Weighted RR 280.7 0.52% 265 27.5%
Least Connections 288.8 0.61% 319 31.4%
IP Hash 228.8 0.00% 3 18.8%
Consistent Hashing 227.0 0.36% 150 18.8%
Least Response Time 422.4* 0.03% 23 34.0%

๐Ÿ” ํ•ต์‹ฌ ๋ฐœ๊ฒฌ ์‚ฌํ•ญ

1. Least Connections์˜ "๋™์  ๊ฐ€์ค‘์น˜ ํšจ๊ณผ"

LC๋Š” ์ฒ˜๋ฆฌ์‹œ๊ฐ„์„ ์ง์ ‘ ์ธก์ •ํ•˜์ง€ ์•Š์ง€๋งŒ, ๋น ๋ฅธ ์„œ๋ฒ„๊ฐ€ ์—ฐ๊ฒฐ์„ ๋นจ๋ฆฌ ํ•ด์ œ โ†’ ํ•ญ์ƒ ์ตœ์†Œ ์—ฐ๊ฒฐ ์œ ์ง€ โ†’ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋” ๋งŽ์€ ์š”์ฒญ ์ฒ˜๋ฆฌ. Active Connections๊ฐ€ 14/14/14/14๋กœ ์™„๋ฒฝํ•œ ๊ท ๋“ฑ ๋ถ„์‚ฐ์„ ์ด๋ฃจ๋ฉด์„œ ๋™์‹œ์— **์ตœ๊ณ  RPS(421.0)**๋ฅผ ๋‹ฌ์„ฑํ–ˆ๋‹ค.

2. LRT์˜ ์Šค๋…ธ์šฐ๋ณผ ํšจ๊ณผ ๐ŸŒจ๏ธ

Least Response Time์ด ๊ฐ€์žฅ ๋น ๋ฅธ ์„œ๋ฒ„์— ํŠธ๋ž˜ํ”ฝ์„ 100% ์ง‘์ค‘์‹œ์ผœ ์‚ฌ์‹ค์ƒ ๋กœ๋“œ๋ฐธ๋Ÿฐ์‹ฑ์ด ๋™์ž‘ํ•˜์ง€ ์•Š๋Š” ํ˜„์ƒ์„ ๋ฐœ๊ฒฌํ–ˆ๋‹ค. ์žฅ์•  ๋ฐœ์ƒ ์‹œ์—๋„ ์ ๋ฆผ์ด server-2๋กœ ์ด์ „๋  ๋ฟ(Active Connections: 0/100/0/0), ๊ทผ๋ณธ์ ์œผ๋กœ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์•˜๋‹ค.

์ •์ƒ: server-1์— 100% โ†’ ์žฅ์•  ๋ฐœ์ƒ โ†’ server-2์— 100% (์ ๋ฆผ ์ด์ „)

3. IP Hash์˜ ์žฅ์•  ๋Œ€์‘

์„ฑ๋Šฅ(RPS)์—์„œ๋Š” Round Robin๊ณผ ๋™์ผํ•˜์ง€๋งŒ, ์žฅ์•  ์‹œ ์—๋Ÿฌ 3๊ฑด(0.00%)์œผ๋กœ ์‚ฌ์‹ค์ƒ ๋ฌด์ค‘๋‹จ์„ ๋‹ฌ์„ฑํ–ˆ๋‹ค. ์บ์‹œ ๋งคํ•‘(ipServerMapping.compute())์—์„œ unhealthy ์„œ๋ฒ„๋ฅผ ์ฆ‰์‹œ ๊ฐ์ง€ํ•˜๊ณ  ์žฌ์„ ํƒํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

4. p95๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ฐจ์ด๋ฅผ ๋ฐ˜์˜ํ•˜์ง€ ์•Š๋Š”๋‹ค

๋ชจ๋“  ์•Œ๊ณ ๋ฆฌ์ฆ˜์—์„œ p95 โ‰ˆ 502ms๋กœ ์ˆ˜๋ ด. ๊ฐ€์žฅ ๋А๋ฆฐ ์„œ๋ฒ„(500ms)๋กœ ๊ฐ€๋Š” ์š”์ฒญ์ด ํ•ญ์ƒ ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ. ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ฐ„ ์ฐจ์ด๋Š” avg, med, RPS์—์„œ ๋“œ๋Ÿฌ๋‚œ๋‹ค.


๐Ÿ”’ ๋™์‹œ์„ฑ ์ œ์–ด ์„ค๊ณ„

synchronized ๋Œ€์‹  ๋ฝํ”„๋ฆฌ(lock-free) ๊ธฐ๋ฐ˜์œผ๋กœ ์„ค๊ณ„ํ•˜์—ฌ ์ปจํ…์ŠคํŠธ ์Šค์œ„์นญ์„ ์ตœ์†Œํ™”ํ–ˆ๋‹ค.

๊ตฌ์กฐ ์ ์šฉ ์œ„์น˜ ์„ ํƒ ์ด์œ 
AtomicInteger (CAS) RR/WRR ์ธ๋ฑ์Šค ๋‹จ์ผ ์นด์šดํ„ฐ์˜ ์›์ž์  ์ฆ๊ฐ€
volatile ์„œ๋ฒ„ ๋ฆฌ์ŠคํŠธ ์ฐธ์กฐ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ๊ฐ„ ๋ฉ”๋ชจ๋ฆฌ ๊ฐ€์‹œ์„ฑ ๋ณด์žฅ
ConcurrentHashMap IP Hash ์บ์‹œ ํ‚ค๋ณ„ ๋…๋ฆฝ ๋ฝ์œผ๋กœ ๊ฒฝํ•ฉ ์ตœ์†Œํ™”
ConcurrentSkipListMap CH ํ•ด์‹œ ๋ง ์ •๋ ฌ๋œ ๊ตฌ์กฐ์˜ ๋™์‹œ ์ ‘๊ทผ
ThreadLocal ์‹œ๊ฐ„ ํฌ๋งทํ„ฐ ์Šค๋ ˆ๋“œ๋ณ„ ๋…๋ฆฝ ์ธ์Šคํ„ด์Šค
Copy-on-Write ์„œ๋ฒ„ ๋ฆฌ์ŠคํŠธ ๋ณ€๊ฒฝ ์ฝ๊ธฐ >> ์“ฐ๊ธฐ์ธ ๊ตฌ์กฐ์— ์ตœ์ 

์„ฑ๋Šฅ ๊ฒ€์ฆ: VU 400(8,900 RPS) ํ™˜๊ฒฝ์—์„œ synchronized ๋Œ€๋น„ 3% ์ด๋‚ด ์ฐจ์ด. ํ˜„์žฌ ๊ตฌ์กฐ์—์„œ๋Š” WebClient.block()์˜ ๋„คํŠธ์›Œํฌ I/O๊ฐ€ ๋ณ‘๋ชฉ์ด์–ด์„œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์„ ํƒ ๊ตฌ๊ฐ„(๋‚˜๋…ธ~๋งˆ์ดํฌ๋กœ์ดˆ)์˜ ๊ฒฝํ•ฉ์ด ์ „์ฒด ์„ฑ๋Šฅ์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์ด 0.01% ๋ฏธ๋งŒ. Nginx์ฒ˜๋Ÿผ non-blocking ์ด๋ฒคํŠธ ๋ฃจํ”„ ๊ธฐ๋ฐ˜์—์„œ๋Š” ๋ฝํ”„๋ฆฌ ์„ค๊ณ„๊ฐ€ ์œ ์˜๋ฏธํ•ด์ง„๋‹ค.


๐Ÿ“ˆ ๋ชจ๋‹ˆํ„ฐ๋ง ์‹œ์Šคํ…œ

Prometheus + Grafana ๊ธฐ๋ฐ˜ 8๊ฐœ ์ปค์Šคํ…€ ๋ฉ”ํŠธ๋ฆญ ์‹ค์‹œ๊ฐ„ ์ˆ˜์ง‘:

๋ฉ”ํŠธ๋ฆญ ์„ค๋ช…
requests_total ์•Œ๊ณ ๋ฆฌ์ฆ˜/์„œ๋ฒ„๋ณ„ ์ด ์š”์ฒญ ์ˆ˜
response_time_seconds ์„œ๋ฒ„๋ณ„ ์‘๋‹ต์‹œ๊ฐ„ ํžˆ์Šคํ† ๊ทธ๋žจ
algorithm_duration_seconds ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์„ ํƒ ์†Œ์š”์‹œ๊ฐ„
active_connections ์„œ๋ฒ„๋ณ„ ํ˜„์žฌ ํ™œ์„ฑ ์—ฐ๊ฒฐ ์ˆ˜
errors_total ์—๋Ÿฌ ์œ ํ˜•๋ณ„ ์นด์šดํŠธ
server_health ์„œ๋ฒ„ ํ—ฌ์Šค ์ƒํƒœ (0/1)
backend_selection_total ์„œ๋ฒ„ ์„ ํƒ ํšŸ์ˆ˜

๐Ÿš€ ์‹คํ–‰ ๋ฐฉ๋ฒ•

1. ๋ฐฑ์—”๋“œ ์„œ๋ฒ„ ์‹คํ–‰

docker-compose up -d

2. ๋ชจ๋‹ˆํ„ฐ๋ง ์‹คํ–‰

cd monitoring
docker-compose up -d

3. ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ ์‹คํ–‰

./gradlew bootRun

4. ๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ

# Steady Load
k6 run k6/steady_load.js

# Burst
k6 run k6/burst_load.js

# Server Failure (ํ…Œ์ŠคํŠธ ์ค‘ docker stop web-server-1)
k6 run k6/server_failure.js

5. ๋Œ€์‹œ๋ณด๋“œ ํ™•์ธ

๐ŸŽฏ ์ƒํ™ฉ๋ณ„ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์„ ํƒ ๊ฐ€์ด๋“œ

์ƒํ™ฉ ์ถ”์ฒœ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ทผ๊ฑฐ
์„œ๋ฒ„ ์ŠคํŽ™ ๋™์ผ Round Robin ๊ตฌํ˜„ ๋‹จ์ˆœ, ๊ท ๋“ฑ ๋ถ„๋ฐฐ
์„œ๋ฒ„ ์ŠคํŽ™ ์ƒ์ด Weighted RR RR ๋Œ€๋น„ RPS 37%โ†‘
๋ฒ”์šฉ ์›น ์„œ๋น„์Šค Least Connections RPSยท์‘๋‹ต์‹œ๊ฐ„ยท๊ท ๋“ฑ์„ฑ ๋ชจ๋‘ 1์œ„
์„ธ์…˜ ์œ ์ง€ ํ•„์š” IP Hash ์žฅ์•  ๋Œ€์‘ ์—๋Ÿฌ์œจ 0.00%
์„œ๋ฒ„ ์ž์ฃผ ๋ณ€๊ฒฝ Consistent Hashing ์ตœ์†Œ ์žฌ๋ฐฐ์น˜

๐Ÿ“ ํ–ฅํ›„ ๊ฐœ์„  ๋ฐฉํ–ฅ

  • ์žฌ์‹œ๋„ ๋กœ์ง: ์š”์ฒญ ์‹คํŒจ ์‹œ ๋‹ค๋ฅธ ์„œ๋ฒ„๋กœ 1ํšŒ ์žฌ์‹œ๋„ํ•˜์—ฌ ์—๋Ÿฌ์œจ ์ถ”๊ฐ€ ๊ฐ์†Œ
  • LRT ์Šค๋…ธ์šฐ๋ณผ ๋ฐฉ์ง€: ์‘๋‹ต์‹œ๊ฐ„ ร— ํ™œ์„ฑ์—ฐ๊ฒฐ์ˆ˜ ๋ณตํ•ฉ ์ ์ˆ˜ ๋„์ž…
  • ML ๊ธฐ๋ฐ˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜: ์‹ค์‹œ๊ฐ„ ๋ฉ”ํŠธ๋ฆญ ๊ธฐ๋ฐ˜ ๋™์  ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ „ํ™˜

About

Load-Balancer-project

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors