๐ ์ฌ์ฉ์๊ฐ ๋์ด๋๋ฉด, ์๋ฒ๋ ์ด๋ป๊ฒ ํ์ฅํ ๊น?
์๋น์ค ์ด์ ์ค ์๋ฒ๋ ๋ช ๋๊ฐ ํ์ํ ๊น?
โ
์ฌ์ฉ์๊ฐ ์ ๋ค๋ฉด 1๋์ ์๋ฒ๋ก๋ ์ถฉ๋ถํ์ง๋ง,
โ
์ฌ์ฉ์๊ฐ ์ฆ๊ฐํ๋ฉด ์๋ฒ์ ๋ถํ๊ฐ ์ปค์ง๊ณ , ์ฌํ๋ฉด ์๋ฒ๊ฐ ๋ค์ด๋ ์๋ ์๋ค.
์ด๋ด ๋ "์ค์ผ์ผ ์ (Scale-Up)" ๋๋ "์ค์ผ์ผ ์์(Scale-Out)"์ ํตํด ์๋ฒ๋ฅผ ํ์ฅํด์ผ ํ๋ค.
๐๏ธ ์๋ฒ ํ์ฅ ๋ฐฉ๋ฒ
1๏ธโฃ ์ค์ผ์ผ ์ (Scale-Up)
โ ํ์ฌ ์๋ฒ์ ์ฑ๋ฅ์ ์
๊ทธ๋ ์ด๋ํ๋ ๋ฐฉ๋ฒ
โ CPU, ๋ฉ๋ชจ๋ฆฌ, ๋์คํฌ ์ถ๊ฐํ์ฌ ์ฒ๋ฆฌ ๋ฅ๋ ฅ ํฅ์
โ (์์ง ํ์ฅ, Vertical Scaling)
2๏ธโฃ ์ค์ผ์ผ ์์ (Scale-Out)
โ ์๋ฒ ๊ฐ์๋ฅผ ๋๋ ค ๋ถํ๋ฅผ ๋ถ์ฐํ๋ ๋ฐฉ๋ฒ
โ ์ฌ๋ฌ ๋์ ์๋ฒ๊ฐ ๋์ผํ ์์ฒญ์ ์ฒ๋ฆฌ
โ (์ํ ํ์ฅ, Horizontal Scaling)
๐ก ์ค์ผ์ผ ์์ ์ "๋ก๋ ๋ฐธ๋ฐ์(Load Balancer)"๊ฐ ํ์
๐ ๋ก๋ ๋ฐธ๋ฐ์(Load Balancer)๋?
๋ก๋ ๋ฐธ๋ฐ์ฑ : ํธ๋ํฝ์ ์ฌ๋ฌ ์๋ฒ๋ก ๋ถ์ฐํ์ฌ ์๋ฒ์ ๋ถํ๋ฅผ ์ค์ด๊ณ ์์ ์ฑ์ ๋์ด๋๊ธฐ์ .
๋ก๋ ๋ฐธ๋ฐ์ : ๋ก๋ ๋ฐธ๋ฐ์ฑ์ ์ํํ๋ ํ๋์จ์ด ๋๋ ์ํํธ์จ์ด ์ฅ๋น.
โ ๋ก๋ ๋ฐธ๋ฐ์ฑ(Load Balancing) ์ฃผ์ ์ญํ
1๏ธโฃ ์์ฒญ ๋ถ์ฐ
์ฌ์ฉ์ ์์ฒญ์ ์ฌ๋ฌ ์๋ฒ๋ก ๋ถ์ฐ →
โ ๋ถํ ๋ถ์ฐ : ํน์ ์๋ฒ ๊ณผ๋ถํ ๋ฐฉ์ง
โ ํ์ฅ์ฑ : ์ฑ๋ฅ ๋ฐ ์๋ ์ต์ ํ
2๏ธโฃ ํฌ์ค ์ฒดํฌ (Health Check)
๋ก๋ ๋ฐธ๋ฐ์๋ ๋ฐฑ์๋ ์๋ฒ์ ์ํ๋ฅผ ์ฃผ๊ธฐ์ ์ผ๋ก ํ์ธํ๋ ํฌ์ค ์ฒดํฌ๋ฅผ ์ํํจ.
โ ์ ์์ ์ธ ์๋ต์ด ์์ผ๋ฉด ํด๋น ์๋ฒ ์ ์ธ
โ ์ฅ์ ๊ฐ์ง ์ ๋ค๋ฅธ ์๋ฒ๋ก ํธ๋ํฝ ์ ํ
3๏ธโฃ SSL ์ฒ๋ฆฌ
โ HTTPS๋ฅผ ํตํด ์ํธํ๋ ๋ฐ์ดํฐ ์ก์์ ๊ฐ๋ฅ
โ ๋ก๋ ๋ฐธ๋ฐ์๊ฐ ์ํธํ ์ฒ๋ฆฌ → ์น ์๋ฒ ๋ถ๋ด ๊ฐ์
4๏ธโฃ ๋ถ์ ์์ฒญ ๋์
โ ๋ถ์ ์์ฒญ(DoS, DDoS ๊ณต๊ฒฉ ๋ฑ) ์ฐจ๋จ
โ ์น ์๋ฒ๊ฐ ์๋ ๋ก๋ ๋ฐธ๋ฐ์์์ ๋จผ์ ํํฐ๋ง
๐น๋ก๋ ๋ฐธ๋ฐ์ ์ ํ
โ
๋ก๋ ๋ฐธ๋ฐ์๋ 'OSI 7 Layer๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ถํ๋ฅผ ์ด๋ป๊ฒ ๋ถ์ฐํ ์ง'์ ๋ฐ๋ผ ์ข
๋ฅ๊ฐ ๋๋๋ค.
2, 3๊ณ์ธต์ ๊ธฐ์ค์ผ๋ก ๋ถํ๋ฅผ ๋ถ์ฐํ๋ฉด ๊ฐ L2, L3์ธ ๋ฐฉ์์ด๋ค.
์์ ๊ณ์ธต์ ํ์ ๊ณ์ธต์ ๋ฐ์ดํฐ๋ฅผ ๋ชจ๋ ๊ฐ์ง๊ธฐ ๋๋ฌธ์, ์์ ๊ณ์ธต์ผ์๋ก ์ฌ์ธํ ๋ก๋ ๋ฐธ๋ฐ์ฑ์ด ๊ฐ๋ฅํ๊ณ ํ์ ๊ณ์ธต์ผ์๋ก ๊ฐ๋จํ ๋ก๋ ๋ฐธ๋ฐ์ฑ๋ง ๊ฐ๋ฅํ๋ค.
โ ์ฃผ๋ก ์ฌ์ฉ๋๋ ๋ก๋ ๋ฐธ๋ฐ์ : L4 vs L7 ๋ก๋ ๋ฐธ๋ฐ์
๊ธฐ์ค | L4 (Transport Layer) | L7 (Application Layer) |
์๋ | ๋น ๋ฆ | ์๋์ ์ผ๋ก ๋๋ฆผ |
ํธ๋ํฝ ๋ถ์ฐ ๊ธฐ์ค | IP, ํฌํธ, ํ๋กํ ์ฝ | URL, ์ฟ ํค, ํค๋, ์์ฒญ ๋ด์ฉ |
์ธ๋ถ ํธ๋ํฝ ์ ์ด | ๋ถ๊ฐ๋ฅ | ๊ฐ๋ฅ |
์ฃผ์ ํ์ฉ | TCP/UDP ์๋น์ค, ๊ฒ์ ์๋ฒ | API, ๋ง์ดํฌ๋ก์๋น์ค, ์น ์๋น์ค |
ํ์ฌ L7 ๋ก๋ ๋ฐธ๋ฐ์(ALB ๋ฑ)๋ฅผ ์ ํธํ๋ ์ถ์ธ. ์ธ์ ์ ์ง, ์ ๊ตํ ํธ๋ํฝ ์ ์ด๊ฐ ํ์ํ ์๋น์ค์ ์ ํฉ
โ
L4 ๋ก๋ ๋ฐธ๋ฐ์๋ ๋น ๋ฅด๊ณ ๋จ์ํ ๋ถ์ฐ์ ์ํํ๊ณ , L7 ๋ก๋ ๋ฐธ๋ฐ์๋ HTTP ์์ฒญ์ ์ธ๋ฐํ๊ฒ ๋ถ์ํ์ฌ ํธ๋ํฝ์ ์ต์ ํํ๋ค.
โ
ํธ๋ํฝ ํจํด๊ณผ ์๋น์ค ์๊ตฌ์ฌํญ์ ๋ฐ๋ผ L4 ๋๋ L7 ๋ก๋ ๋ฐธ๋ฐ์๋ฅผ ์ ํํ์ฌ ์ฌ์ฉํ๋ฉด ๋๋ค.
L4 ๋ก๋ ๋ฐธ๋ฐ์ฑ ๋ฐฉ๋ฒ
L4 Load Balancer = CLB(Connection Load Balancer), SLB(Session Load Balancer)
๋คํธ์ํฌ ๊ณ์ธต์ด๋ ํธ๋์คํฌํธ ๊ณ์ธต์ ์ ๋ณด๋ฅผ ๋ฐํ์ผ๋ก ๋ก๋๋ฅผ ๋ถ์ฐํ๋ค.
์ฆ, IP์ฃผ์๋ ํฌํธ๋ฒํธ, MAC์ฃผ์, ์ ์ก ํ๋กํ ์ฝ ๋ฑ์ ๋ฐ๋ผ ํธ๋ํฝ์ ๋๋๊ณ ๋ถ์ฐ์ฒ๋ฆฌ ์ํ.
- ๋ผ์ด๋ ๋ก๋น(Round Robin)
- ์๋ฒ์ ์์ฐจ์ ์ผ๋ก ํธ๋ํฝ์ ๋ถ๋ฐฐ
- ๊ท ๋ฑ ๋ฐฐ๋ถ์ด ๊ฐ๋ฅํ์ง๋ง ์๋ฒ ์ฑ๋ฅ์ ๊ณ ๋ คํ์ง ์์
- ๊ฐ์ค์น ๊ธฐ๋ฐ(Weighted Round Robin)
- ์ฑ๋ฅ์ด ๋์ ์๋ฒ์ ๋ ๋ง์ ์์ฒญ์ ๋ฐฐ์
- ์ต์ ์ฐ๊ฒฐ(Least Connection)
- ํ์ฌ ์ฐ๊ฒฐ ์๊ฐ ๊ฐ์ฅ ์ ์ ์๋ฒ๋ก ํธ๋ํฝ์ ์ ๋ฌ
- ์ค์๊ฐ ๋ถํ๋ฅผ ๊ณ ๋ คํ ์ ์์ด ํจ์จ์
- ์๋ต ์๊ฐ ๊ธฐ๋ฐ(Response Time)
- ์๋ต ์๊ฐ์ด ๋น ๋ฅธ ์๋ฒ์ ์ฐ์ ์ ์ผ๋ก ํธ๋ํฝ์ ์ ๋ฌ
- ํด์(Hash) ๊ธฐ๋ฐ
- ํน์ ํด๋ผ์ด์ธํธ(IP ๋ฑ)๋ ํน์ ์๋ฒ์๋ง ์ฐ๊ฒฐ
- ๋์ญํญ(Bandwidth) ๊ธฐ๋ฐ
- ์๋ฒ์ ๋คํธ์ํฌ ๋์ญํญ์ ๊ณ ๋ คํ์ฌ ํธ๋ํฝ ๋ถ์ฐ
L7 ๋ก๋ ๋ฐธ๋ฐ์ฑ ๋ฐฉ๋ฒ
L4 Load Balancer์ ๊ธฐ๋ฅ์ ํฌํจํ๋ฉฐ OSI 7๊ณ์ธต์ ํ๋กํ ์ฝ์ ๋ฐํ์ผ๋ก๋ ๋ถ์ฐ ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋ค.
HTTP ํค๋, ์ฟ ํค ๋ฑ ์ฌ์ฉ์์ ์์ฒญ์ ๋ถ์ํด ์ ๊ตํ ๋ถ์ฐ ๊ฐ๋ฅ
- URL Switching
- ํน์ URL ํจํด์ ๋ฐ๋ผ ๋ค๋ฅธ ์๋ฒ๋ก ์ฐ๊ฒฐ
- ์) /images/* ์์ฒญ์ ์ด๋ฏธ์ง ์๋ฒ๋ก ์ ๋ฌ
- Context Switching
- ์์ฒญ๋ ๋ฆฌ์์ค ์ ํ์ ๋ฐ๋ผ ์๋ฒ๋ฅผ ๋ค๋ฅด๊ฒ ์ฐ๊ฒฐ
- ์) .jpg, .png ์์ฒญ์ ๋ฏธ๋์ด ์๋ฒ๋ก ์ ๋ฌ
- ์ฟ ํค ๊ธฐ๋ฐ ์ง์์ฑ(Persistence with Cookies)
- ํด๋ผ์ด์ธํธ๊ฐ ์ด์ ์ ์ฐ๊ฒฐํ๋ ์๋ฒ๋ก ์ง์์ ์ผ๋ก ์ฐ๊ฒฐ
๋ก๋ ๋ฐธ๋ฐ์ ์ฅ์ & ๋จ์
โ ์ฅ์
โ ์๋ฒ ๋ค์ด ์ ์๋์ผ๋ก ๋ค๋ฅธ ์๋ฒ๋ก ์์ฒญ์ ์ ๋ฌํ์ฌ ์์ ์ฑ ํ๋ณด
โ ํธ๋ํฝ์ ํจ์จ์ ์ผ๋ก ๋ถ์ฐํด ์ฑ๋ฅ ํฅ์
โ ํ์ฅ์ฑ(Scale-out) ์ฉ์ด
โ ๋จ์
โ ์ธ์ ๊ด๋ฆฌ ๋ฌธ์ (Sticky Session ํ์)
- ๋ก๋๋ฐธ๋ฐ์๋ฅผ ์ฌ์ฉํ ๋ ์ด๋ ค์ด ๋ฌธ์ ์ค ํ๋๋ ์ธ์ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ๋ ๊ฒ์ด๋ค.
- ํด๋ผ์ด์ธํธ์ ์ฐ๊ฒฐ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ ์ธ์ ์ด ๋ก๋๋ฐธ๋ฐ์ฑ์ ํตํด ํ๋์ ์๋ฒ ์ฅ๋น์ ์ ์ฅ์ด ๋๋ ๊ฒฝ์ฐ, ์ถํ ๋ค๋ฅธ ์๋ฒ๋ก ์ ์ํ๊ฒ ๋๋ฉด, ํด๋น ํด๋ผ์ด์ธํธ์ ์ธ์ ์ด ์ ์ง๋์ง ์๋๋ค. ์ฆ, ์๋ฒ์ ์ก์ธ์ค ํ ๋๋ง๋ค ๋ค๋ฅธ ์ธ์ ์ ์ฌ์ฉํ๋ค๋ฉด ํน์ ์ฌ์ฉ์์ ์ ๋ณด๋ฅผ ์ผ๊ด์ฑ์๊ฒ ์ ์งํ ์ ์๊ฒ ๋๋ค.
- ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ธ์ ์ ๊ณ ์ (session sticky)ํ๋ค. ํ์ง๋ง ๊ณ ์ ๋ ์ธ์ ์ ๋ ธ๋์ ์ฅ์ ๊ฐ ๋ฐ์ํ๋ฉด ๊ณ ์ ํ ์๋ฏธ๊ฐ ์์ด์ง๋ค.
โ ๋ก๋ ๋ฐธ๋ฐ์ ์์ฒด๊ฐ ๋จ์ผ ์ฅ์ ์ (SPOF, Single Point of Failure)์ด ๋ ์ ์์
โ ๋์ ์ฑ๋ฅ์ ์ํ ๊ฒฝ์ฐ ๋น์ฉ ์ฆ๊ฐ
L4/L7 ๋ก๋ ๋ฐธ๋ฐ์์ ์ฑ๋ฅ ์งํ
- ์ด๋น ์ฐ๊ฒฐ ์ (CPS: Connections per Second)
- ์ด๋น ์ฒ๋ฆฌ ๊ฐ๋ฅํ TCP ์ฐ๊ฒฐ ์
- ๋์ ์ฐ๊ฒฐ ์ (Concurrent Connections)
- ์ ์งํ ์ ์๋ ์ต๋ ๋์ ์ธ์ ์
- ์ฒ๋ฆฌ ์ฉ๋ (Throughput)
- ์ด๋น ์ฒ๋ฆฌ ๊ฐ๋ฅํ ๋ฐ์ดํฐ๋ (bps ๋๋ pps ๋จ์)
๐น AWS ๋ก๋ ๋ฐธ๋ฐ์ ์ข ๋ฅ
AWS์์๋ ELB(Elastic Load Balancing) ์๋น์ค๋ฅผ ํตํด ๋ค์ํ ๋ก๋ ๋ฐธ๋ฐ์๋ฅผ ์ ๊ณต.
๋ก๋ ๋ฐธ๋ฐ์ ํน์ง ์ฌ์ฉ ์ฌ๋ก
๋ก๋ ๋ฐธ๋ฐ์ ์ ํ | ํน์ง | ์ด์ฉ์ฌ๋ก |
ALB (Application Load Balancer) | L7 ๊ธฐ๋ฐ HTTP/HTTPS ํธ๋ํฝ ์ต์ ํ, ๊ณ ๊ธ ๋ผ์ฐํ ๊ธฐ๋ฅ ์ ๊ณต |
์น ์ ํ๋ฆฌ์ผ์ด์ , API ์๋ฒ |
NLB (Network Load Balancer) | L4 ๊ธฐ๋ฐ ์ด๊ณ ์ฑ๋ฅ, ์ ์ง์ฐ, TCP/UDP ์ง์ |
๊ฒ์ ์๋ฒ, ๊ธ์ต ์์คํ |
CLB (Classic Load Balancer) | ์์ ๋ฐฉ์, ํ์ฌ๋ ๊ฑฐ์ ์ฌ์ฉ๋์ง ์์ ๋ณด์ ๋ฐ ๋คํธ์ํฌ ๊ฐ์ ์ดํ๋ผ์ด์ธ์ค์ฉ |
๊ธฐ์กด AWS ์์คํ ๊ณผ ํธํ ํ์ ์ |
aws์ ๋ก๋ ๋ฐธ๋ฐ์ ์ ํ ์ ๋ฆฌ
1. Application Load Balancer (ALB)
• ํน์ง: HTTP ๋ฐ HTTPS ํธ๋ํฝ์ ์ฒ๋ฆฌํ๋ ์ ํ๋ฆฌ์ผ์ด์
์ ์ ํฉ (API ์๋ฒ)
• ์๋ ๋ฐฉ์: ์์ฒญ(Request) ์์ค์์ ์๋
• ์ ์ฉ ๋์:
• ๋ง์ดํฌ๋ก์๋น์ค
• ์ปจํ
์ด๋ ๊ธฐ๋ฐ ์ ํ๋ฆฌ์ผ์ด์
• ๊ณ ๊ธ ๋ผ์ฐํ
๊ธฐ๋ฅ ํ์ ์
• ๋ค์ด์ด๊ทธ๋จ: (Application Load Balancer ๊ตฌ์กฐ ํฌํจ)
• ์์ฑ ๊ฐ๋ฅ
2. Network Load Balancer (NLB)
• ํน์ง: ์ด๊ณ ์ฑ๋ฅ, ์ ์ง์ฐ ๋คํธ์ํฌ ํธ๋ํฝ ์ฒ๋ฆฌ์ ์ ํฉ(WebSocket ์๋ฒ)
• ์๋ ๋ฐฉ์: ์ฐ๊ฒฐ(Connection) ์์ค์์ ์๋
• ์ ์ฉ ๋์:
• ์ด๋น ์๋ฐฑ๋ง ๊ฐ์ ์์ฒญ ์ฒ๋ฆฌ
• ๋๊ท๋ชจ TLS ์คํ๋ก๋ฉ
• ์ค์ ์ง์คํ๋ ์ธ์ฆ์ ๋ฐฐํฌ
• UDP ํธ๋ํฝ ์ง์
• ๊ณ ์ IP ์ฃผ์๊ฐ ํ์ํ ์๋น์ค
• ๋ค์ด์ด๊ทธ๋จ: (Network Load Balancer ๊ตฌ์กฐ ํฌํจ)
• ์์ฑ ๊ฐ๋ฅ
3. Gateway Load Balancer (GLB)
• ํน์ง: ์๋ํํฐ ๊ฐ์ ์ดํ๋ผ์ด์ธ์ค ๊ด๋ฆฌ์ ์ ํฉ
• ์๋ ๋ฐฉ์: GENEVE ํ๋กํ ์ฝ ์ง์
• ์ ์ฉ ๋์:
• ๋ณด์ ๋ฐ ๊ท์ ์ค์ ๊ฐํ๋ฅผ ์ํ ๋คํธ์ํฌ ์ดํ๋ผ์ด์ธ์ค
• ์ ์ฑ
๊ธฐ๋ฐ ํธ๋ํฝ ์ ์ด
• ๋ค์ด์ด๊ทธ๋จ: (Gateway Load Balancer ๊ตฌ์กฐ ํฌํจ)
• ์์ฑ ๊ฐ๋ฅ
๐ฏ ์์ฒญ ๋ผ์ฐํ (Request Routing)
๋ก๋ ๋ฐธ๋ฐ์๋ ์์ฒญ์ ๋ด๋ถ ์๋ฒ๋ก ์ ๋ฌํ ๋ ํฌํธ๋ ํ๋กํ ์ฝ์ ๋ณํํ ์ ์๋ค.
์์:
โ
ํด๋ผ์ด์ธํธ → HTTPS 80 ํฌํธ ์์ฒญ
โ
๋ก๋ ๋ฐธ๋ฐ์ → ๋ด๋ถ ์๋ฒ๋ก HTTP 8080 ๋ณํ
(SSL ์ฒ๋ฆฌ ๋ถ๋ด์ ๋ก๋ ๋ฐธ๋ฐ์์์ ์ฒ๋ฆฌํ๊ธฐ ๋๋ฌธ!)
๐ AWS์์ ALB ์์ฑํ๊ธฐ
1๏ธโฃ ๊ฐ์ฉ ์์ญ ์ค์
โ ์์ฒญ์ ๋ถ์ฐํ ๊ฐ์ฉ ์์ญ ์ ํ
โ Public Subnet์ ์ฐ๊ฒฐ ํ์!
2๏ธโฃ ๋ณด์ ๊ทธ๋ฃน ์ค์
โ HTTP/HTTPS ์์ฒญ์ ๋ฐ์ ๋ณด์ ๊ทธ๋ฃน ์ค์
3๏ธโฃ ๋์ ๊ทธ๋ฃน ์์ฑ
โ ๋ก๋ ๋ฐธ๋ฐ์๋ฅผ ์ฐ๊ฒฐํ ์น ์๋ฒ ๊ทธ๋ฃน ์์ฑ
โ ํฌํธ(์: 8080) ์ค์
โ ํฌ์ค ์ฒดํฌ(Health Check) ๊ฒฝ๋ก ์
๋ ฅ → ์ ๊ธฐ์ ์ธ ์๋ฒ ์ํ ๊ฒ์ฌ
4๏ธโฃ ๋ฆฌ์ค๋ ๋ฐ ๋ผ์ฐํ ์ค์
โ ๋ฆฌ์ค๋ ์์ฑ (์: HTTP 80)
โ ์์ฑํ ๋์ ๊ทธ๋ฃน๊ณผ ์ฐ๊ฒฐ
โ ALB ์์ฑ ํ, DNS ์ฃผ์๋ฅผ ์ฌ์ฉํด ์ ์ ๊ฐ๋ฅ!
๐ ์คํ ์ค์ผ์ผ๋ง ( Auto Scaling)
โ ์คํ ์ค์ผ์ผ๋ง ๊ฐ๋
โ ํธ๋ํฝ์ด ์ฆ๊ฐํ๋ฉด ์๋์ผ๋ก EC2(์๋ฒ) ์ธ์คํด์ค๋ฅผ ํ์ฅํ๊ณ ,
โ ํธ๋ํฝ์ด ๊ฐ์ํ๋ฉด ๋ถํ์ํ ์ธ์คํด์ค๋ฅผ ์ค์ฌ ๋น์ฉ ์ ๊ฐ์ด ๊ฐ๋ฅ.
โ AWS ์คํ ์ค์ผ์ผ๋ง ๊ทธ๋ฃน(ASG) ํ์ฉ ๊ฐ๋ฅ
โ ์คํ ์ค์ผ์ผ๋ง ์ฅ์
โ ํธ๋ํฝ ์ฆ๊ฐ ์ ์๋์ผ๋ก ์๋ฒ ์ถ๊ฐ
โ ์๋ฒ ๊ณผ๋ถํ ๋ฐฉ์ง
โ ํธ๋ํฝ ๊ฐ์ ์ ์๋์ผ๋ก ๋ถํ์ํ ์๋ฒ ์ญ์ (๋น์ฉ ์ ๊ฐ)
โ ๋ก๋ ๋ฐธ๋ฐ์(ALB)์ ํจ๊ป ์ฌ์ฉํ๋ฉด ํธ๋ํฝ์ ์๋์ผ๋ก ๋ถ์ฐ ๊ฐ๋ฅ
๐ฅ ๋ก๋ ๋ฐธ๋ฐ์ฑ vs ์คํ ์ค์ผ์ผ๋ง
๊ธฐ๋ฅ ์ค๋ช
๋ก๋ ๋ฐธ๋ฐ์ฑ | ํธ๋ํฝ์ ์ฌ๋ฌ ์๋ฒ๋ก ๋ถ์ฐ |
์คํ ์ค์ผ์ผ๋ง (Auto Scaling) | ์๋ฒ๋ฅผ ์๋์ผ๋ก ์ถ๊ฐ/์ญ์ ํ์ฌ ํ์ฅ |
โ
ํธ๋ํฝ ์ฆ๊ฐ → ์๋ฒ ์๋ ์ถ๊ฐ
โ
ํธ๋ํฝ ๊ฐ์ → ์๋ฒ ์๋ ์ญ์ (๋น์ฉ ์ ๊ฐ!)
โ
AWS ์คํ ์ค์ผ์ผ๋ง ๊ทธ๋ฃน(ASG) ํ์ฉ ๊ฐ๋ฅ
๐ ๏ธ NestJS์์ ๋ก๋ ๋ฐธ๋ฐ์ฑ ์ ์ฉ ๋ฐฉ๋ฒ
1๏ธโฃ Nginx Reverse Proxy ํ์ฉ
http {
upstream nest_servers {
server 127.0.0.1:3000;
server 127.0.0.1:3001;
server 127.0.0.1:3002;
}
server {
listen 80;
location / {
proxy_pass http://nest_servers;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
}
โ ํด๋ผ์ด์ธํธ ์์ฒญ์ ์๋์ผ๋ก ์ฌ๋ฌ NestJS ์๋ฒ๋ก ๋ถ์ฐ
2๏ธโฃ AWS ALB + ์คํ ์ค์ผ์ผ๋ง ํ์ฉ
โ ํธ๋ํฝ ์ฆ๊ฐ ์ EC2 ์๋ ํ์ฅ
โ ๋ก๋ ๋ฐธ๋ฐ์์ ์ฐ๊ณํ์ฌ ๋ถํ ๋ถ์ฐ
3๏ธโฃ PM2 ํด๋ฌ์คํฐ ๋ชจ๋ ํ์ฉ
npm install pm2 -g
pm2 start dist/main.js -i max
โ ๋จ์ผ ์๋ฒ ๋ด์์๋ ๋ฉํฐ ํ๋ก์ธ์ค๋ก ํธ๋ํฝ ๋ถ์ฐ ๊ฐ๋ฅ
๐ฏ ๊ฒฐ๋ก
โ
์ฌ์ฉ์๊ฐ ๋ง์์ง๋ค๋ฉด? → ๋ก๋ ๋ฐธ๋ฐ์ฑ + ์คํ ์ค์ผ์ผ๋ง ์ ์ฉ ํ์!
โ
ํธ๋ํฝ ์ฆ๊ฐ ์ ์๋ ํ์ฅ? → AWS ์คํ ์ค์ผ์ผ๋ง ๊ทธ๋ฃน(ASG) ํ์ฉ!
โ
์ธ์
์ ์ง ํ์? → Sticky Session or ์ธ์
ํด๋ฌ์คํฐ๋ง ๊ณ ๋ ค!
๐ก AWS ALB + ์คํ ์ค์ผ์ผ๋ง ์ ์ฉ ์ ์๋ ์ด์ ๊ฐ๋ฅ ๐
์ฐธ๊ณ
https://chunsubyeong.tistory.com/106
https://kchanguk.tistory.com/146
https://sjh9708.tistory.com/98
https://dev.classmethod.jp/articles/load-balancing-types-and-algorithm/
https://www.smileshark.kr/post/what-is-a-load-balancer-a-comprehensive-guide-to-aws-load-balancer
๋์ฉ๋ ํธ๋ ํฝ ์ฒ๋ฆฌ๋ฐฉ๋ฒ
https://hs-backend.tistory.com/228
nestjs ์ ์ฉ
https://andongmin.com/docs/nest/ch9/ch9-3
https://guti-coding.tistory.com/197?category=1195671
aws ์ค์
https://aws.amazon.com/ko/elasticloadbalancing/?did=ft_card&trk=ft_card
๋ก๋๋ฒจ๋ฐ์ ์ปจํธ๋กค๋ฌ
https://docs.aws.amazon.com/eks/latest/userguide/aws-load-balancer-controller.html
๊ฐ๋น์ ๋๋ฉ์ธ์ผ๋ก ์ธ์ฆ์ ๋ฐ๊ธ
์ ๋ฆฌ์ค
1๏ธโฃ 2๏ธโฃ 3๏ธโฃ 4๏ธโฃ 5๏ธโฃ 6๏ธโฃ 7๏ธโฃ 8๏ธโฃ 9๏ธโฃ ๐
5. Sticky Session (์ธ์
์ ์ง)
๊ธฐ๋ณธ์ ์ผ๋ก ๋ก๋ ๋ฐธ๋ฐ์๋ ์์ฒญ์ ์ฌ๋ฌ ์๋ฒ์ ๋๋คํ๊ฒ ๋ถ๋ฐฐํ์ง๋ง,๋ก๊ทธ์ธ ์ ์ง์ ๊ฐ์ ์ธ์
์ด ํ์ํ ๊ฒฝ์ฐ ๊ฐ์ ์ฌ์ฉ์์ ์์ฒญ์ ๋์ผํ ์๋ฒ๋ก ๋ณด๋ด์ผ ํจ.
โ
Sticky Session ๋ฐฉ์
1๏ธโฃ ๋ก๋ ๋ฐธ๋ฐ์์์ ์ฒ๋ฆฌ (AWS ALB์์ Sticky Session ์ค์ ๊ฐ๋ฅ)โ๏ธ ์ฟ ํค๋ฅผ ์ด์ฉํ์ฌ ํน์ ์ฌ์ฉ์์ ์์ฒญ์ ๋์ผํ ์๋ฒ๋ก ์ ์ง
2๏ธโฃ ์ธ์
ํด๋ฌ์คํฐ๋งโ๏ธ ์๋ฒ ๊ฐ ์ธ์
์ ๊ณต์ ํ๋ ๋ฐฉ์โ๏ธ ์๋ฒ ์ฅ์ ์์๋ ์ธ์
์ ์ง ๊ฐ๋ฅโ๏ธ ๋จ์ : ์๋ก์ด ์๋ฒ ์ถ๊ฐ ์ ๊ธฐ์กด ์๋ฒ ์ค์ ์
๋ฐ์ดํธ ํ์
Sticky Session ์ ์ฉ ์ถ์ฒ ์ฌ๋ก
๋ก๊ทธ์ธ ์ํ ์ ์ง๊ฐ ํ์ํ ์น ์๋น์ค
ํน์ ์ฌ์ฉ์์ ์ธ์
๋ฐ์ดํฐ๊ฐ ํน์ ์๋ฒ์ ์ข
์๋ ๊ฒฝ์ฐ
6. NestJS์์ ๋ก๋ ๋ฐธ๋ฐ์ฑ & ์คํ ์ค์ผ์ผ๋ง ์ ์ฉ
โ
1) Nginx Reverse Proxy ํ์ฉ
๐ Nginx ์ค์ ์์
// /etc/nginx/nginx.conf
http {
upstream nest_servers {
server 127.0.0.1:3000;
server 127.0.0.1:3001;
server 127.0.0.1:3002;
}
server {
listen 80;
location / {
proxy_pass http://nest_servers;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
}
โ๏ธ ๊ฒฐ๊ณผ: ํด๋ผ์ด์ธํธ ์์ฒญ์ด ์๋์ผ๋ก ์ฌ๋ฌ NestJS ์ธ์คํด์ค๋ก ๋ถ์ฐ๋จ
โ
2) AWS ๋ก๋ ๋ฐธ๋ฐ์ & ์คํ ์ค์ผ์ผ๋ง ํ์ฉ
AWS ALB + ASG (Auto Scaling Group) ์กฐํฉ ์ถ์ฒ
์์ฒญ๋์ ๋ฐ๋ผ EC2 ์ธ์คํด์ค ์๋ ์ฆ๊ฐ
ํธ๋ํฝ ์ฆ๊ฐ ์ ์๋ฒ ์๋ ์ถ๊ฐ → ๊ณผ๋ถํ ๋ฐฉ์ง
ํธ๋ํฝ ๊ฐ์ ์ ๋ถํ์ํ ์๋ฒ ์๋ ์ญ์ → ๋น์ฉ ์ ๊ฐ
โ
3) PM2 ํด๋ฌ์คํฐ ๋ชจ๋ ํ์ฉ (๋จ์ผ ์๋ฒ ๋ด ๋ฉํฐ ํ๋ก์ธ์ค)
๐ NestJS ํด๋ฌ์คํฐ๋ง ์คํ ๋ฐฉ๋ฒ
npm install pm2 -g
pm2 start dist/main.js -i max
โ๏ธ ๋จ์ผ ์๋ฒ์์๋ ์ฌ๋ฌ ๊ฐ์ NestJS ํ๋ก์ธ์ค๋ฅผ ์คํํ์ฌ ํธ๋ํฝ ๋ถ์ฐ ๊ฐ๋ฅ
7. ๊ฒฐ๋ก
โ
์๋ฒ๊ฐ 2๊ฐ ์ด์์ด๋ผ๋ฉด? → ๋ก๋ ๋ฐธ๋ฐ์ฑ + ์คํ ์ค์ผ์ผ๋ง ์ ์ฉ ํ์โ
ํธ๋ํฝ ์ฆ๊ฐ ์ ์๋ ํ์ฅ? → AWS ์คํ ์ค์ผ์ผ๋ง ๊ทธ๋ฃน(ASG) ํ์ฉโ
์ธ์
์ ์ง ํ์? → Sticky Session or ์ธ์
ํด๋ฌ์คํฐ๋ง ๊ณ ๋ ค
โ๏ธ ์ง์
๋๊ณผ ์กฐ์จํ์ฌ CRCD๋ฅผ ํตํด ๋ชจ๋ ์ธ์คํด์ค ์
๋ฐ์ดํธ ํ์โ๏ธ AWS ๋ก๋ ๋ฐธ๋ฐ์(ALB) + ์คํ ์ค์ผ์ผ๋ง ์ ์ฉ ์ ์๋ ์ด์ ๊ฐ๋ฅ ๐
_________________________________________________________________________
ํด๋ฌ์คํฐ๋ง(Clustering)
Clustering์ด๋ ์ฌ๋ฌ ๋์ ์ปดํจํฐ๋ฅผ ๋๊ฐ์ ๊ตฌ์ฑ์ ์๋ฒ๊ตฐ์ ๋ณ๋ ฌ๋ก ์ฐ๊ฒฐํ ์์คํ
์ผ๋ก ๋ง์น ํ๋์ ์ปดํจํฐ์ฒ๋ผ ์ฌ์ฉํ๋ ๊ฒ์ ๋งํ๋ค.
Clustering ํ๊ฒฝ์์๋ ํน์ ์ฅ๋น์ ๋ฌธ์ ๊ฐ ์๊ธฐ๊ฑฐ๋ ์ ํ๋ฆฌ์ผ์ด์
์ ๋ฌธ์ ๊ฐ ์๊ธฐ๋๋ผ๋, ์ ์ฒด์ ์ธ ์๋น์ค์๋ ์ํฅ์ ์ฃผ์ง ์๊ฒ ์ ์ดํ ์ ์๋ค.
Clustering์ Virtual IP(๊ฐ์ IP) ๊ธฐ๋ฐ์ผ๋ก ๊ตฌํ๋๋๋ฐ, ์๋น์ค๋ฅผ ์ ๊ณตํ๋ ์ค์ ์ฅ๋น๋ Physical IP๋ฅผ ๊ฐ์ง๊ณ , ๋ฐ์ดํฐ์ ์ฒ๋ฆฌ๋ Virtual IP๋ฅผ ํตํด ์ฒ๋ฆฌํ๋ค. ์ด๋ ๊ฒ ๋ด๋ถ์ ์์คํ
์ ์ฒ ์ ํ๊ฒ ๊ฐ๋ ค ์ถ์ํํ๋ ๊ฒ์ด ์์น์ด๋ค.
๋ก๋๋ฐธ๋ฐ์์ ์ํด ๊ฐ Clustering๋ ์๋ฒ์ ์ํด ์๋น์ค๊ฐ ์งํ์ด ๋๋ค.
์ ๋ฆฌ
Load Balancing์ L4 or L7์ด ์ฌ๋ฌ๋์ ์๋ฒ์ ํจํท์ ๋ถํ๋ถ์ฐ์์ผ์ฃผ๋ ๊ฒ์ด๊ณ Clustering์ ์ฌ๋ฌ๋์ ์๋ฒ๋ฅผ ํ๋์ ์๋ฒ๋ก ๋ง๋ค์ด ์ฃผ๋ ๊ฒ์ด๋ค.
Load Balancing - ์ฌ๋ฌ๋์ ์๋ฒ์ ํจํท์ ๋ถ์ฐ
Clustering - ์๋น์ค๋ฅผ ์ ๊ณตํ๋ ์ฌ๋ฌ๊ฐ์ ์๋ฒ๋ฅผ ํ๋๋ก ๋ฌถ์ด ์ฑ๋ฅ์ ๋์ฌ ๋ง์์์ ํจํท์ ์ฒ๋ฆฌํ๋ ๊ฒ
๋ก๋ ๋ฐธ๋ฐ์ฑ ๋ฐฉ๋ฒ
๋ก๋ ๋ฐธ๋ฐ์ฑ์ ๋คํธ์ํฌ ํธ๋ํฝ์ ์ฌ๋ฌ ์๋ฒ์ ๋ถ์ฐ์ํค๋ ๊ธฐ์ ๋ก, ํธ๋ํฝ ๋ถํ๋ฅผ ๊ท ๋ฑํ๊ฒ ๋๋์ด ์๋ฒ์ ๊ณผ๋ถํ๋ฅผ ๋ฐฉ์งํ๊ณ , ๊ณ ๊ฐ์ฉ์ฑ์ ์ ๊ณตํฉ๋๋ค. ๋ก๋ ๋ฐธ๋ฐ์ฑ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ๋ผ์ด๋ ๋ก๋น (Round Robin): ์์๋๋ก ๊ฐ ์๋ฒ์ ์์ฒญ์ ๋ฐฐ๋ถํฉ๋๋ค.
๋ผ์ด๋ ๋ก๋น ๋ฐฉ์
๋ผ์ด๋ ๋ก๋น(Round Robin Method)์ ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ๋ฐ์ ์์ฒญ์ ๋ก๋๋ฐธ๋ฐ์ฑ ๋์ ์๋ฒ์ ์์๋๋ก ํ ๋น๋ฐ๋ ๋ฐฉ์์
๋๋ค. ์ฒซ ๋ฒ์งธ ์์ฒญ์ ์ฒซ ๋ฒ์งธ ์๋ฒ, ๋ ๋ฒ์งธ ์์ฒญ์ ๋ ๋ฒ์งธ ์๋ฒ, ์ธ ๋ฒ์งธ ์์ฒญ์ ์ธ ๋ฒ์งธ ์๋ฒ์ ํ ๋นํฉ๋๋ค. ๋ก๋๋ฐธ๋ฌ๋ ๋์ ์๋ฒ์ ์ฑ๋ฅ์ด ๋์ผํ๊ณ ์ฒ๋ฆฌ ์๊ฐ์ด ์งง์ ์ ํ๋ฆฌ์ผ์ด์
์ ๊ฒฝ์ฐ, ๊ท ๋ฑํ๊ฒ ๋ถ์ฐ์ด ์ด๋ฃจ์ด์ง๊ธฐ ๋๋ฌธ์ ์ด ๋ฐฉ์์ ์ฌ์ฉํฉ๋๋ค.
๊ฐ์ค ๋ผ์ด๋ ๋ก๋น ๋ฐฉ์
๊ฐ์ค ๋ผ์ด๋ ๋ก๋น ๋ฐฉ์(Weighted Round Robin Method)์ ์ค์ ์๋ฒ์ ์๋ก ๋ค๋ฅธ ์ฒ๋ฆฌ ์ฉ๋์ ์ง์ ํ ์ ์์ต๋๋ค. ๊ฐ ์๋ฒ์ ๊ฐ์ค์น๋ฅผ ๋ถ์ฌํ ์ ์์ผ๋ฉฐ, ์ฌ๊ธฐ์ ์ง์ ํ ์ ์ซ๊ฐ์ ํตํด ์ฒ๋ฆฌ ์ฉ๋์ ์ ํฉ๋๋ค.
์ต์ ์ฐ๊ฒฐ ๋ฐฉ์
์ต์ ์ฐ๊ฒฐ ๋ฐฉ์์ ์ฐ๊ฒฐ ์๊ฐ ๊ฐ์ฅ ์ ์ ์๋ฒ์ ๋คํธ์ํฌ ์ฐ๊ฒฐ๋ฐฉํฅ์ ์ ํฉ๋๋ค. ๋์ ์ธ ๋ถ์ฐ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ๊ฐ ์๋ฒ์ ๋ํ ํ์ฌ ์ฐ๊ฒฐ ์๋ฅผ ๋์ ์ผ๋ก ์นด์ดํธํ ์ ์๊ณ , ๋์ ์ผ๋ก ๋ณํ๋ ์์ฒญ์ ๋ํ ๋ถํ๋ฅผ ๋ถ์ฐ์ํฌ ์ ์์ต๋๋ค.
- ์ต์ ์ฐ๊ฒฐ (Least Connections): ํ์ฌ ์ฐ๊ฒฐ์ด ๊ฐ์ฅ ์ ์ ์๋ฒ์ ์์ฒญ์ ๋ฐฐ๋ถํฉ๋๋ค.
- IP ํด์ (IP Hash): ์ฌ์ฉ์์ IP ์ฃผ์๋ฅผ ํด์ฑํ์ฌ ํน์ ์๋ฒ์ ์์ฒญ์ ๋ฐฐ๋ถํฉ๋๋ค.
๋ก๋ ๋ฐธ๋ฐ์ฑ ๋ฐฉ๋ฒ
1โฃ DNS Load Balancing
• DNS ์๋ฒ์์ ์ฌ๋ฌ IP๋ฅผ ๋ฐํํ์ฌ ํธ๋ํฝ์ ๋๋๋ ๋ฐฉ์
• ๋จ์ : ํด๋ผ์ด์ธํธ ์บ์ฑ ๋ฌธ์ ๋ก ์ธํด ๋ถํ๊ฐ ์๋ฒฝํ ๋ถ์ฐ๋์ง ์์ ์ ์์
2โฃ Reverse Proxy Load Balancing
• Nginx, HAProxy ๋ฑ์ ์ด์ฉํ์ฌ ํ๋ก์ ์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ ์์ฒญ์ ์ ์ ํ ์๋ฒ๋ก ๋ผ์ฐํ
• ๋ํ์ ์ธ ๋ก๋ ๋ฐธ๋ฐ์ : Nginx, HAProxy, Traefik
3โฃ L4 (Layer 4) Load Balancing
• TCP/UDP ๋ ๋ฒจ์์ ๋ถํ๋ฅผ ๋ถ์ฐ (IP ๋ฐ ํฌํธ ๊ธฐ๋ฐ)
• ๋ํ์ ์ธ ์๋น์ค : AWS ELB (Elastic Load Balancer), F5 Big-IP
4โฃ L7 (Layer 7) Load Balancing
• HTTP(S) ์์ฒญ์ URL, ์ฟ ํค, ํค๋ ๋ฑ์ ๊ธฐ๋ฐ์ผ๋ก ๋ถํ ๋ถ์ฐ
• REST API ์๋ฒ๋ NestJS ๊ฐ์ ์น ์๋ฒ์์๋ L7 ๋ฐฉ์์ด ์ผ๋ฐ์
• ๋ํ์ ์ธ ์๋น์ค : Nginx, HAProxy, AWS ALB (Application Load Balancer)
NestJS์์ ๋ก๋ ๋ฐธ๋ฐ์ฑ ์ ์ฉํ๊ธฐ
NestJS์์ ๋ก๋ ๋ฐธ๋ฐ์ฑ์ ์ ์ฉํ๋ ค๋ฉด ์ฌ๋ฌ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์๋ค.
1โฃ Nginx Reverse Proxy ์ฌ์ฉ
๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ๋ฐฉ๋ฒ์ Nginx๋ฅผ Reverse Proxy๋ก ์ฌ์ฉํ์ฌ ํธ๋ํฝ์ ์ฌ๋ฌ ์ธ์คํด์ค๋ก ๋ถ์ฐํ๋ ๊ฒ์ด๋ค.
๐ ์ค์ ๋ฐฉ๋ฒ
1. NestJS ์๋ฒ๋ฅผ ์ฌ๋ฌ ๊ฐ ์คํ (PORT 3000, PORT 3001, PORT 3002 ๋ฑ)
2. Nginx๋ฅผ ์ค์ ํ์ฌ ์ฌ๋ฌ ์๋ฒ๋ก ํธ๋ํฝ์ ๋ถ๋ฐฐ
๐น Nginx ์ค์ ์์ (/etc/nginx/nginx.conf)
nginx ํ์ผ
http {
upstream nest_servers {
server 127.0.0.1:3000;
server 127.0.0.1:3001;
server 127.0.0.1:3002;
}
server {
listen 80;
location / {
proxy_pass http://nest_servers;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
}
๐ ์ด๋ ๊ฒ ํ๋ฉด, ํด๋ผ์ด์ธํธ์ ์์ฒญ์ด 3000, 3001, 3002 ํฌํธ๋ก ์๋ ๋ถ์ฐ๋จ!
2โฃ ํด๋ผ์ฐ๋ ๋ก๋ ๋ฐธ๋ฐ์ ์ฌ์ฉ (AWS ELB, GCP, Azure)
• AWS ALB (Application Load Balancer)
• AWS NLB (Network Load Balancer)
• GCP Load Balancer
• Azure Load Balancer
๐ NestJS ์๋ฒ๋ฅผ ์ฌ๋ฌ ๋ ๋์ฐ๊ณ , ๋ก๋ ๋ฐธ๋ฐ์๋ฅผ ์์ ๋๋ฉด ์๋์ผ๋ก ํธ๋ํฝ์ ๋ถ๋ฐฐํจ
3โฃ PM2 Cluster ๋ชจ๋ ํ์ฉ (์ฑ๊ธ ๋จธ์ ๋ด ๋ฉํฐ ํ๋ก์ธ์ค)
๋จ์ผ ์๋ฒ์์ ๋ฉํฐ ํ๋ก์ธ์ค๋ก NestJS๋ฅผ ์คํํ์ฌ ๋ถํ ๋ถ์ฐํ๋ ๋ฐฉ๋ฒ์ด๋ค.
๐ PM2๋ฅผ ์ฌ์ฉํ NestJS ํด๋ฌ์คํฐ๋ง
sh ํ์ผ
npm install pm2 -g
pm2 start dist/main.js -i max
• -i max : ๊ฐ๋ฅํ ๋ชจ๋ CPU ์ฝ์ด๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ๋ฌ ๊ฐ์ NestJS ํ๋ก์ธ์ค๋ฅผ ์คํ
• ํ๋์ ์๋ฒ์์ ์ฌ๋ฌ ๊ฐ์ NestJS ์ธ์คํด์ค๋ฅผ ๋์ ํธ๋ํฝ์ ๋๋ ์ ์์
๐ ๊ฒฐ๋ก : NestJS์์ ๋ก๋ ๋ฐธ๋ฐ์ฑ ์ ์ฉ ๋ฐฉ๋ฒ ์ถ์ฒ
1. ํธ๋ํฝ์ด ๋ง๋ค๋ฉด? → Nginx Reverse Proxy + ์ฌ๋ฌ NestJS ์ธ์คํด์ค
2. ํด๋ผ์ฐ๋ ํ๊ฒฝ(AWS, GCP)์์ ์ด์? → ๋ก๋ ๋ฐธ๋ฐ์(AWS ALB, GCP LB) ์ฌ์ฉ
3. ๋จ์ผ ์๋ฒ์์ ์ฑ๋ฅ ์ต์ ํ? → PM2 ํด๋ฌ์คํฐ ๋ชจ๋ ์ฌ์ฉ
__________________________________________________
์ธ์คํด์ค๊ฐ 2๊ฐ ์ด์.
์ง์
๋์ด๋ ์กฐ์จํด์ผํจ(crcd๋งก์ - ๋ค ์
๋ฐ์ดํธ ํด์ค์ผํจ)
๋ก๋ ๋ฒจ๋ฌ์ฑ์ ์คํ ์ค์ผ์ผ๋ง ์ ์ฉํด์ผํจ
์คํ ์ค์ผ์ผ๋ง : ํธ๋ ํฝ์ด ๋ง์ผ๋ฉด Ec2๋ฅผ(์๋ฒ๋ฅผ) ์๋์ผ๋ก ๋๋ ค์ ๋ฆฌํ์คํธ ์๋ ๋ถ๋ฐฐํด์ค(์ธ์คํด์ค๊ฐ ๋์ด๋จ). aws์๋ ์์
ํธ๋ํฝ์ด ์ฆ๊ฐํ๋ฉด EC2(์๋ฒ) ์ธ์คํด์ค๋ฅผ ์๋์ผ๋ก ํ์ฅํ์ฌ ์์ฒญ์ ๋ถ๋ฐฐํ๋ ๊ธฐ๋ฅ์ด๋ค.
ํธ๋ํฝ์ด ์ค์ด๋ค๋ฉด ๋ถํ์ํ ์ธ์คํด์ค๋ฅผ ์ค์ฌ ๋น์ฉ์ ์ ๊ฐํ ์ ์๋ค.
AWS์๋ ์คํ ์ค์ผ์ผ๋ง ๊ธฐ๋ฅ์ด ์์ผ๋ฉฐ, ์ด๋ฅผ ํ์ฉํ๋ฉด ์๋ฒ ์ด์์ ์๋ํํ ์ ์๋ค.
_____________________________________
Sticky Session
https://kchanguk.tistory.com/146
๊ฐ WAS๋ค์ ์ธ์
์ ๊ฐ๊ฐ ๊ฐ์ง๊ณ ์์ง๋ง, ์ด๋ฅผ ํ๋๋ก ๋ฌถ์ด ํ๋์ ํด๋ฌ์คํฐ๋ก ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. ์ด ์ํ์์ ํ๋์ WAS๊ฐ fail์ด ๋ฐ์ํ๋ฉด ํด๋น WAS๊ฐ ๋ค๊ณ ์๋ ์ธ์
์ ๋ค๋ฅธ WAS๋ก ์ด๋๋์ด ๊ด๋ฆฌ๋ฉ๋๋ค. ๋ค๋ง, ๊ฐ ์๋ฒ๋ง๋ค ์ธ์
ํด๋ฌ์คํฐ๋ง ๋ฐฉ์์ด ๋ค๋ฅด๊ณ ์ง์ํ๋ ๋ฐฉ์์ด ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ํ์ฌ ์ฌ์ฉํ๊ณ ์๋ WAS์ session clusturing ๋ถ๋ถ์ ๋ณด๊ณ ํ์ธํด์ผ ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ๋ฐฉ์์ ์๋ก์ด ์๋ฒ๊ฐ ํ๋ ์ถ๊ฐ๋ ๋๋ง๋ค ๊ธฐ์กด์ ์กด์ฌํ๋ WAS์ ์๋ก์ด ์๋ฒ์ IP/PORT๋ฅผ ์
๋ ฅํด์ ํด๋ฌ์คํฐ๋ง ํด์ค์ผ ํ๋ ๋จ์ ์ด ์์ต๋๋ค.
๐ฅ ์ฌ์ฉ์๊ฐ ๋์ด๋๋ฉด?
์๋น์ค๋ฅผ ์ด์ํ ๋ ์๋ฒ๋ ๋ช๋๋ ์์ด์ผํ ๊น์?์ฌ์ฉ์๊ฐ ๋ง์ด ์๋ ๊ฒฝ์ฐ์๋ 1๋์ ์๋ฒ๋ง์ผ๋ก๋ ์์ฒญ์ ์ฒ๋ฆฌํ ์ ์์ง๋ง ์ฌ์ฉ์๊ฐ ๋์ด๋๋ฉด ๋์ด๋ ์๋ก ์์ฒญ์ ๊น๋ํ๊ฒ ์ฒ๋ฆฌํ๊ธฐ ์ด๋ ค์์ง๋ฉฐ ์๋ฒ๊ฐ ํฐ์ง๋ ์ํฉ๊น์ง ๋ฐ์ํ ์ ์์ต๋๋ค..!
์ด๋ด ๋์๋ ์ค์ผ์ผ ์์ํน์ ์ค์ผ์ผ ์
์ ํตํด ์ธํ๋ผ๋ฅผ ํ์ฅํ ํ์๊ฐ ์์ต๋๋ค!
์ค์ผ์ผ์
(scale-up)
์ค์ผ์ผ์
์ ํ์ฌ ์ฌ์ฉ ์ค์ธ ์๋ฒ์ ์ฑ๋ฅ์ ํฅ์์ํค๋ ๊ฒ์
๋๋ค. ์๋ฅผ ๋ค์ด ์๋ฒ์ ๋์คํฌ๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ CPU๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ์๋ฏธํ์ฃ !(์์ง ์ค์ผ์ผ๋ง - vertical scaling ์ด๋ผ๊ณ ๋ ๋ถ๋ฆ
๋๋ค)
์ค์ผ์ผ์์ (scale-out)
์ค์ผ์ผ์์์ ํ์ฌ ์ฌ์ฉ ์ค์ธ ์๋ฒ์ ๊ฐ์๋ฅผ ์ฆ๊ฐ์ํค๋ ๊ฒ์
๋๋ค. ์๋ฒ์ ์ฑ๋ฅ์ ๊ทธ๋๋ก ๊ฐ์ ธ๊ฐ๊ณ ์์ฒญ์ ์ฒ๋ฆฌํ ์ ์๋ ์๋ฒ์ ์๋ฅผ ์ฆ๊ฐ์ํค๋ ๋ฐฉ๋ฒ์
๋๋ค.(์ํ ์ค์ผ์ผ๋ง - horizontal scaling ์ด๋ผ๊ณ ๋ ๋ถ๋ฆ
๋๋ค)
๐ ๋ก๋๋ฐธ๋ฐ์
๋ก๋๋ฐธ๋ฐ์๋?
๋ก๋ ๋ฐธ๋ฐ์๋ ์ค์ผ์ผ์์์ ์ํํ๋ ๋ฐฉ๋ฒ ์ค ํ๋์
๋๋ค.
๋ก๋๋ฐธ๋ฐ์์ ์ฃผ์ ์ญํ
(1) ์์ฒญ ๋ถ์ฐ
์ธํฐ๋ท์ผ๋ก๋ถํฐ ๋ค์ด์จ ์์ฒญ์ ์ฌ๋ฌ ์น ์๋ฒ์ ๊ท ๋ฑํ๊ฒ ๋ถ์ฐ์์ผ ์ค๋๋ค. ์์์ ๋งํ ์ค์ผ์ผ ์์ ๊ธฐ๋ฅ์ด์ฃ !!
(2) SSL ์ฒ๋ฆฌ
๋ก๋ ๋ฐธ๋ฐ์๋ฅผ ์ฌ์ฉํ๋ฉด ์ก์์ ํ๋ ๋ฐ์ดํฐ๋ฅผ ์ํธํํ๋ SSL ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
์ธํฐ๋ท์ผ๋ก๋ถํฐ์ ์ ๊ทผ ์ค ์์ ํ๊ฒ ์ ๋ณด๋ฅผ ๋ณด๋ด๊ธฐ ์ํด HTTPS๋ผ๋ ํ๋กํ ์ฝ๋ก ํต์ ์ ํ ๋๊ฐ ์๋๋ฐ ์ด ํต์ ์์ SSL์ ์ฌ์ฉํ๊ฒ ๋ฉ๋๋ค. https ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ธ๋ผ์ฐ์ ์ ์๋น์ค ์ฌ์ด๋ฅผ ํ๋ฅด๋ ๋ฐ์ดํฐ๋ ์ํธํ๋๋ฉฐ ์ด๋ ์ํธ ๊ด๋ จ ์ฒ๋ฆฌ๋ฅผ ๋น ๋ฅด๊ฒ ์ํํ๋ ์ ์ฉ ์์คํ
์ ๋ก๋๋ฐธ๋ฐ์๊ฐ ์ ๊ณตํด์ฃผ์ด ์น ์๋ฒ์์ ์ํธ๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฒ๋ณด๋ค ๋น ๋ฅธ ์๋๋ก ์ฒ๋ฆฌํ ์ ์์ด์!
(3) ๋ถ์ ์์ฒญ ๋์
๋ก๋ ๋ฐธ๋ฐ์ ์์ด ์น ์๋ฒ๊ฐ ์ง์ ๋ธ๋ผ์ฐ์ ์ ๋ฐ์ดํฐ๋ฅผ ๊ตํํ๋ ์ํ๋ผ๋ฉด? ์์์น ๋ชปํ ์๋์ ์ผ์ผํค๋ ๋ถ์ ํ ์์ฒญ์ ๋ํ ์ฒ๋ฆฌ๋ ์น ์๋ฒ์ ๊ณผ๋ถํ๋ฅผ ์ผ์ผํฌ ์ ์์ผ๋ฉฐ ๊ทธ๋ก ์ธํด ์น ์๋ฒ ์์ฒด๊ฐ ๋ค์ด๋ ๊ฐ๋ฅ์ฑ์ด ์์ต๋๋ค.
๋ก๋ ๋ฐธ๋ฐ์๋ ์ด๋ฌํ ๋ถ์ ์ ๊ทผ์ ๋์ํ๋ ์ ์ฉ ์์คํ
์ ์ ๊ณตํ์ฌ ๋ ํจ์จ์ ์ผ๋ก ๋ถ์ ํ ์ ๊ทผ์ ๋์ํ ์ ์์ต๋๋ค.
AWS์์ ์ ๊ณตํ๋ ๋ก๋ ๋ฐธ๋ฐ์ ์ข
๋ฅ
AWS์์๋ ELB(Elastic Load Balancing)์ด๋ผ๋ ์๋น์ค๋ก ๋ก๋ ๋ฐธ๋ฐ์๋ฅผ ์ ๊ณตํฉ๋๋ค.
(1) Application Load Balancer (ALB)
ALB๋ HTTP๋ HTTPS ๋ฅผ ์ด์ฉํ ์ ๊ทผ์ ๋ถ์ฐํ๋๋ฐ ์ต์ ํ๋ ๋ก๋ ๋ฐธ๋ฐ์ ์
๋๋ค. SSL ์ฒ๋ฆฌ๋ฅผ ์ํํ๊ฑฐ๋ URL ํจํด๊ณผ ๊ฐ์ ๋ณต์กํ ์กฐ๊ฑด์์ ๋ถ์ฐ ๋์์๋ฅผ ๋ฐ๊พธ๋ ๋ฑ ๊ณ ๋์ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
(2) Network Load Balancer
๊ธฐ๋ณธ์ ์ธ ๋ถ์ฐ์ฒ๋ฆฌ ๊ธฐ๋ฅ๋ง์ ์ ๊ณตํ์ง๋ง ๋ค์ํ ํต์ ํ๋กํ ์ฝ์ ๋์ํ๋ ๋ก๋ ๋ฐธ๋ฐ์์
๋๋ค.
(3) Classic Load Balancer
์์ ๋๊ฐ์ ๋ก๋ ๋ฐธ๋ฐ์๊ฐ ๋ฑ์ฅํ๊ธฐ ์ ์ ์ฐ์ด๋ ๋ก๋ ๋ฐธ๋ฐ์์ด๋ฉฐ ๊ธฐ์กด AWS ์์คํ
์ ์ฌ์ฉํด์ผ ํ๋ ํน๋ณํ ๊ฒฝ์ฐ๋ฅผ ์ ์ธํ๊ณ ๋ ๊ฑฐ์ ์ฌ์ฉ๋์ง ์์ต๋๋ค.
์์ฒญ ๋ผ์ฐํ
๋ก๋ ๋ฐธ๋ฐ์๋ฅผ ์ฌ์ฉํ ๋์๋ ์ธ๋ถ์ ๊ณต๊ฐํ ํ๋กํ ์ฝ๊ณผ ํฌํธ ๋ฒํธ์ ์กฐํฉ์ ๋ด๋ถ์ ์น ์๋ฒ๊ฐ ๋ฐ๋ ํ๋กํ ์ฝ๊ณผ ํฌํธ ๋ฒํธ๋ก ๋ณํํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋๋ฐ, ์ด๋ฅผ ์์ฒญ ๋ผ์ฐํ
(request routing) ์ด๋ผ๊ณ ํฉ๋๋ค.
์๋ฅผ ๋ค์ด HTTPS 80 ํฌํธ๋ก ์ธ๋ถ ์์ฒญ์ ๋ฐ๊ณ ๋ด๋ถ ์น ์๋ฒ์ ์ ๋ฌํ ๋์๋ HTTP 8080 ์ผ๋ก ๋ณํํ์ฌ ์ ๋ฌํ ์ ์๋๋ก ์ค์ ํด์ฃผ๋ ๊ฒ์ด์ฃ !(HTTPS๋ฅผ HTTP๋ก ๋ณํํ๋ ์ด์ ๋ HTTPS๋ฅผ ์ด์ฉํ ์ํธ ๋ฐ ๋ณตํธ ์ฒ๋ฆฌ๋ ์น ์๋ฒ๊ฐ ์๋๋ผ ๋ก๋ ๋ฐธ๋ฐ์๊ฐ ์ํํ๊ธฐ ๋๋ฌธ์
๋๋ค.)
๐ AWS์์ ALB ์์ฑํ๊ธฐ
๊ฐ์ฉ ์์ญ ์ค์
์์ฒญ์ ๋ถ์ฐํ ๊ฐ์ฉ ์์ญ์ ์ ํํ๊ณ ๊ฐ์ฉ ์์ญ์ ์์ฑํ Public Subnet์ ์ ํํด ์ค๋๋ค! (๋ฐ๋์ public subnet์ ์ฐ๊ฒฐํด์ฃผ์ด์ผ ํฉ๋๋ค!!!)
๋ณด์ ๊ทธ๋ฃน ์ค์
๋ณด์ ๊ทธ๋ฃน์ vpc์ default ๋ณด์ ๊ทธ๋ฃน๊ณผ http/https ์ ๊ทผ์ ๋ฐ์ ์ ์๋ ๋ณด์ ๊ทธ๋ฃน์ ์ค์ ํด ์ค๋๋ค.
๋์ ๊ทธ๋ฃน ์์ฑ
๋ก๋ ๋ฐธ๋ฐ์๋ฅผ ์ ์ฉํ ๋์ ๊ทธ๋ฃน์ ๋ง๋ค์ด๋ด
์๋ค!์ฌ๊ธฐ์ ํฌํธ๋ฅผ ์ค์ ํด์ค๋๋ค. ์ด๋ฏธ์ง์ ๊ฐ์ด ์ค์ ํด์ค๋ค๋ฉด ๋ก๋๋ฐธ๋ฐ์๋ฅผ ํตํด ๋ค์ด์จ ์์ฒญ์ ์น ์๋ฒ์ 8080 ํฌํธ๋ก ๋ค์ด๊ฐ๊ฒ ๋ฉ๋๋ค.
์ํ ๊ฒ์ฌ๋ฅผ ํ ๊ฒฝ๋ก๋ฅผ ์์ฑํด ์ค๋๋ค. ๋ก๋ ๋ฐธ๋ฐ์๋ ํด๋น URL๋ก ์์ฒญ์ ๋ณด๋ด ์น ์๋ฒ์ ์ํ๋ฅผ ์ฃผ๊ธฐ์ ์ผ๋ก ๊ฒ์ฌํฉ๋๋ค.
์ค์ ๋ก ํธ๋ํฝ์ ๋ถ์ฐํ ์ธ์คํด์ค๋ค์ ์ ํํ์ฌ ๋ก๋ ๋ฐธ๋ฐ์์ ๋์์ผ๋ก ๋ฑ๋กํด์ค๋๋ค!
๋ฆฌ์ค๋ ๋ฐ ๋ผ์ฐํ
์์ ์์ฑํ ๋์ ๊ทธ๋ฃน์ '๋ฆฌ์ค๋ ๋ฐ ๋ผ์ฐํ
' ๋ฉ๋ด์์ ์ค์ ํด ์ค๋๋ค. ์ด๋ ๊ฒ ์ค์ ํด์ฃผ๋ฉด HTTP 80 ํฌํธ๋ก ๋ค์ด์จ ์์ฒญ์ ์ค์ ํ ๋์ ๊ทธ๋ฃน์ผ๋ก ๋ถ์ฐ๋๊ฒ ๋ฉ๋๋ค!
์ด๋ ๊ฒ ํ๋ฉด ALB๋ฅผ ์์ฑํ ์ ์์ผ๋ฉฐ ์์ฑํ ๋ก๋ ๋ฐธ๋ฐ์์ DNS ์ด๋ฆ์ผ๋ก ์ ๊ทผ์ด ๊ฐ๋ฅํฉ๋๋ค!
์ฐธ๊ณ https://aws.amazon.com/ko/what-is/load-balancing/ https://tecoble.techcourse.co.kr/post/2021-10-12-scale-up-scale-out/
'TIP' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๊นํ ๊ธฐ๋ณธ ๋ธ๋ฆฟ์ง ๋ฐ๊พธ๊ธฐ (0) | 2025.02.12 |
---|---|
ํฐ๋ฏธ๋๋ก gitHub ์ปค๋ฐํ๊ธฐ (0) | 2025.02.12 |
mysql ๋น๋ฒ ๋ฐ๊พธ๊ธฐ(cmd์ฐฝ) (0) | 2025.01.23 |
๋ก์ผ์ผ ์ฝ๋ (Locale code) - ํน์ ์ธ์ด ๋ฐ ์ง์ญ์ ๋ํ๋ด๋ ํ์ค (0) | 2025.01.11 |
๋ธ๋ผ์ฐ์ (ํฌ๋กฌ)์์ ํ ํฐ ํ์ธํ๊ธฐ (0) | 2024.12.29 |