15강 / 20강
로드밸런싱 — 계산대를 늘리기
한 대가 죽어도 쇼핑몰은 열려 있게
블랙프라이데이 아침 9시. 손님이 평소의 30배로 몰립니다. 앱 서버 한 대로는 감당이 안 돼요. 어떻게 할까요?
두 가지 길이 있습니다.
수직 확장 (스케일 업)
서버 1대를 더 좋게 CPU 4→16, RAM 8→64GB
간단하지만 한계가 있고,
그 한 대가 죽으면 끝
그 한 대가 죽으면 끝
수평 확장 (스케일 아웃)
서버를 3대, 5대로 늘림
거의 무한히 늘릴 수 있고
한 대 죽어도 서비스는 유지
한 대 죽어도 서비스는 유지
수평 확장을 하려면 손님을 여러 대에 나눠 주는 사람이 필요합니다. 그게 로드밸런서이고, nginx가 그 일을 할 수 있어요.
upstream 블록 — 계산대 명단
upstream mallshop {
server 10.0.1.11:8000; ← 앱 서버 1호
server 10.0.1.12:8000; ← 앱 서버 2호
server 10.0.1.13:8000 weight=2; ← 좋은 장비라 2배 받음
server 10.0.1.14:8000 backup; ← 평소엔 놀다가 비상시만
}
server {
location / {
proxy_pass http://mallshop; ← IP 대신 명단 이름
}
}
나눠 주는 방법 세 가지
| 방식 | 동작 | 쓰는 곳 |
|---|---|---|
| round-robin 기본값 | 순서대로 하나씩 | 대부분의 경우. 단순하고 고르게 나뉨 |
| least_conn | 지금 연결이 가장 적은 곳으로 | 요청마다 처리 시간이 들쭉날쭉할 때 |
| ip_hash | 같은 손님은 항상 같은 서버로 | 세션을 서버 메모리에 두는 옛날 앱 |
죽은 서버를 알아서 빼는 법
앱 서버 2호가 죽었는데 nginx가 계속 손님을 보내면 그 손님들은 502를 봅니다. nginx는 실패를 세어서 잠시 명단에서 빼 둡니다.
server 10.0.1.12:8000 max_fails=3 fail_timeout=30s;
30초 동안 3번 실패하면 그 서버를 30초간 건너뜁니다. 그 뒤 다시 한 번 찔러 보고, 살아났으면 명단에 복귀시켜요.
위젯에서 X-Upstream 헤더로 분배를 확인할 수 있습니다.
💻 손님 노트북
브라우저 안에서 실행 (계산용)
무중단 배포 — 이중화의 진짜 보상
서버가 두 대 이상이면 서비스를 멈추지 않고 새 버전을 올릴 수 있습니다.
1 1호를 명단에서 뺀다 (
down)2 1호에 새 버전 배포 → 잘 도는지 직접 확인
3 1호를 명단에 복귀, 2호를 뺀다
4 2호도 배포 → 복귀. 손님은 아무것도 눈치채지 못함
이것을 롤링 배포라고 합니다. 한 대짜리 서버로는 절대 못 하는 일이에요. "이중화는 장애 대비용" 이라고만 생각하기 쉽지만, 평소의 배포 편의가 더 큰 이득일 때가 많습니다.
🤔 확인 문제
앱 서버 3대로 늘렸더니 손님들이 장바구니가 자꾸 비워진다고 신고합니다. 근본 원인은?
해설 요청마다 다른 서버로 가는데 세션이 그 서버 메모리에만 있으면 장바구니를 못 찾습니다. ip_hash 는 임시방편이고, 정석은 세션을 Redis 등 공유 저장소로 빼는 것입니다.
🤔 확인 문제
max_fails=3 fail_timeout=30s 의 효과는?해설 죽은 서버에 계속 손님을 보내면 그만큼 502가 늘어납니다. nginx가 실패를 세어 잠시 건너뛰었다가 다시 확인하는 것이 이 설정이에요.