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대로 늘렸더니 손님들이 장바구니가 자꾸 비워진다고 신고합니다. 근본 원인은?
🤔 확인 문제
max_fails=3 fail_timeout=30s 의 효과는?