본문으로 건너뛰기
김신건의 로그

[Network] Load Balancer: L4 vs L7, 알고리즘, sticky session

· 수정 · 📖 약 3분 · 1,275자/단어 #load-balancer #network #devops #infrastructure
Load Balancer, L4 LB, L7 LB, round-robin, least connections, consistent hashing, health check, sticky session

정의

Load Balancer트래픽을 여러 백엔드로 분산 하는 인프라. 수평 확장 + 가용성 + 무중단 배포 의 토대.

L4 vs L7

구분L4 (Transport)L7 (Application)
본 계층TCP/UDPHTTP/gRPC/WebSocket
보는 정보IP + portURL, 헤더, 쿠키, body
처리 비용가벼움무거움 (parse)
기능단순 분산path/header routing, rewrite, auth, rate limit
TLS 종료옵션 (passthrough 가능)보통 종료 후 분배
AWS NLB, HAProxy TCP, IPVSAWS ALB, nginx, Envoy, Traefik
flowchart LR
    subgraph L4
        C1[Client] -->|TCP| LB4[L4 LB]
        LB4 -->|TCP forward| B1[Backend 1]
        LB4 -->|TCP forward| B2[Backend 2]
    end
    subgraph L7
        C2[Client] -->|HTTP| LB7[L7 LB]
        LB7 -->|URL = /api| BA[API service]
        LB7 -->|URL = /static| BS[Static service]
    end

알고리즘

알고리즘동작
Round Robin순서대로
Weighted RR가중치 비율
Least Connections현재 연결 가장 적은 백엔드
Least Response Time평균 응답 시간 가장 짧은
IP Hash클라이언트 IP 해시 → 같은 IP 는 같은 백엔드
Consistent Hashinghash 링 → 노드 추가/제거 시 최소 재분배
Random (P2C)무작위 2개 중 덜 바쁜

Power of Two Choices (P2C)

flowchart LR
    R[Request] -->|random pick 2| P[Pool of N]
    P --> S1[Server A: load=5]
    P --> S2[Server B: load=8]
    P -->|선택| S1

TIP

완전 random 보다 좋고 least-conn 보다 cheap. Netflix, Twitter 등 대규모 서비스의 기본.

Consistent Hashing

노드 추가/제거 시 N/M 만 재분배 (vs 일반 hash 의 전체 재분배).

flowchart LR
    Ring(("Hash Ring<br/>0 → 2^32")) --> N1[Node A<br/>at hash 100]
    Ring --> N2[Node B<br/>at hash 500]
    Ring --> N3[Node C<br/>at hash 900]
    Key1[key: hash 300] -->|시계방향| N2
    Key2[key: hash 700] -->|시계방향| N3
  • Sticky session, cache 라우팅, DB sharding.
  • virtual node (각 노드를 수십 개 ring 점) 로 분포 균등화.

Health Check

sequenceDiagram
    loop 30초마다
        LB->>Backend: GET /health
        Backend-->>LB: 200 OK
    end
    Note over Backend: 다운
    LB->>Backend: GET /health
    Backend-xLB: timeout
    Note over LB: 3회 연속 실패 → 풀에서 제외
  • Active: LB 가 주기 ping.
  • Passive: 실제 요청 실패율로 판단.
  • Composite: 둘 다.

CAUTION

Health check 가 너무 단순 (예: 200 OK 만) 하면 DB 다운인데 healthy 로 판정. deep health (DB, cache 까지 ping) vs shallow health (애플리케이션만) 의 분리.

Sticky Session

방식동작단점
CookieLB 가 쿠키 박음쿠키 위변조 / 제거 시 깨짐
IP Hash클라이언트 IP 기준NAT 뒤 사용자가 같은 노드 몰림
Application앱이 자기 ID 응답 헤더로구현 복잡

자세한 건 Sticky Session 참고.

보안 / 옵저버빌리티

L7 LB 의 추가 능력:

  • TLS termination (인증서 관리)
  • WAF (SQLi, XSS 차단)
  • Rate limiting
  • Request/response 로깅
  • Header rewrite, redirect
  • Path-based routing
  • A/B testing, canary

실전 LB 선택

도구L4/L7사용처
AWS ALBL7AWS 표준 L7
AWS NLBL4초저지연, gRPC, WebSocket
AWS CLBL4/L7(legacy)
nginxL7 (L4 옵션)self-host 가장 흔함
HAProxyL4/L7고성능
EnvoyL7service mesh, gRPC
TraefikL7K8s 친화
IPVSL4커널 모듈, 극저지연
CaddyL7자동 TLS

흔한 함정

WARNING

  1. WebSocket 의 idle timeout = ALB 60s default 가 silent close. ping/pong 으로.
  2. gRPC 의 long-lived HTTP/2 연결 = L4 LB 의 connection 단위 분산 때문에 불균등 분포. gRPC 자체 load balancing (Envoy, GRPC client-side LB) 필요.
  3. Health check 의 서버 자살 = HC 자체가 부하 → 서버 다운. 분리된 endpoint + 경량 응답.
  4. Sticky session + auto-scaling = scale-in 시 stuck 사용자 세션 손실. 세션을 외부 store (Redis) 로 옮기는 게 정통.

Connection Draining (드레이닝)

배포/유지보수 시 서버를 안전하게 풀에서 제거하는 과정.

