본문으로 건너뛰기

버그 제보

이상한 점을 알려 주시면 고칠게요. 지금 보고 있는 페이지와 브라우저 정보가 함께 담겨요.

페이지:

Backend

로드 밸런서

작성 2026. 11. 1.추가
목차13개 항목
출처와 참고

ByteByteGo의 System Design 101 가이드 「What is a Load Balancer?」, 「Key Use Cases for Load Balancers」, 「Load Balancer Realistic Use Cases」, 「Top 6 Load Balancing Algorithms」를 바탕으로, 패킷 전달 방식과 로드 밸런서 이중화는 「L4/L7 스위치의 대안, 오픈 소스 로드 밸런서 HAProxy」로 보강해 재구성한 노트다. 배치 토폴로지, L4 구현 방식, 제어 평면 부분은 Matt Klein의 「Introduction to modern network load balancing and proxying」 번역 「네트워크 로드 밸런싱 및 프록시 소개」를 바탕으로 보강했다. 「DNS 라운드 로빈」은 jbee의 「Interview Question for Beginner」 네트워크 문서를 바탕으로 보강했다. karanpratapsingh의 「System Design」 강의 저장소를 바탕으로 요청을 나누는 기준, 최소 대역폭 알고리즘, 흔히 기대하는 부가 기능, 클러스터링과의 차이를 보강했다.

로드 밸런서란

로드 밸런서(load balancer)는 들어오는 트래픽을 여러 서버에 나눠 보내는 장치나 소프트웨어다. 클라이언트는 로드 밸런서의 주소 하나만 알고, 그 뒤에 서버가 몇 대 있는지, 어느 서버가 죽었는지는 모른다.

flowchart LR
  c["클라이언트"] --> lb["로드 밸런서"]
  lb --> a["서버 A<br/>healthy"]
  lb --> b["서버 B<br/>healthy"]
  lb --x cc["서버 C<br/>unhealthy → 풀에서 제외"]

서버 한 대로 버티는 수직 확장에는 한계가 있다. 로드 밸런서는 같은 서버를 여러 대 두는 수평 확장을 가능하게 하는 첫 부품이다.

하는 일

기능설명
트래픽 분산요청을 여러 서버에 고르게 나눠 한 서버에 몰리지 않게 한다
헬스 체크서버에 주기적으로 요청을 보내 응답이 정상인 서버에만 트래픽을 보낸다
장애 우회(고가용성)죽거나 느려진 서버를 풀에서 빼고 남은 서버로 돌린다. 서버 몇 대가 문제여도 서비스는 이어진다
수평 확장서버를 풀에 더하기만 하면 트래픽이 새 서버로도 간다. 오토스케일링과 짝을 이룬다
TLS 종료(SSL termination)암호화·복호화를 로드 밸런서가 맡아 뒤 서버의 CPU 부담을 던다
세션 고정(sticky session)같은 사용자의 요청을 같은 서버로 보낸다. 서버 메모리에 세션을 두는 앱에 필요하다
플랫폼·경로별 라우팅모바일과 데스크톱 요청, /api와 /static을 서로 다른 백엔드로 보낸다 (L7)
영역 간 분산(cross-zone)여러 가용 영역·지역에 걸쳐 나눠, 한 영역이 통째로 죽어도 버틴다

로드 밸런서는 사용자와 웹 서버 사이 한 곳에만 두지 않는다. 웹 서버와 내부 서비스, 서비스와 DB·캐시 사이처럼 계층마다 두어야 각 계층이 따로 늘고 이중화된다(웹 확장성의 구성 요소).

무엇을 보고 나누나

