본문으로 건너뛰기

안동민 개발노트

본문 시작

로드 밸런서

L4와 L7 로드 밸런서의 라우팅 기준을 비교하고 분산 알고리즘·헬스 체크·세션 유지 방식을 설계합니다.

서비스의 사용자가 늘어나면, 하나의 서버로는 모든 요청을 처리할 수 없습니다.

서버를 여러 대로 확장(Scale Out)하면, 들어오는 요청을 어떤 기준으로 어떤 서버에 보낼지 결정해야 합니다.

이 역할을 하는 것이 로드 밸런서(Load Balancer)입니다.


L4 vs L7 로드 밸런서

로드 밸런서는 동작하는 계층에 따라 두 종류로 나뉩니다.

L4는 연결 정보를, L7은 HTTP 의미를 보고 분산한다

로드 밸런서가 어느 계층까지 해석하는지에 따라 라우팅 기준, TLS 종단, 운영 비용이 달라진다.

  1. 보는 값 IP, port, protocol

    Host, path, header, cookie

  2. 장점 빠르고 단순 서비스 의미

    기반 라우팅

  3. TLS 위치 대개 backend 또

    pass-through LB에서 TLS 종료 가능

  4. 잘 맞

    곳 TCP, 게임, gRPC pass-through 웹, API gateway, canary routing

L4 로드 밸런서는 전송 계층(TCP/UDP)에서 동작합니다.

IP 주소, 포트, 프로토콜 같은 연결/흐름 정보를 기준으로 트래픽을 분배하고, HTTP 헤더나 URL 경로는 해석하지 않습니다.

처리가 빠르고 오버헤드가 적습니다.

AWS의 NLB(Network Load Balancer)가 대표적입니다.

L7 로드 밸런서는 애플리케이션 계층(HTTP)에서 동작합니다.

HTTP 헤더, URL 경로, 쿠키 등을 분석하여 라우팅 결정을 내립니다.

