Cloud Design 4th - 100-hours-a-week/KTB4-1st-wiki GitHub Wiki
4๋จ๊ณ์์๋ ๋ฐ๊พธ๊น v1 ์ถ์ ํ ์งง์ ๊ธฐ๊ฐ์ ๋ง์ ์ฌ์ฉ์๋ค์ด ๋ชฐ๋ฆฐ ์ํฉ์ ๊ฐ์ ํ๋ค.
- ์ฌ์ฉ์ ๊ธ์ฆ
- ํ์ ์๋ ํฌ๊ฒ ์ฆ๊ฐํ์ง ์์
| ํญ๋ชฉ | v1 ์ํฉ | ์ฑ์ฅ ์ํฉ |
|---|---|---|
| ํ๊ฒ ์ ์ | ์นดํ ๋ถ ๊ต์ก์ (20๋ ์ค๋ฐ-30๋ ์ด๋ฐ) | ๋ํ๊ต ๊ธฐ์์ฌ์, 20-30๋ 1์ธ ๊ฐ๊ตฌ |
| SOM(๋ชฉํ ์์ฅ) | 120๋ช | 220๋ง ๋ช |
| MAU | 30๋ช | 20๋ง ๋ช |
| DAU | 30๋ช | 4๋ง ๋ช |
| Peak ๋์ ์ฌ์ฉ์ | - | 2,000 |
| ์ฒด๋ฅ ์๊ฐ | - | 300์ด |
| ์ธ์ ํ๊ท ์์ฒญ์ | - | 11.95 |
| Peak RPS | ํ๊ท RPS 0.076 | 80 |
| ํธ๋ํฝ ์ง์ค ์๊ฐ | ํ์ผ ์ฌ๋ ์๊ฐ(9:00โ18:00 ์ค ๋งค์ 50๋ถโ์ ๊ฐ) + ์ ์ฌ์๊ฐ(12:00โ13:00) | 20-23์ |
| ํธ๋ํฝ/์์ ์ฌ์ฉ๋ ํฐ ๊ธฐ๋ฅ | ์ด๋ฏธ์ง ์ ๋ก๋, ๋ฌผํ ๋ฑ๋ก ๊ฒ์ฆ ์ AI API ํธ์ถ | v1 ๋์ผ + ์ค๋งํธ ๊ฒ์ ๋ฌผํ ๋ฑ๋ก ๊ฒ์ฆ ์ AI API ํธ์ถ |
2์ฐจ ๋ฐฐํฌ RPS ๊ณ์ฐ (ํด๋ฆญํด์ ํผ์น๊ธฐ)
์์ ๊ฐ
- MAU/DAU ๋น์จ 20%
- Peak ๋์ ์ฌ์ฉ์ = DAU์ 5%
- ์ฒด๋ฅ ์๊ฐ: 300์ด
peak RPS ๊ณ์ฐ
- user flow์ ์์ฒญ ์ ๊ณ์ฐ
- ์ธ์ ๋ณ user flow ํ๋ฅ ์ ์ค์ ํด ์ธ์ ๋ณ ์์ฒญ ์ ๊ณ์ฐ
- ์ธ์ ๋ณ ์์ฒญ ์ ๊ณ์ฐ์ ์ฒด๋ฅ ์๊ฐ์ผ๋ก ๋๋ ์ธ์ ์ ์ด๋น ์์ฒญ ์ ๊ณ์ฐ
- ์ธ์ RPS๋ฅผ Peak ๋์ ์ฌ์ฉ์์ ๊ณฑํด Peak ์๊ฐ์ RPS๋ฅผ ๊ตฌํจ
์ธ์
์์๋ฅ = Peak ๋์ ์ฌ์ฉ์(์ธ์
) ์ 2,000 / ์ฒด๋ฅ ์๊ฐ 300์ด = ์ฝ 6.7 ์ธ์
/์ด
6.7 ์ธ์
/์ด x 11.95 ์์ฒญ/์ธ์
= ์ฝ 80
2์ฐจ ๋ฐฐํฌ ํต์ฌ User Flow
| ๋ฒํธ | User Flow | ์์ฒญ | ์์ฒญ ์ | flow ๋น์ค | ๊ฐ์ค ์์ฒญ ์ |
|---|---|---|---|---|---|
| 1 | ์นด์นด์ค ๋ก๊ทธ์ธ โ ํ์์ ๋ฌผ๊ฑด ๋ชฉ๋ก ํ์ โ ๋ฌผ๊ฑด ์์ธ | ๋ก๊ทธ์ธ 2, ํ ๋ชฉ๋ก 2, ์์ธ 3 | 7 | 100% | 7 |
| 2 | ๋ฌผ๊ฑด ๋ฑ๋ก(์ฌ์ง ์ ๋ก๋) | ์ด๋ฏธ์ง ์ ๋ก๋ 3, ๋ฑ๋ก ์ ์ฅ 1, ๋ฑ๋ก์๋ฃ ์์ธ์กฐํ 1 | 5 | 30% | 1.5 |
| 3 | ๋ฌผ๊ฑด ์์ธ โ ๊ตํ ์์ฒญ โ ์ฑํ ๋ฐฉ ์์ฑ โ ๊ตํ ์๋ฝ/๊ฑฐ์ | ๋ด ๋ฌผ๊ฑด ์ ํ ์กฐํ 1, ๊ตํ์์ฒญ ์์ฑ 1, ์ฑํ ๋ฐฉ ์์ฑ 1, ์ฑํ ํ์คํ ๋ฆฌ ์กฐํ 1, ๋ฉ์์ง ์ก์์ (์๊ฐ/์ฅ์ ์กฐ์จ ์๋ณต) 7, ๊ตํ ์๋ฃ/๊ฑฐ์ 1 | 12 | 15% | 1.8 |
| 4 | ๊ฒ์ โ ๋ฌผ๊ฑด ์์ธ โ ๊ด์ฌ ๋ฌผํ ๋ฑ๋ก | ๊ฒ์ API 1, ์์ธ์กฐํ 2, ๊ด์ฌ๋ฑ๋ก 1 | 4 | 30% | 1.2 |
| 5 | ์ค๋งํธ ๊ฒ์ โ ๋ฌผ๊ฑด ์์ธ โ ๊ด์ฌ ๋ฌผํ ๋ฑ๋ก | ์ค๋งํธ๊ฒ์(LLM ํธ์ถยท๋ค์ค๋ฌผ๊ฑด+ํ ์คํธ) 1, ์์ธ์กฐํ 3, ๊ด์ฌ๋ฑ๋ก 1 | 5 | 5% | 0.25 |
| 6 | ๊ด์ฌ ๋ชฉ๋ก โ ๊ด์ฌ ๋ฌผํ ์์ธ | ๊ด์ฌ ๋ชฉ๋ก ๋ถ๋ฌ์ค๊ธฐ 1 | 1 | 20% | 0.2 |
| ํฉ๊ณ | 11.95 |
2์ฐจ ๋ฐฐํฌ ํ๊ฒ ์์ฅ (ํด๋ฆญํด์ ํผ์น๊ธฐ)
์จ๋ผ์ธ ๋๋๊ตฌ๋งค ํ ์์ก ์ํํ ์ฒ์น์ ๊ณค๋์ ๊ฒช์ ์ ์๋ 1์ธ ์ํ ์ธ๊ตฌ
- ๋ํ์ 301๋ง ๋ช + 20-30๋ 1์ธ๊ฐ๊ตฌ ์ฝ 289๋ง ๊ฐ๊ตฌ(์ ์ฒด 1์ธ๊ฐ๊ตฌ 805๋ง ์ค 20-30๋ 35.6%)
- ๋จ์ ํฉ์ฐ ์ ์ฝ 590๋ง ๋ช ๊ท๋ชจ์ง๋ง, ์์ทจํ๋ ๋ํ์์ 1์ธ๊ฐ๊ตฌ ํต๊ณ์๋ ์ผ๋ถ ์ค๋ณต ์ง๊ณ๋๋ฏ๋ก ์ค๋ณต๋ถ 20% ์ํ(๊ฐ์ ) ์ ์ธํ๋ฉด ์ฝ 500๋ง ๋ช
- ์ด ์ธ๊ตฌ ์ ์ฒด๊ฐ "ํผ์ ์ด๋ฉด์ ์ํํ ์ฌ๊ณ ๋ฅผ ์ค์ค๋ก ๊ด๋ฆฌํด์ผ ํ๋" ๊ณตํต์ ์ธ ์ํฉ์ ๊ฐ์ง
๋ฌผ๋ฆฌ์ ๊ฒฝ๊ณ๊ฐ ๋๋ ทํ ๋ฐ์ง ์ปค๋ฎค๋ํฐ์ ์ค์ ๋ก ๊ฑฐ์ฃผ/์์๋ ์ฌ๋
- ๋ํ๊ต ๊ธฐ์์ฌ์ 66๋ง๋ช (4๋ ์ฌ ๋ํ๊ต ๊ธฐ์์ฌ ์์ฉ๋ฅ 22%)
- ์ํํธ, ์คํผ์คํ ์ ์์ทจํ๋ 20-30๋: 20๋ 1์ธ ๊ฐ๊ตฌ(์ฝ 150๋ง ๊ฐ๊ตฌ, ์ ์ฒด 824๋ง ร 17.8%) ์ค 50% 75๋ง๋ช (20% ์ํํธ + 30% ๋ค๊ฐ๊ตฌ๋จ๋ ) + 30๋ 1์ธ ๊ฐ๊ตฌ(143๋ง ๊ฐ๊ตฌ, 824๋ง ร 17.4%) ์ค 55.3%(์ํํธ 36.1% + ๋ค๊ฐ๊ตฌ๋จ๋ 19.2%) 79๋ง๋ช = 154๋ง๋ช
- ํฉ๊ณ 220๋ง๋ช
์ฐ๋ฆฌ ์๋น์ค๋ ์ ํจ ์์ฅ์ ๋ชจ๋ ์ฌ๋๋ค์ ๋ชฉํ ์์ฅ์ผ๋ก ๋๋ค.
์์ฒญ ์ฑ๊ฒฉ๋ณ(R/W) ๋ถ๋ฅ (ํด๋ฆญํด์ ํผ์น๊ธฐ)
Peak RPS 80์ ํ๋์ ๋ฉ์ด๋ฆฌ๊ฐ ์๋๋ค. ์ด๋ค ์์ฒญ์ด ์ผ๋ง๋ ๋ฐ์ํ๋์ง์ ๋ฐ๋ผ ๋ถํ๊ฐ ๊ฑธ๋ฆฌ๋ ์ปดํฌ๋ํธ๊ฐ ๋ฌ๋ผ์ง๋ฏ๋ก, ์ User Flow๋ฅผ ์์ฒญ ์ฑ๊ฒฉ๋ณ๋ก ๋ถํดํ๋ค.
- ์ธ์
๋น ์์ฒญ ์ =
flow๋ณ ์์ฒญ ์ x flow ๋น์ค์ ํฉ์ฐํ ๊ฐ - Peak RPS = ์ธ์
๋น ์์ฒญ ์ x ์ธ์
์์๋ฅ 6.7 ์ธ์
/์ด
- ๋์์ 2,000๊ฐ์ ์ธ์ ์ด ์๊ณ , ๊ฐ ์ธ์ ์ ์ฒด๋ฅ ์๊ฐ์ด 300์ด๋ฏ๋ก ์ด๋น 2,000/300๊ฐ์ ์ธ์ ์ด ์๊ธฐ๊ณ ์ฌ๋ผ์ง
- ์๋ ํ๋ Nginx๋ฅผ ๊ฑฐ์ณ ๋ฐฑ์๋(Spring Boot)๋ก ๋ค์ด์ค๋ ์์ฒญ๋ง ์ง๊ณํ๋ค. ์ด๋ฏธ์ง ํ์ผ ์์ฒด๋ presigned URL๋ก S3์ ์ง์ ์ ๋ก๋๋์ด Nginx/๋ฐฑ์๋๋ฅผ ๊ฑฐ์น์ง ์์ผ๋ฏ๋ก ์ง๊ณ์์ ์ ์ธ๋๋ค.
-
APP ์ดํ๋ ๋ฐฑ์๋๊ฐ ์ฒ๋ฆฌํ ๋ค์ ์ด์ด์ง๋ ๊ฒฝ๋ก๋ฅผ ๋ปํ๋ค.
| ์ฑ๊ฒฉ | ์์ฒญ | ์ธ์ ๋น ์์ฒญ ์ | Peak RPS | APP(Spring) ์ฒ๋ฆฌ | APP ์ดํ |
|---|---|---|---|---|---|
| ์ฝ๊ธฐ | ๋ฌผ๊ฑด ์์ธ ์กฐํ | 4.05 | 27.1 | ์กฐํ API | DB ์ฝ๊ธฐ |
| ์ฝ๊ธฐ | ํ ๋ชฉ๋ก ์กฐํ | 2.00 | 13.4 | ์กฐํ API | DB ์ฝ๊ธฐ |
| ์ฝ๊ธฐ | ๊ฒ์ | 0.30 | 2.0 | ์กฐํ API | DB ์ฝ๊ธฐ |
| ์ฝ๊ธฐ | ๊ด์ฌ ๋ชฉ๋ก ์กฐํ | 0.20 | 1.3 | ์กฐํ API | DB ์ฝ๊ธฐ |
| ์ฝ๊ธฐ | ์ฑํ ํ์คํ ๋ฆฌ ์กฐํ | 0.15 | 1.0 | ์กฐํ API | DB ์ฝ๊ธฐ |
| ์ฝ๊ธฐ | ๋ด ๋ฌผ๊ฑด ์ ํ ์กฐํ | 0.15 | 1.0 | ์กฐํ API | DB ์ฝ๊ธฐ |
| ์ฝ๊ธฐ | ์ค๋งํธ ๊ฒ์ | 0.05 | 0.3 | ๊ฐ๊ฒฉ ํํฐ๋งยท์ทจํฅ ์กฐํ ํ AI ์๋ฒ ํธ์ถ | DB ์ฝ๊ธฐ + AI ์๋ฒ |
| ์ฝ๊ธฐ ์๊ณ | 6.90 | 46.2 (57.7%) | |||
| ์ฐ๊ธฐ | ์ด๋ฏธ์ง ์ ๋ก๋ | 0.90 | 6.0 | presigned URL ๋ฐ๊ธ(์ฅ๋น 1ํ) | FE โ S3 ์ง์ ์ ๋ก๋ โ AI ์๋ฒ๊ฐ presigned URL๋ก ์ด๋ฏธ์ง ์กฐํยท๊ฒ์ฆ |
| ์ฐ๊ธฐ | ๊ด์ฌ ๋ฑ๋ก | 0.35 | 2.3 | ๋ฑ๋ก API | DB ์ฐ๊ธฐ |
| ์ฐ๊ธฐ | ๋ฌผ๊ฑด ๋ฑ๋ก ์ ์ฅ | 0.30 | 2.0 | ๋ฑ๋ก ๊ฒ์ฆ ๋๊ธฐ | AI ์๋ฒ ์์ฐจ 3ํ โ DB ์ฐ๊ธฐ |
| ์ฐ๊ธฐ | ๊ตํ ์์ฒญ ์์ฑ | 0.15 | 1.0 | ๋ฑ๋ก API | DB ์ฐ๊ธฐ |
| ์ฐ๊ธฐ | ์ฑํ ๋ฐฉ ์์ฑ | 0.15 | 1.0 | ๋ฑ๋ก API | DB ์ฐ๊ธฐ |
| ์ฐ๊ธฐ | ๊ตํ ์๋ฃ/๊ฑฐ์ | 0.15 | 1.0 | ์ํ ๋ณ๊ฒฝ API | DB ์ฐ๊ธฐ |
| ์ฐ๊ธฐ ์๊ณ | 2.00 | 13.4 (16.7%) | |||
| ์ธ์ฆ | ์นด์นด์ค ๋ก๊ทธ์ธ(๋ฆฌ๋ค์ด๋ ํธ + ์ฝ๋ฐฑ) | 2.00 | 13.4 | ์ฝ๋ฐฑ ์ฒ๋ฆฌ, ์ฌ์ฉ์ ์กฐํ, ์ธ์ ๋ฐ๊ธ | ์ธ๋ถ ์นด์นด์ค OAuth + ์ธ์ ์ ์ฅ์ |
| ์ค์๊ฐ | ์ฑํ ๋ฉ์์ง ์ก์์ | 1.05 | 7.0 | WebSocket ์ฐ๊ฒฐ ์ ์ง, ๋ฉ์์ง ์ค๊ณ | DB ์ฐ๊ธฐ |
| ํฉ๊ณ | 11.95 | 80.1 |
v1์ ์ ์ ๋น์ฉ๊ณผ ๋น ๋ฅธ ๋ฐฐํฌ ๋ ๊ฐ์ง๋ฅผ ๊ธฐ์ค์ผ๋ก ์ค๊ณํ๊ณ , ๊ทธ ๊ฒฐ๊ณผ EC2 t4g.small(2 vCPU / 2 GiB) ๋จ์ผ ์ธ์คํด์ค ํ ๋์ ์๋น์ค์ ๋ชจ๋ ๊ตฌ์ฑ ์์๋ฅผ ์ปจํ
์ด๋๋ก ๋ฐฐํฌํ๋ค. ์ปจํ
์ด๋ ๊ด๋ฆฌ ๋๊ตฌ๋ Docker Compose๋ค.
flowchart TB
U["์ฌ์ฉ์"]
subgraph AWS["AWS ์์ธ ๋ฆฌ์ ยท ๋จ์ผ AZ"]
subgraph EC2["EC2 t4g.small ยท 2 vCPU / 2 GiB ยท ๋จ์ผ ์ธ์คํด์ค"]
NG["Nginx<br/>SSL ์ข
๋ฃ ยท ๋ฆฌ๋ฒ์ค ํ๋ก์"]
FE["Next.js<br/>ํ๋ก ํธ์๋ ์๋ฒ"]
BE["Spring Boot<br/>๋ฐฑ์๋ API"]
AI["FastAPI<br/>AI ์๋ฒ<br/>+ ChromaDB(์ธ๋ฉ๋ชจ๋ฆฌ)"]
DB[("MySQL")]
end
EBS[("EBS<br/>DB ๋ฐ์ดํฐ ๋ณผ๋ฅจ")]
S3[("S3<br/>์
๋ก๋ ์ด๋ฏธ์ง")]
end
LLM["Claude API"]
MODAL["Modal ์๋ฒ๋ฆฌ์ค"]
U -->|HTTPS 443| NG
NG -->|/| FE
NG -->|/api<br/>WebSocket ์ฐ๊ฒฐ| BE
FE -->|SSR ๋ ๋๋ง์ฉ API ํธ์ถ| BE
BE -->|presigned URL ๋ฐ๊ธ| FE
FE -->|์ด๋ฏธ์ง ์
๋ก๋<br/>presigned URL| S3
BE -->|์ด๋ฏธ์ง URLยทํ
์คํธยท์์ธยท๊ฒ์| AI
AI -->|์ด๋ฏธ์ง ์กฐํ<br/>presigned URL| S3
BE --> DB
AI --> LLM
AI --> MODAL
DB --- EBS
| ๊ตฌ์ฑ ์์ | ๋ฐฐํฌ ํํ | ํ ๋น ๋ฉ๋ชจ๋ฆฌ | ์ํ(State) ๋ณด์ |
|---|---|---|---|
| Nginx | ์ปจํ ์ด๋ | 50 MB | ์์ |
| Next.js | ์ปจํ ์ด๋ | 256 MB | ์์ |
| Spring Boot | ์ปจํ ์ด๋ | 1 GB | WebSocket ์ฐ๊ฒฐ |
| FastAPI(AI ์๋ฒ) | ์ปจํ ์ด๋ | 256 MB | ์ ์ฑ ๋ฌธ์ ๋ฒกํฐ ์ธ๋ฑ์ค(ChromaDB, ์ธ๋ฉ๋ชจ๋ฆฌ) |
| MySQL | ์ปจํ ์ด๋ + EBS ๋ณผ๋ฅจ ๋ง์ดํธ | 384 MB | ์๋น์ค ๋ฐ์ดํฐ ์ ์ฒด |
v1 ๊ตฌ์กฐ ์ ์ ์ ์ด์
| ํญ๋ชฉ | v1์ ์ ์ | v1์์ ๊ทธ๋ ๊ฒ ์ ํ ์ด์ |
|---|---|---|
| ํธ๋ํฝ | ์ง์ค ์๊ฐ๋ ํ๊ท 0.076 RPS | DAU 30๋ช , ์ฌ์ฉ ์๊ฐ๋๊ฐ ๊ณ ์ ๋จ |
| ์ฅ์ ํ์ฉ ์์ค | ์๋น์ค๊ฐ ์ ์ ์ค๋จ๋์ด๋ ๊ด์ฐฎ๋ค | ๋ถํธ์บ ํ ๋ด๋ถ์์๋ง ์ฐ๋ ํ์์ ์๋น์ค |
| ํ์ฅ ๋ฐฉ์ | ์ธ์คํด์ค ์ฒด๊ธ์ ์ฌ๋ฆฌ๋ Scale-Up๋ง ๊ฐ๋ฅ | DB๊ฐ ์ธ์คํด์ค ๋ด๋ถ์ ์์ด ์๋ฒ ๊ฐ ๋ฐ์ดํฐ ๊ณต์ ๋ถ๊ฐ |
| ์ง์ ์ | Nginx ์ปจํ ์ด๋๊ฐ SSL ์ข ๋ฃ์ ๋ผ์ฐํ ์ ๋ชจ๋ ๋ด๋น | ALB ๋น์ฉ(์ $16~22)์ ์ฐ์ง ์๊ธฐ ์ํด |
| ๋ฐฐํฌ | ์ปจํ ์ด๋ ์ฌ์์ ๋ฐฉ์, ๋ฐฐํฌ ์ค ๋ค์ดํ์ ๋ฐ์ | ์ธ์คํด์ค๊ฐ ํ ๋๋ฟ์ด๋ผ ์ ํํ ๋์์ด ์์ |
v1์ ์ด ์ ์ ๋ค์ ๋น์ ์ํฉ์์๋ ๋ง๋ ์ ํ์ด์๋ค. 2์ฅ์์๋ 1.1์์ ๊ฐ์ ํ v2 ํธ๋ํฝ์ด ์ด ๊ตฌ์กฐ์ ๊ทธ๋๋ก ๋ค์ด์์ ๋ ์ด๋ค ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋์ง๋ฅผ ํ์ธํ๋ค.
์์ ๊ฐ์ ํ ํธ๋ํฝ(Peak RPS 80, ๋์ ์ฌ์ฉ์ 2,000)์ด v1 ๊ตฌ์กฐ์ ๊ทธ๋๋ก ๋ค์ด์ค๋ฉด, ์๋ ๋ฌธ์ ๋ค์ด ๋ฐ์ํ๋ค.
- ์ธ์คํด์ค ํ ๋์ ์ฑ๋ฅ์ด ๊ณง ์ฒ๋ฆฌ๋ ์ํ
- ์๋น์ค Scale-Out ๋ถ๊ฐ๋ฅ
- ๋ก๊ทธ์ธ ์ธ์ ์ด ์ธ์คํด์ค ๋ด๋ถ์์ ๊ด๋ฆฌ๋๋ฉฐ ๋ฉ์์ง ๋ธ๋ก์ปค๊ฐ ๋์ผ ์ธ์คํด์ค ๋ด๋ถ์์๋ง ๋์๋๋ฏ๋ก, ๋ ๋ฒ์งธ ์๋ฒ๋ฅผ ๋์๋ ๊ฐ์ ์ํ๋ฅผ ๋ณด์ง ๋ชปํจ
- ๋จ์ผ ์ฅ์ ์ (SPOF)
- ๋ชจ๋ ๊ตฌ์ฑ์์๊ฐ ํ ์ธ์คํด์ค์ ํฌํจ๋์ด ์์ด ์ธ์คํด์ค ์ ์ง, ์ปค๋ ํจ๋, OOM ๋ฐ์ ์ ์๋น์ค ์ ์ฒด ์ค๋จ
- Tomcat Thread Pool ๋ฐ Connection ๊ณ ๊ฐ
- ๊ธฐ๋ณธ ์๋ฒ ๋๋ Tomcat Thread๋ 200๊ฐ
- FastAPI๋ฅผ ๊ฑฐ์ณ LLM์ ๋๊ธฐ ํธ์ถํ๊ณ ์์ด ์๋ต ๋๊ธฐ ์๊ฐ ๋์ Thread ๋ฏธ๋ฐํ
- Peak ์ Thread ๊ณ ๊ฐ๋ก ์ธํด ์ ์ฒด API ์ค๋จ
- ๋จ์ผ ํธ์คํธ I/O ๋ฐ ๋ฉ๋ชจ๋ฆฌ ๋ณ๋ชฉ
- ๊ธฐ์กด MySQL ์ค์ (buffer-pool-size=128M, max-connections=30)์ Peak ์ Connection ์๋ฌ ๋ฐ์
- MySQL, MongoDB, OS ๋ก๊ทธ๊ฐ ํ๋์ EBS ๋์คํฌ I/O๋ฅผ ๊ณต์ ํ์ฌ I/O ๋ณ๋ชฉ์ผ๋ก ์ธํด ์ ์ฒด ์์คํ ์ค๋จ
- ๋ฐฐํฌ ์ ์ค๋จ ๋ฐ์
- DAU 4๋ง ๋ช ์ ์๋น์ค๋ ์์ ํธ๋ํฝ์ด ๋ฐ์ํ๋๋ฐ, ์ฃผ 1ํ ์ ๊ธฐ ๋ฐฐํฌ ์ ์ต๋ 5๋ถ์ In-Place ๋ค์ดํ์์ผ๋ก ์ฌ์ฉ์ ์ดํ ๋ฐ์
v2์์๋ v1๊ณผ ๋ฌ๋ฆฌ, MAU๊ฐ 20๋ง๋ช , peak RPS๊ฐ 80์ผ๋ก ์ฌ์ฉ์์ธต๊ณผ ํธ๋ํฝ์ด ๋งค์ฐ ์ฑ์ฅํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ฌ์ฉ์์ธต์ด ํ์ฅ๋๋ฉด์, ์ฐ๋ฆฌ ์ฌ์ฉ์๋ค์ ๋์ด์ ์๋น์ค ์ค๋จ์ ์ฉ๋ฉํ์ง ์๋๋ค. ๋ฐ๋ผ์ v1์ "์ ์ ๋น์ฉ"๊ณผ "๋น ๋ฅธ ๋ฐฐํฌ" ๋ผ๋ ๊ธฐ์ค์ ๋์ผํ๊ฒ ์ ์ฉํ๊ธฐ ์ด๋ ต๋ค. ๊ทธ๋ฌ๋ฏ๋ก v2์ ๊ธฐ์ค์ ์๋ก ์ ๋ฆฌํ๋ค.
| ์์ | ๊ธฐ์ค | ์ค๋ช | ํํ์ |
|---|---|---|---|
| 1 | ์ต์ ๋น์ฉ | ๊ฐ์์ค๋ฌ์ด ์๋น์ค ์ฑ์ฅ ์ํฉ์ผ๋ก ์ธํด, ํ์ฌ๋ ์์ง ์ธํ๋ผ์ ํฌ์ํ ๋น์ฉ์ด ํฌ์ง ์๋ค๊ณ ๊ฐ์ ํ์ฌ, ์ ์ ๋น์ฉ์ ๋ค์ด๋ ๊ฒ์ ๊ฐ์ฅ ์ฐ์ ํ๋ค | - |
| 2 | ๊ฐ์ฉ์ฑ | ํ๋์ ์ฅ์ ๊ฐ ์๋น์ค ์ค๋จ์ผ๋ก ์ด์ด์ง์ง ์์์ผ ํ๋ค | ์ธ์คํด์ค ํ ๋์ ์ฅ์ ๊ฐ ์๋น์ค ์ค๋จ์ผ๋ก ์ด์ด์ง์ง ์๋๋ค |
| 3 | ํ์ฅ์ฑ | ์ฌ์ฉ์๊ฐ ๋์ด๋ฌ์ ๋ ํฐ ๊ตฌ์กฐ์ ๋ณํ ์์ด ์ฒ๋ฆฌ๋์ ๋๋ฆด ์ ์์ด์ผ ํ๋ค | ์ฒ๋ฆฌ๋ ์ฆ์ค์ด ์ธ์คํด์ค๋ ์ปจํ ์ด๋๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ผ๋ก ๊ฐ๋ฅํ๋ค |
| 4 | ๋ฐ์ดํฐ ๋ณด์กด | ์ฅ์ ๊ฐ ๋๋ ๊ฑฐ๋ ๊ธฐ๋ก์ด ์ฌ๋ผ์ง์ง ์์์ผ ํ๋ค | ์ฅ์ ์์ ์ง์ ๊น์ง ๋ณต๊ตฌํ ์ ์๋ค |
| 5 | ์ด์ ๋ณต์ก๋ | ๊ฐ์์ค๋ฌ์ด ์๋น์ค ์ฑ์ฅ์์, ํ์ด ์์ง ์ปค์ง์ง ์์์ผ๋ฏ๋ก ์ธํ๋ผ ๋ด๋น 2์ธ์ด ์ด์ํ ์ ์์ด์ผ ํ๋ค | - |
| 6 | ๋ณด์์ฑ | ์ธํ๋ผ์ ์๋น์ค์ ๋ํ ์ต์ํ์ ๋ณด์์ฑ์ ํ๋ณดํด์ผ ํ๋ค | - |
| 7 | ์ต์ ๋ฒ๋น๋ฆฌํฐ | ์ฅ์ ์ ๋ํด ํ์ธํ๊ณ ์กฐ์นํ๊ธฐ ์ํด ์ต์ํ์ ๊ด์ธก์ฑ์ ํ๋ณดํด์ผ ํ๋ค | - |
- ๊ฐ์ฉ์ฑ์ ๋ชจ๋ ๊ธฐ๋ฅ์ ๊ฐ์ ์์ค์ผ๋ก ์ ์ฉํ์ง ์๋๋ค. ๊ธฐ๋ฅ๋ง๋ค ์ฌ์ฉ์๊ฐ ๋๋ผ๋ ์คํจ์ ๋ฌด๊ฒ๊ฐ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ด๋ค.
- ๋ฐ์ดํฐ ๋ณด์กด์ ๊ฐ์ฉ์ฑ๊ณผ ๋ถ๋ฆฌํ ์ด์ : ์๋น์ค๊ฐ ์ ์ ๋ฉ์ถ๋ ๊ฒ๊ณผ ๊ฑฐ๋ ๊ธฐ๋ก์ด ์ฌ๋ผ์ง๋ ๊ฒ์ ๋ค๋ฅธ ๋ฌธ์ ์ด๋ค.
- ํํ์ ์ ๋ฏธ๋ฌํ๋ ์ ํ์ง๋ ๋ค๋ฅธ ๊ธฐ์ค์ ์๋ฌด๋ฆฌ ์ ๋ง์กฑํด๋ ์ ํํ์ง ์๋๋ค.
- ํํ์ ์ด ์๋ ๊ธฐ์ค์ ๋น๊ต ๊ธฐ์ค์ด๋ค. ํํ์ ์ ํต๊ณผํ ์ ํ์ง๊ฐ ์ฌ๋ฟ ๋จ์์ ๋ ์์๋๋ก ์ ์ฉํด ๊ณ ๋ฅธ๋ค. ์๋ฅผ ๋ค์ด, ๊ฐ์ ๊ธฐ์ค์ ๋ง์กฑํ๋ค๋ฉด ๋น์ฉ์ด ์ ์ ์ชฝ์ ์ ํํ๋ค.
- ํ๋์ ๊ธฐ์ค๋ง์ผ๋ก ์ ํ์ง ์๋๋ค. ์ฌ๋ฌ ๊ธฐ์ค์ ๋์์ ๊ณ ๋ คํ๋ค.
v1 ์ธํ๋ผ๋ ํธ๋ํฝ์ด ๊ธ์ฆํ ์ํฉ์ ๋ฐ์๋ค์ผ ์ ์์ผ๋ฏ๋ก, ์ด ํธ๋ํฝ์ ๊ฐ๋นํ ์ ์๋๋ก ์ธํ๋ผ ๊ตฌ์ฑ์ ๋ณ๊ฒฝํด์ผ ํ๋ค. ๊ทธ ๋ฐฉ๋ฒ์ผ๋ก๋ ์ธ์คํด์ค ์ฑ๋ฅ์ ๋์ด๋ Scale-up๊ณผ ์ธ์คํด์ค ๊ฐ์๋ฅผ ๋๋ฆฌ๋ Scale-out ์ ๋ต์ด ์๋ค.
MySQL, MongoDB
- ์ธ๋ฑ์ฑ๊ณผ ํ๋(์ฟผ๋ฆฌ, ์์) ์์ ์ ํตํด 2,000 QPS๋ ์ถฉ๋ถํ ์ฒ๋ฆฌํ ์ ์๋ค.
- ๋ถ์ฐ DB, ์ค๋ฉ์ ์ด์ ๋ณต์ก๋(๋ถ์ฐ ํธ๋์ญ์ , ๋ฐ์ดํฐ ์ ํฉ์ฑ)๊ฐ ๋์์ง๋ ๋ฐ ๋นํด Peak RPS๊ฐ 80์ธ ์ํฉ์๋ ํ์์ ์ด์ง ์๋ค.
- ์๋ฒ 1๋์ ์์กดํ๋ฉด ์ฅ์ ๋ฐ์ ์ ์ ์ฒด ์๋น์ค๊ฐ ์ค๋จ๋๊ธฐ ๋๋ฌธ์ Read Replica๋ฅผ 1๋ ์ถ๊ฐ๋ก ๋ถ๋ฆฌํ๋ค.
=> ์ฌ์ฉ์ ์๊ฐ ๊ธ๊ฒฉํ ์ฆ๊ฐํ๊ณ ์๊ธฐ ๋๋ฌธ์ ์์คํ ์ค๋จ์ผ๋ก ์ธํ UX ์ ํ๋ ์น๋ช ์ ์ด๊ธฐ์ ๋ณต์ ๋ณธ 1๋ ์ ๋์ ์ถ๊ฐ ๋น์ฉ์ ๊ฐ์ํ๋ค.
Important
WAS์ ๋ฐฑ์๋ ์๋ฒ๋ Scale-out ์ ๋ต์ผ๋ก App ์๋น์ค๋ฅผ ํ์ฅํ๋ค.
๋ฐฑ์๋ ์๋ฒ
- Scale-up ์ ๋ต์ v1์ ๋จ์ผ ์ธ์คํด์ค ๊ตฌ์ฑ์ผ๋ก ์ธํด, v2 ํ์ฅ ๊ธฐ์ค ์ค์์ ๊ฐ์ฉ์ฑ ํํ์ (ํ๋์ ์ฅ์ ๊ฐ ์๋น์ค ์ค๋จ์ผ๋ก ์ด์ด์ง์ง ์์์ผ ํ๋ค)์ ๋๋ฌํ์ง ๋ชปํ๋ค.
WAS(Stateless)
- ์ฅ์ ๋ฐ์ ๊ฐ๋ฅ์ฑ์ด ๋๊ณ , ๋ถ์ฐ์ผ๋ก ์ธํ ์ด์ ๋ณต์ก๋๊ฐ ํฌ๊ฒ ์ฆ๊ฐํ์ง ์์ ์ฌ๋ฌ ์ธ์คํด์ค์ ๋ณต์ ๋ณธ์ ๋ฐฐ์นํ๋ค.
- [๋ฐ๊พธ๊น]์ ํต์ฌ ์ ์ ํ๋ก์ฐ์ธ ๋ฌผ๋ฌผ๊ตํ์ ์ํด์๋ ์ฑํ ์ ๊ฑฐ์ณ์ผ๋ง ํ๊ธฐ ๋๋ฌธ์ ์ฑํ (์น์์ผ) ์์ฒญ๋์ ๋น์ค์ด ๋งค์ฐ ํฌ๋ค. ๋ฐ๋ผ์ API ์๋ฒ์ ์น์์ผ ์๋ฒ๋ฅผ ๋ถ๋ฆฌํ๋ค.
Important
์ฐ๋ฆฌ ์๋น์ค๋ ๊ตญ๋ด์๋ง ๋ฐฐํฌํ๋ฉฐ, AZ์ฅ์ ๊ฐ ์๋น์ค ์ค๋จ์ผ๋ก ์ด์ด์ง์ง ์๋๋ก ๋์ผ ๋ฆฌ์ ์์ 2๊ฐ ์ด์์ AZ์ ์ธ์คํด์ค๋ฅผ ํ์ฅํ๋ค.
Scale out ์ ๋ต์ผ๋ก ์๋น์ค๋ฅผ ํ์ฅํ ๋, ๋์ผ AZ ํน์ ๋ค๋ฅธ AZ์ ์ธ์คํด์ค๋ฅผ ๋๋ฆฌ๋ ๊ฒฝ์ฐ์ ๊ฐ์ฉ์ฑ ๋ฒ์์ ํ๊ณ๋ฅผ ์ ๋ฆฌํ๋ฉด ์๋์ ๊ฐ๋ค.
| ๋จ์ | ํ์ฅ ๋ฐฉ์ | ๋ง๋ ์ฅ์ | ํ๊ณ | ๋น์ฉ |
|---|---|---|---|---|
| ๋์ผ AZ, ์ธ์คํด์ค ๋จ์ | EC2 ์ธ์คํด์ค๋ฅผ ์ฌ๋ฌ ๋ | ๊ฐ๋ณ ์ธ์คํด์ค ์ฅ์ | ์ธ์คํด์ค๊ฐ ์ํ AZ ๋จ์ ์ฅ์ | ์ธ์คํด์ค ์์ ๋น๋ก |
| ๋์ผ ๋ฆฌ์ , AZ ๋จ์ | 2๊ฐ ์ด์ AZ์ ์ธ์คํด์ค ๋ถ์ฐ | AZ ๋จ์ ์ฅ์ | AZ๊ฐ ์ํ ๋ฆฌ์ ๋จ์ ์ฅ์ | ์ธ์คํด์ค ๋น์ฉ + AZ ๊ฐ ๋ฐ์ดํฐ ์ ์ก ๋น์ฉ(๋ฐฉํฅ๋น $0.01/GB) |
์ฐ๋ฆฌ์ ์๋น์ค๋ "์ธ์คํด์ค ํ ๋์ ์ฅ์ ๊ฐ ์๋น์ค ์ค๋จ์ผ๋ก ์ด์ด์ง์ง ์๋๋ค"๋ผ๋ ๊ฐ์ฉ์ฑ ํํ์ ์ ์งํค๊ธฐ ์ํด์, ์ต์ ๋์ผ AZ์์ Scale-out์ด ํ์ํ๋ค.
๋์ผ AZ์์ ๋ ๋์๊ฐ, AZ ๋ถ์ฐ์ ์ ํํ๋ ์ด์ ๋ ๋ ๊ฐ์ง๋ค.
- ์ฒซ์งธ, EC2 ์ธ์คํด์ค ์๊ธ์ ์ด๋ AZ์ ๋๋ ๋์ผํ๋ฏ๋ก ๊ฐ์ฉ์ฑ์ ํ ๋จ๊ณ ์ฌ๋ฆฌ๋ ๋ฐ ์ธ์คํด์ค ๋น์ฉ์ด ์ถ๊ฐ๋์ง ์๋๋ค.
- ๋์งธ, AWS๋ ๋จ์ผ AZ ๊ตฌ์ฑ์ 99.5%๋ง ๋ณด์ฅํ๊ณ , 2๊ฐ ์ด์ AZ์ ๋ฐฐํฌ๋ ๊ฒฝ์ฐ์๋ง 99.99% SLA๋ฅผ ์ ์ฉํ๋ค. ์ฆ ์ต์ ๋น์ฉ ๊ธฐ์ค์ ํด์น์ง ์์ผ๋ฉด์ ์ฐ๊ฐ ์ต๋ ๋ค์ดํ์ ๋ณด์ฅ์ 43.8์๊ฐ์์ 52.6๋ถ์ผ๋ก ์ค์ผ ์ ์๋ค.
์ฐ๋ฆฌ ์๋น์ค๋ ๊ตญ๋ด์์๋ง ๋ฐฐํฌํ๋ฏ๋ก, ๋ฆฌ์ ์ AWS ์์ธ ๋ฆฌ์ ๋ง์ ์ ํํ๋ค. AWS SLA์ ๋ฐ๋ฅด๋ฉด, ๋ฉํฐ AZ์ ์ ํ์ ๋ณด์ฅ ์์ค์ด 99.99%์ด๋ฏ๋ก, ๋จ์ผ ๋ฆฌ์ AZ ๋จ์ ํ์ฅ๋ ์ถฉ๋ถํ ๊ฐ์ฉ์ฑ์ ๋ณด์ฅํ๋ค๊ณ ํ๋จํ๋ค.
AWS Compute SLA (ํด๋ฆญํด์ ํผ์น๊ธฐ)
AWS Compute SLA์ ๋ฐ๋ฅด๋ฉด ๋จ์ผ EC2 ์ธ์คํด์ค์ ๋ฉํฐ AZ EC2 ์ธ์คํด์ค์ ์ฑ๋ฅ ๊ธฐ์ค์ ๋ค์๊ณผ ๊ฐ๋ค.
| ๊ตฌ์ฑ | AWS SLA ๊ธฐ์ค | ์ ์ฉ ์กฐ๊ฑด |
|---|---|---|
| ๋จ์ผ EC2 ์ธ์คํด์ค (Instance-Level SLA) | 99.5% | ์ธ์คํด์ค 1๋, ์ธ๋ถ ์ฐ๊ฒฐ ๋ถ๊ฐ ์ํ๋ฅผ ์ฅ์ ๋ก ์ ์ |
| ๋ฉํฐ AZ EC2 (Region-Level SLA) | 99.99% | 2๊ฐ ์ด์ AZ์ ๋์ ๋ฐฐํฌ๋ ๊ฒฝ์ฐ |
์ด ๊ฐ์ผ๋ก ์ ๋ค์ดํ์์ ๊ณ์ฐํ๋ฉด ์๋์ ๊ฐ๋ค.
| ๊ตฌ์ฑ | ๊ณ์ฐ (30์ผ ๊ธฐ์ค) | ์ ๋ค์ดํ์ | ์ฐ ๋ค์ดํ์ |
|---|---|---|---|
| ๋จ์ผ ์ธ์คํด์ค (99.5%) | 43,200๋ถ ร 0.5% | 216๋ถ(3.6์๊ฐ) | 43.8์๊ฐ |
| ๋ฉํฐ AZ (99.99%) | 43,200๋ถ ร 0.01% | 4.32๋ถ | 52.6๋ถ |
์์ง ํ์ฅ์ผ๋ก ๋ ์ข์ ์ฌ์์ ์ธ์คํด์ค๋ก ์ฌ๋ ค๋ ์ ๊ธฐ์ค์ ๋์ผํ๋ค.
- Public Subnet: ์ธํ๋ผ ๊ด๋ฆฌ์๊ฐ 2๋ช
์ธ ์ํ์์ ๊ธํ๊ฒ ์ค๊ณ๋ฅผ ํ์ฅํ๋ ์ํฉ์์ ๋ณต์กํ ํต์ ๊ตฌ์กฐ๋ ํ๊ณ๊ฐ ์๊ณ , ๋ฏผ๊ฐ ์ ๋ณด๋ฅผ ํฌํจํ๋ ์๋น์ค๊ฐ ์๋๋ค.
- ALB
- Frontend EC2(์ธ๋ฐ์ด๋ ALB ๋ณด์๊ทธ๋ฃน๋ง ํ์ฉ / ์์๋ฐ์ด๋ Backend ๋ณด์๊ทธ๋ฃน๋ง ํ์ฉ)
- Backend EC2(์ธ๋ฐ์ด๋ ALB, Frontend ๋ณด์๊ทธ๋ฃน๋ง ํ์ฉ / ์์๋ฐ์ด๋ DB, AI ๋ณด์๊ทธ๋ฃน ๋ฐ OAuth์ฉ 443 ํฌํธ๋ง ํ์ฉ)
- AI EC2(์ธ๋ฐ์ด๋ Backend ๋ณด์๊ทธ๋ฃน๋ง ํ์ฉ / ์์๋ฐ์ด๋ ์ธ๋ถ LLM API ํธ์ถ์ฉ 443ํฌํธ ์ ์ฒด ํ์ฉ)
- DB(์ธ๋ฐ์ด๋ Backend ๋ณด์๊ทธ๋ฃน๋ง ํ์ฉ / ์์๋ฐ์ด๋ ์ ์ฒด ์ฐจ๋จ)
- ์ธ๋ถ ์ ์ ๋ฅผ ์ ์ ํ๊ฒ ๋์๊ธฐ ๋๋ฌธ์ ์๋น์ค ์ฑ์ฅ์ ์ํด ๊ฒ์ ์์ง ๋ ธ์ถ์ ๋ชฉ์ ์ผ๋ก SSR๋ก ์ ํํ๋ค.
- ์ปจํ ์ด๋ ๊ธฐ๋ฐ Next.js Standalone ๊ตฌ๋์ ํตํด ๊ฒฝ๋ ์ด๋ฏธ์ง๋ก ์ธ์คํด์ค ํด๋ฌ์คํฐ์์ ์ง์ ์๋นํ๋ค.
- CPU ๋ญ๋น๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด CloudFront๋ฅผ ์ ๋ฉด์ ๋ฐฐ์นํ์ฌ ๊ณตํต ์ ์ ํ์ด์ง ๋ฐ ์์ ์ ์ฃ์ง์ ํฌํจํ๊ณ , ๋์ ๋ ๋๋ง ์์ฒญ๋ง SSR ์ปจํ ์ด๋๋ก ์ ๋ฌํ๋ค.
Vercel์ด๋?
์ ์ ํ์ผ์ ์บ์ฑํ์ฌ ๋ฐํํ๊ฑฐ๋ ๋์ ํ์ผ์ ์์ฑํ์ฌ ๋ฐํํ๋ ๋ฑ ํ๋ก ํธ์๋ ์๋น์ ์ต์ํ์ ์ค์ ์ผ๋ก ์๋ํ
* Functions
- ์์ ๊ฐ๋๋์ง ์๊ณ ์์ฒญ์ด ๋ค์ด์ฌ ๋๋ง๋ค ํธ๋ฆฌ๊ฑฐ๋๋ ์๋ฒ๋ฆฌ์ค ํจ์
- ์ฝ๋๋ฅผ ๋ฐฐํฌํ๋ฉด ์์ฒญ ๋จ์๋ก ์ธ์คํด์ค๊ฐ ๋ด๋ค๊ฐ ์ฒ๋ฆฌ๊ฐ ๋๋๋ฉด ์ ํด ์ํ๋ก ์ ํ(์ผ์ ์๊ฐ ์์ฒญ์ด ์์ผ๋ฉด ์์ ๋ฐํ)
- App Router์ Dynamic Server Components๋ฅผ ๋ฐฐํฌํ๋ฉด ๋ด๋ถ์ ์ผ๋ก SSR ๋ก์ง์ด ํ๋์ Function์ผ๋ก ํจํค์ง๋์ด ์คํ
* ์ฝ๋ ์คํํธ ์ง์ฐ์ด ๋ฐ์ํ ์ ์์ผ๋ฉฐ, ํธ๋ํฝ ์ฆ๊ฐ ์ ๋ค๋ฅธ ์๋น์ค์ ๋นํด ๋น์ฉ์ด ๊ฐํ๋ฅด๊ฒ ์์นํ๋ ๋จ์ ์ด ์๋ค.
=> ์ฌ์ฉํ์ง ์๋๋ค.
Lambda๋?
- ์์ ๊ฐ๋๋์ง ์๊ณ ์์ฒญ์ด ๋ค์ด์ฌ ๋๋ง๋ค ์๋๋ฐ์ค ์ปจํ ์ด๋๊ฐ ์ฆ์ ํ๋ก๋น์ ๋๋์ด ์ฝ๋ ์คํ ํ ์ ํด ์ํ๋ก ์ ํ(์ผ์ ์๊ฐ ์์ฒญ์ด ์์ผ๋ฉด ์์ ๋ฐํ)
- ์ค์ ์ฝ๋๊ฐ ์คํ๋ ์คํ ์๊ฐ(ms ๋จ์)๊ณผ ํ ๋น ๋ฉ๋ชจ๋ฆฌ ์ฉ๋์ ๋ํด ๋น์ฉ ๋ถ๊ณผ
- Lambda๋ฅผ VPC์ ๋ฐฐ์นํ๋ฉด ์ง์ ํ๋ผ์ด๋น ํต์ ๊ฐ๋ฅ
- SSR: Next.js์ ๋์ ๋ ๋๋ง ์์ฒญ์ด ๋ค์ด์ฌ ๋๋ง๋ค Lambda ํธ๋ค๋ฌ๊ฐ ํธ๋ฆฌ๊ฑฐ๋์ด HTML ์์ฑํด ๋ฐํ
* ๋จ์
- ์ฝ๋ ์คํํธ ์ง์ฐ
- Next.js์ ํธํ์ ์ํด OpenNext ๋ฑ ๋ณ๋ ๋๊ตฌ ๋๋ AWS Lambda Web Adapter ํ์ฉ์ผ๋ก ์ธํด ๋๋ฒ๊น ๋ณต์ก๋ ์์น ๋ฐ ์ด๊ธฐ ๊ตฌ๋ ์๊ฐ ์ฆ๊ฐ
- Vercel์ ๋นํด ๋น์ฉ์ด ํจ์จ์ ์ด์ง๋ง, OpenNext ๋ณํ ๋ ์ด์ด ๊ด๋ฆฌ ๋ถ๋ด์ด ์๊ธด๋ค.
- Next.js ๋ฒ์ ์ ์ฌ๋ฆฌ๊ฑฐ๋ ๋น๋ ์ค์ ์ ๋ฐ๊ฟ ๋ ๋ฐ์ํ๋ ๋ฐํ์ ์๋ฌ(์ฒญํฌ ๋๋ฝ, ๋ฏธ๋ค์จ์ด ์๋ฌ ๋ฑ)๋ฅผ ์ธํ๋ผ ์์ง๋์ด๊ฐ ๋ฆฌ๋ฒ์ค ์์ง๋์ด๋ง์ผ๋ก ๋๋ฒ๊น ํด์ผ ํ๋ค.
- ์๊ฐ์ ์ผ๋ก ํธ๋ํฝ์ด ์์นํ์ฌ ์ฌ๋ฌ ๊ฐ์ ์ ๊ท ์๋๋ฐ์ค๊ฐ ๋์ ์์ฑ๋๊ฑฐ๋ ์์ฒญ๋์ด ์ผ๊ด์ ์ด์ง ์์ผ๋ฉด ์ฝ๋์คํํธ๋ก ์ธํด ๋ก๋ฉ ์ง์ฐ๊ณผ ํ์์์์ ์ ๋ฐํ ์ ์๋ค.
- Provisioned Concurrency๋ฅผ ํ์ฑํํ๋ฉด ํด๊ฒฐํ ์ ์์ง๋ง, ์์ ๊ฐ๋ ๋น์ฉ์ด ๋ฐ์ํ์ฌ ์ต๋ ์ฅ์ ์ธ ๋น์ฉ ์ ๊ฐ์ด ์ฌ๋ผ์ง๊ณ , ๊ณ ์ ๋น์ฉ์ด EC2๋ณด๋ค ๋น์ธ์ง๋ค.
- ์์น ์ฐ์
- Peak 80 RPS ์ค ์ ์ ํ์ผ ์บ์๋ฅผ ์ ์ธํ๊ณ ๋์ SSR ์์ฒญ 50 RPS
- ์ผ์ผ SSR ์์ฒญ ์ 20๋ง(DAU 4๋ง * ์ ์ ๋น ํ๊ท 5๊ฐ ํ์ด์ง ์ด๋ ๊ฐ์ )
- ์๊ฐ SSR ์์ฒญ ์ 600๋ง
- 1ํ ๋ ๋๋ง 200ms
- ๋ฉ๋ชจ๋ฆฌ 1GB
- Lambda
- ์ด ์ปดํจํ ๋ฆฌ์์ค: 600๋ง * 0.2s * 1GB = 120๋ง GB-s
- ๋งค์ 100๋ง ๊ฑด ํธ์ถ, 400๋งGB-s ์ปดํจํ ๋ฌด๋ฃ
- ๋น์ฉ: 11.67$(๋ฌด๋ฃ ํฐ์ด ์์ผ๋ฉด 17.2$)/์
- ์์ฒญ ์: (600๋ง ๊ฑด - 100๋ง ๊ฑด) * 0.2$/100๋ง = 1$
- ์ปดํจํ : (120๋งGB-s - 40๋งGB-s) * 0.0000133334$ = 10.67$
- [๋ฐ๊พธ๊น]๋ ์ ์ฌ์๊ฐ(12-13์)์ด๋ 18์-21์์ ํธ๋ํฝ์ด ์์นํ์ง๋ง, ์ด๋ฒคํธ์ฑ ์๋น์ค๊ฐ ์๋๊ธฐ ๋๋ฌธ์ ์ฝ๋ ์คํํธ๋ก ์ธํ ์ง์ฐ์ ์ฒด๊ฐํ ์ ๋์ ์์์น ๋ชปํ ํธ๋ํฝ ์์น๋ก ์์นํ ํ๋ฅ ์ด ๋งค์ฐ ๋ฎ๋ค.
=> Provisioned Concurrency๋ ์ฌ์ฉํ์ง ์๋๋ค.
- EC2
- ๋จ์ผ ์ธ์คํด์ค๋ ์ฅ์ ์ ์๋น์ค ์ ์ฒด๊ฐ ์ค๋จ๋๊ธฐ ๋๋ฌธ์ t4g.small 2๋๋ฅผ ์๋ก ๋ค๋ฅธ AZ์ ๋ฐฐ์นํ๋ค.
- ALB๋ฅผ ํตํด health check๋ฅผ ์ํํ๊ณ ํธ๋ํฝ์ ๋ถ์ฐํ๋ค.
- CPU ์ฌ์ฉ๋ฅ ์ด 70% ์ด๊ณผ ์ ์ต๋ 4๋๊น์ง ์ค์ผ์ผ์์๋๋๋ก ASG๋ฅผ ์ฐ๋ํ๋ค.
- ๋น์ฉ: t4g.small 15.18$ * 2 = 30.36$์ + ALB ๋น์ฉ
EC2 Container ์ ์
- Lambda๊ฐ ๋น์ฉ์ ์ผ๋ก ์ฐ์ธ(1/3 ๊ฐ๊ฒฉ)ํ๊ณ ์๋์ผ๋ก ๊ด๋ฆฌ(๊ณ ๊ฐ์ฉ์ฑ)ํด์ฃผ๋ ์ฅ์ ์ด ์์ผ๋, ์ฝ๋ ์คํํธ๋ ์ฐ๋ฆฌ ์๋น์ค์ ๋งค์ฐ ์น๋ช ์ ์ด๊ธฐ์ 20$์ ๊ฐ์น๋ณด๋ค UX ์ ํ๋ก ์ธํ ์ํด๊ฐ ๋ ํฌ๋ค.
- ๊ณ ์ ๋น์ฉ ์ง์ถ๋ก ์์ธก ๊ฐ๋ฅํ๊ธฐ์ ๋น์ฉ ์ํ์ ์ ํต์ ํ ์ ์๋ค.
- ๋ค๋ฅธ ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ๋์ผํ ํ๊ฒฝ์์ ๋ฐฐํฌํ๊ธฐ์ ๋ณ๋์ ๋ฐฐํฌ ํ๊ฒฝ์ ์ํ ์ถ๊ฐ์ ์ธ ํ์ต์ด ๋ถํ์ํ๋ค.
- ๊ตญ๋ด ํ์ ์๋น์ค๋ผ ๊ธ๋ก๋ฒ ์บ์ฑ์ ๋ถํ์ํ์ง๋ง, ์ ์ ํ์ผ ์์ฒญ์ ์ปจํ ์ด๋๊น์ง ์ ๋ฌํ๊ณ ์๋ตํ๋ ๊ฑด ๋ฆฌ์์ค ๋ญ๋น๋ค.
- Next.js ๋ฐํ์์ ์ฑ๊ธ ์ค๋ ๋ ์ด๋ฒคํธ ๋ฃจํ ๊ธฐ๋ฐ์ด๊ธฐ ๋๋ฌธ์ ์ ์ ํ์ผ ์์ฒญ์ด ์ ์ ๋๋ฉด CPU ๋ ๋๋ง ์์์ ๋บ๊ฒจ ์๋ต ์๋๊ฐ ์ ํ๋๋ค.
- ์ ์ ํ์ผ๊น์ง Next.js์์ ์ฒ๋ฆฌํ๋ ค๋ฉด ์ฒ๋ฆฌํด์ผ ํ RPS๋ฅผ ๋ ๋๊ฒ ์ฐ์ ํ๊ณ ์์์ ๋ ๋ง์ด ํ ๋นํ์ฌ ๋น์ฉ์ด ์์นํ๋ค.
- CloudFront๋ ์ ๋ฐ์ดํฐ ์ ์ก๋ 1TB์ 1000๋ง ๊ฑด์ ์์ฒญ์ ์๊ตฌ์ ์ผ๋ก ๋ฌด๋ฃ ์ ๊ณตํ๋ค. ๋ฌด๋ฃ ๋ฒ์๋ฅผ ์ด๊ณผํด๋ 0.085$/GB์ด๋ฏ๋ก ๋น์ฉ์ด ํฉ๋ฆฌ์ ์ด๊ณ , ์๋ต ์๊ฐ์ด ๋งค์ฐ ๋น ๋ฅด๊ธฐ์ CloudFront Edge ์บ์ฑ์ ํ์ฉํ๋ค.
- CloudFront๋ฅผ ์ฌ์ฉํ๊ณ , ์ ์ ํ์ผ์ ์ ์ฅํ ์ ์ฅ์๋ก AWS S3 ๋ฒํท์ ํ์ฉํ๋ค.
- ๋น๋ ์์ ์
.next/static๊ฒฐ๊ณผ๋ฌผ์ S3๋ก ๊ฐฑ์ ํ๋ CI/CD ์คํฌ๋ฆฝํธ๋ฅผ ํฌํจํด์ผ ํ๋ค. - ๊ฒฝ๋ก ํจํด์ด
_next/static/*,/public/*์ด๋ฉด AWS S3 ๋ฒํท์์ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๊ณ ์บ์ฑํ์ฌ ์ ์ ํ์ผ์ ์๋นํ๋ค. - Next.js๋ BE์ ํต์ ํ์ฌ ๋์ ์ผ๋ก HTML์ ์์ฑํ๋ ๋ฐ์๋ง ๋ฆฌ์์ค๋ฅผ ์ฌ์ฉํ๋ค.
- ๋น๋ ์์ ์
| ๊ตฌ๋ถ | ํต์ ์ฃผ์ฒด | ์ฃผ ์ฌ์ฉ ๋ชฉ์ | ๋ณด์/ํ ํฐ ์๋ | Next.js ์๋ฒ ๋ถํ | CORS ๊ณ ๋ ค |
|---|---|---|---|---|---|
| Server Components | Next.js ๋ฐํ์ โ ๋ฐฑ์๋ | ์ด๊ธฐ ๋ ๋๋ง(SSR), SEO, ์ ์ ํ์ด์ง ์์ฑ(SSG/ISR) | ์๋ (์๋ฒ ๊ฐ ํต์ ) | ๋ฎ์ (๋จ์ ํ๋ก์ ๋ฐ HTML ์คํธ๋ฆฌ๋ฐ) | ๋ถํ์ (Server-to-Server) |
| Client ์ง์ ํต์ | ๋ธ๋ผ์ฐ์ โ ๋ฐฑ์๋ | ์ฌ์ฉ์ ์ธํฐ๋์ , ์ค์๊ฐ ๋ฐ์ดํฐ, ๋ฌดํ ์คํฌ๋กค | ๋ธ๋ผ์ฐ์ ์ ๋ ธ์ถ (์ฟ ํค/์คํ ๋ฆฌ์ง) | ์์ (Next.js ๊ฑฐ์น์ง ์์) | ํ์ (CORS ๋๋ ๋ฆฌ๋ฒ์ค ํ๋ก์) |
| BFF (Route Handlers / Server Actions) | ๋ธ๋ผ์ฐ์ โ Next.js ์๋ฒ โ ๋ฐฑ์๋ | ํ์ผ ์ ๋ก๋ ์ ์ฒ๋ฆฌ, ๋ฐ์ดํฐ ๊ฐ๊ณต/๋ณํ | ์๋ ๊ฐ๋ฅ | ๋์ | ๋ถํ์ (๋์ผ ๋๋ฉ์ธ ์ฒ๋ฆฌ ์) |
- Reverse Proxy(ALB)๋ฅผ ํตํ Same-Origin ๊ตฌ์ฑ์ผ๋ก CORS ๋ฌธ์ ํด๊ฒฐ
-
bakkucca.com/api/*: Backend API target group -
bakkucca.com/ws/*: Backend WebSocket target group -
bakkucca.com/*: Next.js target group
-
- SSR ํ๊ฒฝ์์ VPC ๋ด๋ถ ํต์
- VPC ๋ด๋ถ DNS๋ก ์์ฒญ(์:
http://backend.internal:8080) - ๋ถํ์ํ ํจํท ์ง์ฐ ๋จ์ถ
- VPC ๋ด๋ถ DNS๋ก ์์ฒญ(์:
๋จ์ผ App ์๋ฒ์ ํ๊ณ์ ๋ฌธ์ ํด๊ฒฐ
ํต์ฌ ์ ๋ฆฌ
- ๋ฐฑ์๋ ์๋น์ค๋ ๋ ๋ฆฝ๋ ์ธ์คํด์ค๋ก ํ์ฅ, ๋ฐฐํฌํ๋ค.
- ๋ฐฑ์๋ ์ํ ๋ถ๋ฆฌ๋ฅผ ์ํด Redis๋ฅผ ์ฌ์ฉํ๋ค.
- ์ด๋ฅผ ์ํ ์ธํ๋ผ๋ก ElastiCache Serverless(Valkey)๋ฅผ ์ฌ์ฉํ๋ค. ์ ์ฝ $8~12๋ก ์ ํ์ง ์ค ๊ฐ์ฅ ์ ๋ ดํ๊ณ , ์ฌ๋ฌ AZ ๋ณต์ ์ ์๋ ์ ํ์ด ๊ธฐ๋ณธ์ผ๋ก ํฌํจ๋๋ค.
- ๋ค์ค ์ธ์คํด์ค ๊ฐ ์ฑํ ๋ฉ์์ง ์ค๊ณ๋ ๋์ผํ๊ฒ ElastiCache Serverless(Valkey)๋ฅผ ์ฌ์ฉํ๋ฉฐ, Redis Pub/Sub ๊ธฐ์ ์ ๋์ ํ๋ค.
- Peak RPS: 80 RPS ์ค ์ ์ ์บ์ฑ(S3/CloudFront)์ ์ ์ธํ๊ณ ๋ฐฑ์๋๋ก ์ ์ ๋๋ ๋์ API ์์ฒญ์ ์ฝ 50~70 RPS
- ์์ฒญ๋น ์ฟผ๋ฆฌ ์: ์ผ๋ฐ์ ์ธ CRUD ๋ฐ ์ธ์ฆ ํ์ธ์ ๊ฑฐ์น๋ ์น ํธ๋์ญ์ ์ ์์ฒญ 1ํ๋น ํ๊ท 3~5๊ฐ์ ์ฟผ๋ฆฌ ์ ๋ฐ (JPA Fetch Join ๋ฐ N+1 ์ต์ ํ ์ ์ )
- ์ฐ์ถ๋ ์๊ตฌ ์ฑ๋ฅ
- Peak Read QPS:
$70 \times 4 \times 0.8 \approx 224 \sim 300\ \text{QPS}$ - Peak Write TPS:
$70 \times 0.2 \approx 14 \sim 25\ \text{TPS}$
- Peak Read QPS:
- Active Working Set (๋ฉ๋ชจ๋ฆฌ ์ ์ฌ ๋์ ๋ฐ์ดํฐ ํฌ๊ธฐ):DAU 4๋ง ๋ช ์ ์ ์ ์ธ์ ๋ฉํ๋ฐ์ดํฐ, ์ต๊ทผ ๋ฑ๋ก๋ ๋ฌผ๋ฌผ๊ตํ ๊ฒ์๊ธ 10,000๊ฑด, ํ์ฑ ์ฑํ ๋ฐฉ ๋ฉํ๋ฐ์ดํฐ ๋ฐ ์นดํ ๊ณ ๋ฆฌ ์ธ๋ฑ์ค์ ์ดํฉ์ ์ฝ 1.5GB ~ 2.2GB.
| ๋น๊ต ํญ๋ชฉ | AWS RDS MySQL (db.t4g.medium ๊ธฐ์ค) | EC2 Docker ์ง์ ์ค์น (t4g.medium ๊ธฐ์ค) |
|---|---|---|
| ์ ์์ ๋น์ฉ | ์ฝ $38 (Single-AZ) ~ $76 (Multi-AZ) | ์ฝ $19 (์ธ์คํด์ค + EBS) |
| ๋ฐฑ์ / ๋ณต๊ตฌ | ์๋ ์ค๋ ์ท ๋ฐ ํน์ ์์ ๋ณต๊ตฌ(PITR) ๊ธฐ๋ณธ ์ ๊ณต | cron, shell script, S3 ์ ๋ก๋ ํ์ดํ๋ผ์ธ ์ง์ ๊ตฌ์ถ |
| ๊ณ ๊ฐ์ฉ์ฑ (HA) | Multi-AZ ํด๋ฆญ ํ ๋ฒ์ผ๋ก ์๋ ๋๊ธฐํ ๋ฐ ์๋ Failover | MHA, Orchestrator ๋๋ ์๋ ๋ณต๊ตฌ ์คํฌ๋ฆฝํธ ์ด์ ํ์ |
| ์ด์ ๊ณต์ | ๋งค์ฐ ๋ฎ์ (์ธํ๋ผ ์ธ์ 2๋ช ํ๊ฒฝ์ ์ต์ ) | ๋งค์ฐ ๋์ (OS ํจ์น, ๋์คํฌ ์ฉ๋ ์ฆ์ค, ์์ง ์ฅ์ ๋์) |
| ์ต์ข ํ์ | ๋์ | X |
Point-In-Time Recovery
๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ์์คํ ์ ๊ณผ๊ฑฐ ํน์ ์๊ฐ(์ด ๋จ์)์ ์ํ๋ก ๋๋๋ฆฌ๋ ๋ฐ์ดํฐ ๋ณต๊ตฌ ๊ธฐ์
- Amazon RDS๋ ํธ๋์ญ์ ๋ก๊ทธ๋ฅผ 5๋ถ๋ง๋ค ์ง์์ ์ผ๋ก ๋ฐฑ์ ํ๋ค.
- ๊ฐ์ฅ ๊ฐ๊น์ด ์ด์ ์ ์ฒด ๋ฐฑ์ ์ ๋ณต์ํ ๋ค, ํธ๋์ญ์ ๋ก๊ทธ(๋ฐ์ดํฐ ๋ณ๊ฒฝ ์ฌํญ์ ์ค์๊ฐ์ผ๋ก ๊ธฐ๋ก)๋ฅผ ์์ฐจ์ ์ผ๋ก replayํ์ฌ ๋ชฉํ ์์ ์ ๋ง์ถ๋ค.
- ๊ธฐ์กด DB์ ๋ฎ์ด์์์ง๋ ๊ฒ์ด ์๋๋ผ, ์๋ก์ด ์๋ํฌ์ธํธ๋ฅผ ๊ฐ์ง DB ์ธ์คํด์ค๊ฐ ์์ฑ๋๋ค.
=> ๋ณต๊ตฌ ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์๋ํฌ์ธํธ ์ค์ ์ ๋ณ๊ฒฝํด์ผ ํ ์ ์๋ค.
- ํ์ ์ํฉ
- ์ค์๋ก ์ค์ํ ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ์ ๋
- ์๋ชป๋ ๋ฐ์ดํฐ ์์ ์ด๋ ๋ฐฐํฌ ์ค๋ฅ๋ก ์์คํ
์์์ด ๋ฐ์ํ์ ๋
- ์ธ๋ถ ๊ณต๊ฒฉ ์ง์ ์ ์์ ํ ์ํ๋ก ๋๋๋ฆด ๋
- ์ค์๋ก ์ค์ํ ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ์ ๋
DB ์ ๋ฌธ๊ฐ๊ฐ ์๊ณ , ์ธํ๋ผ ๊ด๋ฆฌ์๊ฐ 2๋ช
์ธ ์ํฉ์์ EC2 ์์ ๋์ปค๋ก DB๋ฅผ ๋์ฐ๋ฉด, ์ปจํ
์ด๋ ๋น์ ์ ์ข
๋ฃ, ๋ฐ์ดํฐ ํ์ผ ๊นจ์ง, Disk Full ์ฅ์ ๋ฐ์ ์ ์ค์๊ฐ ๋ณต๊ตฌ(MTTR)๊ฐ ์ด๋ ค์์ ์๋น์ค ์ฅ์ ๋ก ์ง๊ฒฐ๋๋ค.
EC2 ๋๋น ์ 15$~30$ ์ถ๊ฐ ์ง์ถ์ด ๋ฐ์ํ์ง๋ง, RDS๊ฐ ์ ๊ณตํ๋ ์๋ํ๋ ํน์ ์์ ๋ณต๊ตฌ(PITR)์ ๋ฐฑ์
, ์คํ ๋ฆฌ์ง ์๋ ํ์ฅ, ํ๋ผ๋ฏธํฐ ํ
ํ๋ฆฟ ๊ด๋ฆฌ๋ 2์ธ ์ธํ๋ผ ํ์ด ๋ถ๋ดํด์ผ ํ ์ ์ง๋ณด์ ๋น์ฉ์ 90% ์ด์ ํก์ํ๊ธฐ์ ๋น์ฅ ์ถ๊ฐ ์ธ์ ๋ณด์ถฉ์ด ์ด๋ ค์ด ์ํฉ์์๋ ๊ฐ์น ๋๋น ์ ์ ๋น์ฉ์ด๋ค.
- ๋จ์ Read Replica(๋น๋๊ธฐ ๋ณต์ )๋ Primary DB๊ฐ ์ฃฝ์์ ๋ ์๋์ผ๋ก Primary๋ก ์น๊ฒฉ(failover)๋์ง ์๋๋ค.
- ๊ฐ๋ฐ์๊ฐ ์๋์ผ๋ก ์น๊ฒฉ์ํค๊ณ , Spring Boot์ DB ์ฃผ์๋ฅผ ๋ณ๊ฒฝํด ์ฌ๋ฐฐํฌํด์ผ ํ๋ฏ๋ก ๋ค์ดํ์์ด ์์ญ ๋ถ ์ด์ ๋ฐ์ํ๋ค.
- ๋น๋๊ธฐ ๋ณต์ ํน์ฑ์ Primary ์ฅ์ ์ง์ ํธ๋์ญ์ ์ด ์ ์ค๋ ์ ์๋ค.
Peak 80 RPS ์์ค์์๋ ๋จ์ผ ์ธ์คํด์ค๋ก๋ Read/Write ์ฒ๋ฆฌ๊ฐ ์ถฉ๋ถํ๋ค.
ํ์ฌ ์ค์ํ ๊ฒ์ ์ฝ๊ธฐ ํธ๋ํฝ ๋ถ์ฐ์ด ์๋๋ผ ๋จ์ผ ์ฅ์ ์ (SPOF) ์ ๊ฑฐ ๋ฐ ๋ฐ์ดํฐ ์ ์ค ์๋ ๋ฌด์ค๋จ ๋ณต๊ตฌ์ด๋ฏ๋ก Multi-AZ Standby๋ฅผ ์ฐ์ ๋์
ํ๋ค.
=> ํ์์ Read ์ฟผ๋ฆฌ๋ฅผ ์ฒ๋ฆฌํ์ง ์๋ Hot Standby ์ํ์ด๋ฏ๋ก ๋น์ฉ์ด 2๋ฐฐ๋ก ์ฆ๊ฐํ๋ค.
=> Standby์ Primary ์ ํ(failover) ์ค ์ฝ 1๋ถ์ ์ค๋จ์ด ๋ฐ์ํ๋ค.
| ์ธ์คํด์ค ์ฌ์ | vCPU / RAM | Sysbench OLTP Read/Write QPS (p95 < 5ms) | Buffer Pool ๊ฐ์ฉ๋ | ์ ๋น์ฉ (Single-AZ / Multi-AZ) | ํ์ |
|---|---|---|---|---|---|
| db.t4g.small | 2 vCPU / 2GB | ~800 QPS | ์ฝ 1.3GB (OS ๊ฒฝํฉ ์ํ) | $19 / $38 | ์ฉ๋ ๋ถ์กฑ (Working Set ์ด๊ณผ) |
| db.t4g.medium | 2 vCPU / 4GB | ~2,200 QPS | ์ฝ 2.8GB (์์ ์ ์ ์ฌ) | $38 / $76 | ์ต์ (๊ถ์ฅ) |
| db.t4g.large | 2 vCPU / 8GB | ~4,500 QPS | ์ฝ 5.8GB (์ด๊ณผ ์คํ) | $76 / $152 | ์์ฐ ์ฌ์ ์ ๊ณ ๋ ค |
| db.m7g.large | 2 vCPU / 8GB (์ ์ฉ ์ฝ์ด) | ~6,000+ QPS | ์ฝ 6.0GB | $124 / $248 | ์ค๋ฒ์์ง๋์ด๋ง |
์ธ์คํด์ค: db.t4g.medium(2vCPU, 4GB RAM)
-
db.t4g.medium์ 4GB ๋ฉ๋ชจ๋ฆฌ ์ค 70-75%์ธ ์ฝ 2.8GB๋ฅผ innodb_buffer_pool_size๋ก ํ ๋นํ๋ฉด, ๋ฐ์ด๋ฉ๋ Working Set(1.5-2.2GB) ์ ์ฒด๊ฐ ๋ฉ๋ชจ๋ฆฌ์ ์์ฃผํ์ฌ Buffer Pool Hit Ratio๋ฅผ 95% ์ด์์ผ๋ก ์ ์งํ ์ ์๋ค. - ์ต๋ 2,200 QPS๋ฅผ ์ํํ ์ ์์ผ๋ฏ๋ก, ํ์ฌ ์๊ตฌ์น์ธ 300 QPS๋ ํ๊ณ์น์ ์ฝ 14%์ด๊ธฐ์ ํธ๋ํฝ ์คํ์ดํฌ์ ์์ ์ ์ผ๋ก ๋์ํ ์ ์๋ค.
- burstable ์ธ์คํด์ค ํน์ฑ์ CPU ํฌ๋ ๋ง ๊ณ ๊ฐ ์ ์ฑ๋ฅ์ด 20%๋ก ์ ํ๋ ์ํ์ด ์๋ค. 14% ์ฌ์ฉ๋ฅ ์ด๋ฉด ์์ ํฌ๋ ๋ง์ด ์ถ์ ๋์ด ํ์ฌ ์ด์ ํ๊ฒฝ์์ ํจ์จ์ ์ด๋ค.
์คํ ๋ฆฌ์ง: AWS EBS gp3(๊ธฐ๋ณธ 50GB, 3,000 IOPS, 125 MB/s)
- ๋ค๋ฅธ ์์(๊ธฐ์กด ๊ตฌ์ฑ์ ํ DB, OS ๋ฑ)๋ค๊ณผ ์์ ํ ๊ฒฉ๋ฆฌํ๋ค.
- I/O ์๊ตฌ๋
- Read I/O:
- Write I/O:
- ํฉ์ฐ:
- ๊ธฐ๋ณธ ์ ๊ณต๊ฑ์ธ 3,000 IOPS๋ 80 RPS์ ์ฐ๊ธฐ ์์ ์ ์ถฉ๋ถํ๋ค.
์ปค๋ฅ์ ์๊ฐ CPU ์ฝ์ด ์๋ฅผ ์ด๊ณผํด ๊ณผ๋ํด์ง๋ฉด Context Switching๊ณผ CPU ์บ์ ๋ผ์ธ ๋ฌดํจํ๋ก ์ธํด ์ฒ๋ฆฌ๋์ด ๊ธ๊ฐํ๋ค.
๋์ ์ปค๋ฅ์ ์ ์ฆ๋ช
WAS 1๋๋น ์ด๋น 40๊ฑด์ ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ , ํ๋๋ ์ฟผ๋ฆฌ์ ํ๊ท ์คํ ์๊ฐ์ด 2ms(0.002s)์ด๋ฉฐ ์์ฒญ๋น ์ฟผ๋ฆฌ๊ฐ 3ํ ์คํ๋๋ค๊ณ ๊ฐ์
์ค์ DB ์ฟผ๋ฆฌ๋ฅผ ์ํํ๋ ์ปค๋ฅ์
์ ํ๊ท 0.24๊ฐ
- MySQL ์์ง์ด CPU/๋ฉ๋ชจ๋ฆฌ์์ ์์ํ๊ฒ SQL์ ํ์ฑํ๊ณ ์คํํ๋ ์๊ฐ์ ํ๊ท 0.24์ด.
- Spring Boot์ @Transactional ํ๊ฒฝ์์ ์ ํ๋ฆฌ์ผ์ด์ ์ด HikariCP ์ปค๋ฅ์ ์ ์ ์ ํ๊ณ ๋์ง ์๋ ์๊ฐ(Connection Hold Time)์ Java ํ ๋ฉ๋ชจ๋ฆฌ์์์ ๊ฐ์ฒด ๋งคํ, ๋น์ฆ๋์ค - ์ฐ์ฐ, ๋คํธ์ํฌ ์๋ณต ์๊ฐ(RTT)์ด ๋ํด์ ธ ์ค์ 1ํ ํธ๋์ญ์ ๋์ ์ปค๋ฅ์ ์ ์ฅ๊ณ ์๋ ์๊ฐ์ 20ms๊น์ง ๋์ด๋ ์ ์๋ค.
- ์ ์ ์๊ฐ์ด 2ms์์ 20ms๋ก 10๋ฐฐ ๋์ด๋๋ฉด, ๋ฆฌํ์ ๋ฒ์น์ ์ํด ํน์ ์๊ฐ ์ปค๋ฅ์
์ ๋ฌผ๊ณ ์๋ ํ๊ท ๊ฐ์๋
$0.24 \times 10 = \mathbf{2.4\text{๊ฐ}}$ ๋ก ๋์ด๋๋ค. - ์ฌ๊ธฐ์ ํผํฌ ์ ํธ๋ํฝ ๋ฒ์คํธ๊ฐ ํ๋ฉด ์๊ฐ์ ์ผ๋ก 10~15๊ฐ์ ์ปค๋ฅ์ ์ด ๋์์ ํ์ฑํ๋ ์ ์๋ค.
- MySQL์ ํด๋น ์ปค๋ฅ์ ์์ ์ง๊ธ ๋น์ฅ ์ฟผ๋ฆฌ๊ฐ ๋๊ณ ์๋์ง(Active), ์๋๋ฉด HikariCP ํ ์์์ ๋๊ธฐ ์ค์ธ์ง(Sleep/Idle) ๊ตฌ๋ถํ์ง ์๊ณ ๋๊ฐ์ด max_connections ์ฌ๋กฏ 1๊ฐ๋ก ๊ณ์ฐํ๋ค.
=> ์ ํ๋ฆฌ์ผ์ด์
ํ ์ฌ์ด์ฆ๋ฅผ 10๊ฐ๋ณด๋ค ๋ ๋๋ฆด ํ์๊ฐ ์๋ค.
=> 2๊ฐ์ ์ ํ๋ฆฌ์ผ์ด์
์ ๊ตฌ๋ํ๋ค๊ฐ ๋ฌด์ค๋จ ๋ฐฐํฌ ์งํ ์ 2๋ฐฐ๋ก ๋์ด๋ 40๊ฐ์ ์ปค๋ฅ์
์ด ํ์ํ๋ค.
[ ๋ฐฐํฌ ์ ํ ์๊ฐ ]
- ๊ตฌ๋ฒ์ WAS 1 (Hikari: 10๊ฐ) โโโ
- ๊ตฌ๋ฒ์ WAS 2 (Hikari: 10๊ฐ) โโโผโโโบ MySQL ์ปค๋ฅ์
์ผ์์ 40๊ฐ ์ ์
- ์ ๋ฒ์ WAS 1 (Hikari: 10๊ฐ) โโโค
- ์ ๋ฒ์ WAS 2 (Hikari: 10๊ฐ) โโโ
=> AWS RDS ๊ด๋ฆฌ ๋ฐ๋ชฌ, ์์ง๋์ด ์ด์ ํด ๋ฑ ๋ณ๋ ์ปค๋ฅ์
์ด ์ถ๊ฐ๋ก ํ์ํ๋ค.
=> ์ด 60๊ฐ ์ด์์ max_connections ์ค์ ์ด ํ์ํ๋ค.
=> MySQL์ ๊ธฐ๋ณธ ์ค์ ๊ฐ์ด 151๋ก, ๋ถ์กฑํจ์ด ์๋ค.
=> max_connectoins ์ธ์๋ ๋ณ๋ ์ธ๋ถ ์ค์ ํ๋์ด ํ์ฌ ํ๊ฒฝ์์๋ ํ์์ ์ด์ง ์์ผ๋ฏ๋ก ๊ณ ๋ คํ์ง ์๋๋ค.
- DB
- RDS(Multi-AZ): 76$
- FE
- CDN: ๋ฌด๋ฃ
- NextJS ์ธ์คํด์ค ์ปจํ ์ด๋(t4g.small * 2): 30.36$
- Load Balancer
- ALB: ๊ธฐ๋ณธ 16.2$ + LCU 20(~30)$
- BE
- ECS on EC2(t4g.small * 2): 30.36$
- EBS 30GB * 2: 5.5$
=> ์ดํฉ 178.42$