본문 바로가기
C.W.K.
Stream
Lesson 01 of 07 · published

부하 분산

~12 min · production, load-balancer, sticky-sessions

Level 0Poller
0 XP0/60 lessons0/10 achievements
0/120 XP to next level120 XP to go0% complete

고정 세션 문제

WebSocket 연결은 오래 유지되고 상태가 있어서 특정 서버 프로세스에 살아. 클라이언트가 다시 연결할 때 세션, 방 멤버십, 인증 맥락을 모르는 다른 서버에 닿을 수 있어. 고정 세션은 같은 클라이언트의 재연결이 같은 서버로 가도록 보장해.

세 가지 고정 전략

IP 해시 는 가장 단순하고 쿠키가 필요 없지만 대학 와이파이나 사내 VPN 처럼 NAT 를 공유하면 제대로 분산되지 않아. 쿠키 기반 고정 은 정확하지만 첫 WebSocket 프로토콜 전환 시점에는 쿠키가 항상 설정되어 있지 않을 수 있어. 연결 수 기반 분산(least-conn) 은 고르게 나누지만 고정성이 없으므로 서버가 상태를 갖지 않거나 Redis 연결 다리로 보완할 때만 좋아.

Code

Nginx ip_hash 고정·nginx
upstream websocket_servers {
    ip_hash;                # same client IP -> same backend
    server backend1:8000;
    server backend2:8000;
    server backend3:8000;
    keepalive 64;
}

server {
    listen 443 ssl http2;
    server_name api.example.com;

    location /ws {
        proxy_pass http://websocket_servers;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_read_timeout  3600s;
        proxy_send_timeout  3600s;
    }
}
HAProxy 쿠키 고정·text
backend websocket
    cookie SRV insert indirect nocache
    server srv1 backend1:8000 check cookie srv1
    server srv2 backend2:8000 check cookie srv2
    server srv3 backend3:8000 check cookie srv3
    timeout tunnel 1h

External links

Exercise

Nginx 뒤에 FastAPI WebSocket 서버 두 대와 ip_hash 를 띄워. 같은 NAT 에 있는 집 와이파이의 휴대폰과 노트북에서 연결해 같은 백엔드에 갈 수 있는지 확인해. 서로 다른 IP 두 곳에서도 연결해 백엔드 사이에 분산되는지 보고 결과를 문서화해.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.