sequenceDiagram
    participant LB as Load Balancer
    participant Old as Old Server
    participant New as New Server
    LB->>Old: 새 연결 중단 신호
    LB->>New: 새 연결 전달
    Old-->>LB: 진행 중 요청 처리 완료 대기
    Old-->>LB: 완전 종료
    Note over LB,Old: grace period 30-60s 내 완료
  • AWS ALB: deregistration delay (default 300s, 조정 가능)
  • Kubernetes: terminationGracePeriodSeconds + readiness probe 제거
  • 드레이닝 없이 즉시 종료 = 진행 중 요청 손실.

Blue-Green 배포 / Canary 배포

LB 는 무중단 배포의 핵심 인프라.

flowchart LR
    LB[Load Balancer]
    Blue["Blue v1.0<br/>기존 버전"]
    Green["Green v1.1<br/>신 버전"]
    LB -->|"100% → 0%"| Blue
    LB -->|"0% → 100%"| Green
전략설명롤백 속도
Blue-Green동시 운영, 트래픽 전환즉시
Canary소수 % 부터 점진 증가비율 감소
Rolling순차 교체 (구/신 혼재)느림
Shadow복제 트래픽, 결과 비교없음

TIP

Canary 기준 지표: 에러율, P99 지연, 비즈니스 메트릭. 이상 감지 시 자동 롤백 (Argo Rollouts, Flagger).

DSR (Direct Server Return)

트래픽 반환 경로를 LB 를 거치지 않고 서버에서 클라이언트로 직접 전달.

flowchart LR
    Client -->|"요청 via LB"| LB["L4 LB"]
    LB -->|"포워딩 (DIP to RIP)"| Server
    Server -->|"응답 직접 반환"| Client
  • 응답 트래픽 (보통 요청 대비 10x 이상) 이 LB 를 우회 → LB 처리량 병목 해소.
  • 주로 L4 LB (IPVS, HAProxy) 에서 구현.
  • 서버가 VIP (Virtual IP) 를 loopback 에 설정해야 함.

Global LB vs Regional LB

구분Global LBRegional LB
역할DNS 기반 지역 선택지역 내 서버 분산
지연 최적화GeoDNS + anycast지역 내 최적
AWS Route 53, CloudflareAWS ALB, nginx
페일오버 단위지역 전체 이전서버 단위
flowchart TD
    User[글로벌 사용자]
    User --> DNS["GeoDNS / Anycast"]
    DNS --> RegionA["Region A (서울) ALB"]
    DNS --> RegionB["Region B (도쿄) ALB"]
    RegionA --> SA1[Server A1]
    RegionA --> SA2[Server A2]
    RegionB --> SB1[Server B1]

CAUTION

DNS TTL 이 길면 지역 이전 시 일부 사용자가 오래된 IP 를 캐시. TTL 60-120s 권장. Active-Active 구성에서 데이터 동기화 전략 필수.

클라이언트 사이드 LB

인프라 LB 대신 클라이언트가 서버 목록을 직접 관리하여 선택.

구분서버 사이드 LB클라이언트 사이드 LB
AWS ALB, nginxgRPC, Ribbon (Netflix)
장점투명, 단순레이턴시 1 hop 감소
단점중앙 병목 가능클라이언트 복잡도
서버 목록LB 가 관리서비스 레지스트리 (Consul, etcd)

NOTE

마이크로서비스 환경에서 gRPC 는 기본 클라이언트 사이드 LB (round-robin, pick-first). Kubernetes headless service 와 함께 사용.

실전 LB 설정 패턴

상황권장 설정
WebSocketidle timeout 조정 (>60s), proxy_read_timeout 증가
gRPCHTTP/2 지원 LB, keepalive 설정
Auto-scalingConnection Draining 활성화, Health check 간격 단축
무중단 배포Blue-Green 또는 Canary + draining
세션 유지 필요Sticky session (단, Redis 세션 스토어 권장)
초저지연DSR 고려 (L4), IPVS

관련 위키

이 글의 용어 (5개)
[AWS] ALB vs NLB: L7 vs L4 로드 밸런서cloud
정의 | | ALB | NLB | (Classic ELB) | |---|---|---|---| | Layer | L7 (HTTP) | L4 (TCP/UDP) | L4 + L7 (…
[K8s] Service: ClusterIP / NodePort / LoadBalancer / ExternalNamekubernetes
정의 Service = Pod 집합에 안정 가상 IP + DNS 부여. Pod 가 죽고 다시 만들어져도 Service IP 는 그대로. 4가지 타입 1. ClusterIP (기본…
[Network] HTTP/2: multiplexing, HPACK, server push의 종말network
정의 HTTP/2 (2015, RFC 9113) 는 HTTP/1.1 의 문법은 유지하되 전송을 바이너리 + 멀티플렉싱 으로 바꾼다. Head-of-Line Blocking (HT…
[Redis] Pub/Sub vs Streams: 휘발 신호 vs 영속 로그database-internals
정의 - Pub/Sub ( / ): 지금 듣고 있는 구독자 에게만 메시지가 전달되는 휘발성 신호. 영속 없음, ACK 없음. fan-out. - Streams ( / / / ):…
Sticky Sessionconcurrency
정의 Sticky Session (= Session Affinity)은 로드밸런서가 같은 클라이언트의 요청을 항상 같은 백엔드 서버로 라우팅하도록 하는 동작이다. 서버, 즉 세션…

💬 댓글

사이트 검색 / 명령어

검색

스크롤 = 확대/축소 · 드래그 = 이동 · 0 = 원래 크기 · ESC = 닫기