기준보는 것예
호스트 기반요청의 호스트 이름api.example.com은 API 서버 풀로, www.example.com은 웹 서버 풀로
경로 기반호스트를 넘어 URL 경로 전체/images/*는 이미지 서버로, /checkout/*는 결제 서버로
내용 기반요청 메시지 내용(파라미터 값, 헤더, 본문)특정 파라미터 값이나 고객 등급에 따라 다른 풀로

셋 다 요청을 열어 봐야 하므로 L7에서만 된다.

흔히 기대하는 부가 기능

기능하는 일
오토스케일링 연동수요에 따라 서버를 늘리고 줄인 결과를 풀에 반영한다
지속 연결WebSocket처럼 오래 가는 연결을 같은 서버에 붙여 둔다
인증서서버 인증서를 내보이고, 필요하면 클라이언트 인증서도 검증한다(mTLS, HTTPS와 TLS)
압축·캐시응답을 압축하고, L7이면 응답을 캐시한다
로그·요청 추적요청·응답 메타데이터를 남기고, 요청마다 고유 ID를 붙여 여러 서비스에 걸친 흐름을 추적한다
리다이렉트·고정 응답경로에 따라 다른 주소로 보내거나(HTTP → HTTPS), 백엔드까지 가지 않고 정해진 응답(점검 안내, 오류 페이지)을 돌려준다

세션 고정은 편하지만 특정 서버에 부하가 쏠리고, 그 서버가 죽으면 세션이 사라진다. 세션을 Redis 같은 외부 저장소에 두거나 토큰 방식으로 바꾸면 고정 없이도 어느 서버로 가도 된다(세션과 토큰 인증).

L4와 L7

구분L4 (전송 계층)L7 (응용 계층)
보는 정보IP 주소, TCP/UDP 포트HTTP 메서드, URL 경로, 헤더, 쿠키
HTTP 해석하지 않는다. 패킷·연결 단위로 넘긴다요청을 열어 보고 판단한다
속도빠르고 가볍다해석 비용이 든다
할 수 있는 일연결 분산, TCP·UDP 아무 프로토콜이나경로·헤더 기반 라우팅, TLS 종료, 쿠키 기반 고정, 요청 재작성
클라우드 예AWS NLBAWS ALB

L4는 연결 단위로 나누기 때문에 HTTP/2·gRPC처럼 연결 하나에 요청 여러 개를 오래 실어 나르는 프로토콜과 맞지 않는다. 무거운 클라이언트의 긴 연결 하나가 서버 한 대에 계속 붙어 있게 된다. L7은 연결 안의 요청·스트림 단위로 나누고, 재시도·서킷 브레이커·레이트 리밋까지 할 수 있다.

규모가 큰 시스템은 앞단에 L4를 두고 그 뒤에 L7(또는 API 게이트웨이)을 두는 식으로 겹쳐 쓴다. 작은 서비스는 L7 하나로 충분하다. OSI 계층 자체는 OSI 7계층에 있다.

형태

형태설명예
하드웨어전용 장비. 높은 처리량, 비싸고 늘리기 어렵다. 제조사 펌웨어라 보안 패치·업데이트를 장비 단위로 챙겨야 하고, 설정 자유도가 낮다F5 같은 어플라이언스
소프트웨어일반 서버·VM·컨테이너에 설치Nginx, HAProxy, Envoy
클라우드 관리형클라우드가 운영하고 자동으로 확장된다AWS Elastic Load Balancing, Google Cloud Load Balancing, Azure Load Balancer
GSLB (Global Server Load Balancing)여러 지역의 데이터 센터 사이에서 나눈다. 보통 DNS나 애니캐스트로 구현지역 장애 대비, 가까운 리전으로 보내기(DNS 라우팅 정책)

DNS 라운드 로빈

로드 밸런서 없이 한 도메인에 A 레코드를 여러 개 두고, DNS 서버가 질의마다 IP 순서를 돌려 주는 가장 단순한 분산이다. 장비가 필요 없지만 한계가 분명하다.

한계이유
서버마다 공인 IP가 필요하다클라이언트가 서버 IP로 직접 접속한다
고르게 나뉘지 않는다통신사 리졸버·프록시·브라우저·OS가 응답을 TTL 동안 캐시해, 같은 캐시 뒤의 사용자는 모두 같은 서버로 간다
장애를 모른다DNS는 서버의 부하나 생사를 보지 않아 죽은 서버 IP도 계속 준다. TTL을 줄여도 캐시가 다 사라질 때까지 일부 요청은 실패한다
세션 유지가 어렵다다음 질의에서 다른 서버로 갈 수 있다

그래서 DNS 단계에서는 가중치 응답, 헬스 체크와 연동한 장애 조치, 지역 기반 응답(Route 53 같은 관리형 DNS의 라우팅 정책)으로 단점을 보완하고, 데이터 센터 안의 세밀한 분산은 로드 밸런서가 맡는다.

분산 알고리즘

분산 알고리즘은 서버 상태를 보지 않고 정해진 규칙대로 나누는 정적(static) 알고리즘(라운드 로빈, 고정 라운드 로빈, 가중 라운드 로빈, 해시)과, 연결 수·응답 시간 같은 실시간 상태를 보는 동적(dynamic) 알고리즘(최소 연결, 최소 응답 시간)으로 나뉜다. 정적 알고리즘은 단순하고 빠르지만 서버가 무상태여야 고르게 나뉜다.

알고리즘방식어울리는 곳
라운드 로빈차례대로 돌아가며 보낸다서버 성능과 요청 비용이 비슷할 때
고정(sticky) 라운드 로빈한 사용자의 첫 요청이 간 서버로 이후 요청도 계속 보낸다세션을 서버 메모리에 둔 서비스. 부하가 한 서버에 쏠릴 수 있다
가중 라운드 로빈서버마다 비중을 두고 돌린다사양이 다른 서버가 섞여 있을 때, 새 버전에 일부만 보낼 때
최소 연결현재 연결이 가장 적은 서버로요청마다 처리 시간이 크게 다를 때, WebSocket처럼 연결이 오래 갈 때
최소 응답 시간응답이 가장 빠른 서버로서버 상태가 들쭉날쭉할 때
최소 대역폭지금 흘리는 트래픽(Mbps)이 가장 적은 서버로요청마다 주고받는 데이터 양이 크게 다를 때(파일 전송, 미디어)
IP 해시·일관 해시클라이언트 IP나 키의 해시로 서버를 정한다같은 클라이언트를 같은 서버로, 캐시 서버 분산

헬스 체크와 서비스 디스커버리

기능방식
서비스 디스커버리뒤에 어떤 서버가 있는지 알아낸다. 정적 설정, DNS, ZooKeeper·etcd·Consul, Envoy의 xDS 같은 동적 API
능동 헬스 체크정해진 주기로 서버에 요청(/health)을 보내 본다
수동 헬스 체크실제 트래픽의 결과(연속 연결 실패, 5xx 연속 발생)로 이상을 추론해 잠시 풀에서 뺀다(이상치 감지)

동적 알고리즘 중 두 개 골라 덜 바쁜 쪽(power of two choices) 은 무작위로 서버 둘을 뽑아 부하가 적은 쪽에 보내는 방식이다. 모든 서버의 상태를 비교하지 않아도 쏠림이 크게 줄어 프록시가 여러 대일 때 특히 잘 맞는다.

L4 로드 밸런서의 구현 방식

방식동작특징
종료(termination)클라이언트 연결을 받아 끝내고 서버로 새 연결을 연다단순하다. 손실이 많은 구간 가까이에서 연결을 끊어 주면 성능에 유리하다
패스스루(passthrough)연결을 끝내지 않고 연결 추적과 NAT로 패킷만 넘긴다메모리·CPU가 적게 들고, 혼잡 제어를 서버가 그대로 한다
DSR(Direct Server Return)요청만 로드 밸런서를 지나고 응답은 서버가 클라이언트로 바로 보낸다(GRE 캡슐화 등)응답이 요청보다 훨씬 큰 서비스에서 로드 밸런서 용량을 아낀다. 서버도 설정에 참여해야 한다
  • 패스스루의 NAT 방식은 목적지 IP를 가상 IP(VIP)에서 실제 서버 IP로 바꾸고, 응답이 로드 밸런서를 지날 때 출발지를 다시 VIP로 바꾼다. 응답까지 로드 밸런서가 감당한다.
  • DSR은 같은 L2 망이면 IP는 두고 MAC 주소만 바꿔 넘기고(서버는 VIP를 루프백에 둔다), 망이 다르면 IP-in-IP·GRE 터널로 캡슐화해 넘긴다.
  • 종료 방식(L7 프록시 포함)에서는 서버에 로드 밸런서 IP가 보인다. 원래 클라이언트 IP는 X-Forwarded-For 헤더나 PROXY 프로토콜로 넘기고 서버가 그것을 읽게 설정한다(프록시: 포워드 프록시와 리버스 프록시). L7의 세션 고정은 응답에 서버 식별 쿠키를 붙이고 다음 요청에서 그 쿠키로 같은 서버를 고르는 식이다.

고가용성은 두 가지로 만든다.

  • 액티브·스탠바이 쌍: 두 대가 상태를 공유하고 한 대는 대기한다. 단순하지만 용량 절반이 놀고 확장이 어렵다. 소프트웨어 로드 밸런서(HAProxy 등)는 보통 keepalived의 VRRP로 하트비트를 주고받다가, 액티브가 응답하지 않으면 스탠바이가 VIP를 넘겨받는다(고가용성 이중화 구조와 장애 감지).
  • ECMP + 일관 해시 클러스터: 라우터가 ECMP로 여러 로드 밸런서에 흐름을 나누고, 각 로드 밸런서는 일관 해시로 같은 흐름을 같은 서버에 보낸다. 상태 공유 없이 수평 확장되고 여러 대가 죽어도 버틴다. Google Maglev, AWS NLB가 이 계열이다.

L7 프록시는 보통 상태 없이 여러 대를 나란히 두어 확장한다. 그래서 큰 시스템은 앞단 L4 클러스터(대량 트래픽·DDoS 흡수) + 뒤의 L7 프록시의 2단 구성을 많이 쓴다.

배치 토폴로지

토폴로지위치장단점
미들 프록시클라이언트와 서버 사이의 중앙 장비·소프트웨어(HAProxy, Nginx, Envoy, 클라우드 LB)쓰기 쉽다. 단일 장애 지점·병목이 되고, 문제가 생기면 어디서 막혔는지 보기 어렵다
엣지 프록시인터넷에 노출된 미들 프록시TLS 종료, 레이트 리밋, 인증을 더해 외부 트래픽의 관문이 된다
클라이언트 내장 라이브러리서비스 코드 안(gRPC 클라이언트 등)중앙 병목이 없고 가장 빠르다. 언어마다 구현해야 하고, 업그레이드를 모든 서비스에 배포해야 한다
사이드카 프록시서비스 옆에 붙은 별도 프로세스(Envoy, Linkerd)라이브러리의 장점을 언어와 무관하게 얻는다. 약간의 지연이 더해진다. 서비스 메시의 바탕이다

서비스 간 트래픽은 사이드카(서비스 메시)로, 외부 트래픽은 엣지 프록시로 받는 구성이 흔하다. 이때 프록시들은 데이터 평면이 되고, 설정·라우팅 규칙·인증서를 내려 주고 상태를 모으는 중앙 제어 평면(Istio의 istiod 등)이 따로 선다. 존 장애 시 자동 우회, 전역 정책 적용, 이상 탐지를 제어 평면이 맡는다(분산 시스템의 통신·데이터 흐름 패턴).

클러스터링과 무엇이 다른가

로드 밸런서 뒤의 서버들은 서로를 모른다. 각자 받은 요청만 처리한다. 클러스터(cluster)의 노드들은 서로를 알고 협력해 하나의 시스템처럼 동작한다(리더 선출, 상태 공유, 데이터 복제). 둘은 함께 쓰인다. 액티브-액티브 클러스터 앞에는 보통 로드 밸런서가 서고, 독립된 웹 서버 여러 대처럼 클러스터가 아닌 서버에도 로드 밸런싱은 쓸 수 있다. 클러스터의 종류와 구성은 고가용성 이중화 구조에 있다.

정리

  • 로드 밸런서는 트래픽 분산, 헬스 체크로 장애 우회, 수평 확장을 맡는다.
  • L4는 IP·포트만 보고 빠르게, L7은 HTTP를 열어 보고 똑똑하게 나눈다.
  • 세션 고정은 최후의 수단이다. 상태를 서버 밖으로 빼면 어느 서버로 가도 된다.
  • 리버스 프록시·API 게이트웨이와 겹치는 기능이 많다. 차이는 API 게이트웨이에 정리했다.

관련 노트: API 게이트웨이, 프록시: 포워드 프록시와 리버스 프록시, 웹 확장성의 구성 요소, 대규모 트래픽에서 서비스를 지키는 설계, 쿠버네티스 위 웹 서비스의 요청 경로

원본 기록8

댓글

GitHub 계정으로 댓글을 남길 수 있어요.