/api/* 요청은 API 서버 그룹으로, /static/* 요청은 정적 파일 서버 그룹으로 보내는 것이 가능합니다.

HTTPS 트래픽에서 URL이나 헤더를 기준으로 라우팅하려면 보통 로드 밸런서에서 TLS를 종료하고, 필요하면 백엔드로 다시 TLS를 연결합니다.

AWS의 ALB(Application Load Balancer)가 대표적입니다.

비교 항목L4 (NLB)L7 (ALB)
동작 계층TCP/UDPHTTP/HTTPS
라우팅 기준IP, 포트, 프로토콜URL, 헤더, Host, 쿠키
TLS 처리패스스루 또는 종단 가능HTTP 기준 라우팅 시 종단 필요
오버헤드상대적으로 낮음기능이 많은 만큼 더 큼
WebSocketTCP 연결로 처리HTTP Upgrade 이후 연결 유지
적합한 사용처TCP 서비스, 게임, IoT, gRPC웹 API, 마이크로서비스, BFF

로드 밸런싱 알고리즘

로드 밸런싱 알고리즘은 믿을 수 있는 부하 신호에 맞춰 고른다

round robin, weight, least connections, hash, P2C는 입력 신호와 실패 모드가 다르다.

  1. Round robin 서버 스펙

    요청 비용이 비슷함 긴 요청이 섞이면 불균형

  2. Weighted 서버 성능 차이

    숫자로 반영 수동 튜닝이 낡기 쉬움

  3. Least conn. 현재 연결 수

    긴 연결 추적 비용

  4. Hash/sticky 같

    사용자를 같은 backend로 NAT와 hotspot 위험

  5. P2C 두 후보 중 더

    벼운 쪽 랜덤 샘플 품질에 의존

알고리즘동작 방식장점단점사용 시나리오
라운드 로빈순서대로 분배단순, 균등서버 성능 차이 무시동일 스펙 서버
가중치 라운드 로빈가중치 비율 분배성능 차이 반영가중치 수동 설정서버 스펙 혼합
최소 연결연결 수 최소 서버로동적 부하 반영상태 추적 비용요청 처리 시간 불균일
가중치 최소 연결가중치 + 최소 연결가장 정밀구현 복잡혼합 스펙 + 불균일 부하
IP 해시IP 해시로 고정 서버세션 유지불균형 가능Sticky 필요 시
랜덤무작위 선택구현 최단순비효율 가능테스트
P2C후보 2개 중 낮은 부하 선택단순하면서 균형 좋음부하 지표 필요대규모 서비스

IP 해시는 “같은 IP는 같은 서버로 가게 할 가능성”을 높이지만, NAT나 모바일망처럼 여러 사용자가 같은 공인 IP를 공유하면 특정 서버에 부하가 몰릴 수 있습니다.

쿠키 기반 sticky session도 비슷하게 장애와 불균형을 같이 고려해야 합니다.


헬스 체크

헬스 체크는 alive와 ready를 분리해야 오판이 줄어든다

프로세스가 살아 있는 것과 새 요청을 받을 준비가 된 것은 다르다. 두 신호를 섞으면 장애 전환이 흔들린다.

  1. 1 Probe

    Probe HTTP/TCP/gRPC 확인 관측할 신호 선택

  2. 2 Threshold

    Threshold 연속 실패 누적 일시 오류로 제외하지 않음

  3. 3 Drain

    Drain 새 요청 차단 기존 연결은 정리

  4. 4 Recover

    Recover healthy threshold 통과 서서히 복귀

헬스 체크는 보통 HTTP 요청, TCP 연결, gRPC 헬스 체크 같은 방식으로 대상 서버가 트래픽을 받을 수 있는지 확인합니다.

단, 모든 헬스 체크가 같은 의미는 아닙니다.

liveness는 프로세스가 죽었는지 확인하는 얕은 체크에 가깝고, readiness는 지금 트래픽을 받아도 되는지 확인하는 체크입니다.

DB 연결 같은 의존성 검사는 readiness에는 유용하지만, liveness에 과하게 넣으면 일시적인 DB 장애가 전체 서버 재시작으로 번질 수 있습니다.

health_endpoint.py
# Flask 헬스 체크 엔드포인트 예: live와 ready를 분리
from flask import Flask, jsonify
import psycopg2

app = Flask(__name__)

@app.route("/live")
def live():
    return jsonify({"status": "alive"}), 200

@app.route("/ready")
def ready():
    checks = {"status": "ready"}
    try:
        conn = psycopg2.connect("dbname=mydb user=app")
        conn.close()
        checks["database"] = "ok"
    except Exception:
        checks["database"] = "fail"
        checks["status"] = "unhealthy"
        return jsonify(checks), 503

    return jsonify(checks), 200

로드 밸런서는 일정 횟수 이상 실패한 서버를 대상에서 제외하고, 다시 연속 성공하면 트래픽을 보내기 시작합니다.

이 과정이 자동화되어 있으므로 서버 장애가 발생해도 사용자는 다른 정상 서버를 통해 서비스를 계속 이용할 수 있습니다.

실제 운영에서는 timeout, interval, healthy/unhealthy threshold, drain 시간까지 함께 조정합니다.


Sticky Session과 세션 공유

세션 기반 인증에서 사용자의 세션이 서버 A의 메모리에 저장되어 있다면, 다음 요청이 서버 B로 가면 로그인 상태가 유지되지 않습니다.

세션이 서버 메모리에 있으면 분산과 장애 전환이 어려워진다

sticky는 임시 완충이고, Redis나 JWT는 상태 위치를 backend 밖으로 옮겨 장애 영향을 줄인다.

  1. server memory 구현

    단순 다른 서버로 이동하면 로그인 유실

  2. sticky 같

    사용자 요청을 같은 서버로 서버 장애와 hotspot에 취약

  3. Redis/session store backend

    교체 가능 공유 저장소 장애와 지연

  4. JWT 서버 상태

    줄임 폐기, 회전, 크기 관리 필요

방식서버 장애 시확장성구현 복잡도
Sticky Session인메모리 세션이면 소실 가능낮음 (불균형)낮음
Redis 세션 공유Redis가 정상이라면 유지높음중간 (Redis 운영)
JWT 토큰서버 교체 영향은 작음매우 높음중간 (폐기/회전 설계)

올바른 해결책은 세션을 외부 저장소에서 공유하거나 JWT 같은 토큰 기반 인증을 사용하는 것입니다.

다만 JWT도 만료 시간, refresh token, 강제 로그아웃, 키 회전, 토큰 탈취 대응까지 설계해야 합니다.

Sticky Session은 간단한 완충책일 수 있지만, 장기적으로는 서버 메모리에 사용자 상태를 묶지 않는 구조가 더 확장에 유리합니다.

로드 밸런서는 단순히 “요청을 나누는 장비”가 아니라, TLS 종료 지점, 장애 감지 기준, 세션 상태, 배포 중 drain 전략까지 함께 결정하는 운영 경계입니다.

로드 밸런서는 분산뿐 아니라 TLS, health, session, drain 경계를 정한다

운영에서 중요한 것은 정상 분산보다 배포와 장애 때 연결을 어떻게 보호하는지다.

  1. TLS 종단 위치

    인증서 갱신 책임 지정 handshake 실패와 SNI 불일치

  2. Health readiness

    liveness 분리 죽은 서버로 계속 분산

  3. Session sticky 한계 또

    외부 저장소 결정 로그인 상태 유실

  4. Drain 배포 중 새 요청

    차단 rolling update 때 reset/502 증가

로드 밸런서는 분산 방식, 헬스 체크, 세션 유지, 장애 전환 기준으로 점검합니다.

로드 밸런서 점검은 계층, 헬스, 세션, 장애 기준을 한 흐름으로 묶는다

L4/L7, 알고리즘, 헬스 체크, 세션, drain이 따로 놀면 장애 순간 사용자에게 바로 드러난다.

  1. 1 Layer

    Layer L4/L7와 TLS 종단 라우팅 정보 확인

  2. 2 Algorithm

    Algorithm 부하 신호 선택 요청 비용과 연결 수 비교

  3. 3 Health

    Health readiness 분리 제외와 복귀 기준

  4. 4 Session

    Session sticky 또는 외부화 장애 전환 가능성

  5. 5 Failure

    Failure reset, 502, timeout 관측 지표 연결

다음 절에서는 로드 밸런서와 함께 자주 등장하는 프록시와 VPN을 다루겠습니다.