로드 밸런싱(Load Balancing)에 대해 알아보자

사용자가 한두명인 서버에서 부하가 발생할까? 아마 그럴 확률은 매우 적을 것이다. 하지만 만약 사용자가 수만명, 수십만명으로 늘어난다면 서버는 안정적으로 동시 요청을 처리하기 어려울 것이다.

이러한 경우 서버의 개수를 늘려서 사용할 수 있는데 (scale out), 여러 요청이 들어왔을 때 어떤 서버에서 요청을 보낼지 결정하는 것을 로드밸런싱이라고 한다.

1. 로드 밸런싱 (Load Balancing) 이란?

로드밸런싱이란, 서버나 네트워크 리소스의 부하를 여러 서버나 장치로 분산시키는 기술이다. 로드밸런싱은 웹 서비스, 데이터베이스, 이메일 서비스 등 다양한 애플리케이션에서 사용된다.

이때 여러 서버나 장치로 분산시키는 역할을 하는 것이 바로 로드 밸런서 (Load Balancer) 이다.

image

2. 로드 밸런서 (Load Balancer)

트래픽 분배

  • 클라이언트의 요청을 여러 서버에 고르게 분배하여 각 서버의 부하를 줄인다.
  • 이때, 다양한 분배 알고리즘을 사용하여 최적의 서버에 트래픽을 분배한다. ** 분배 알고리즘은 아래에서 더 자세히 알아보자.

고가용성

  • 특정 서버에 장애가 발생할 경우, 정상 동작하는 서버로 트래픽을 분배한다.
  • 헬스체크: 주기적으로 각 서버의 상태를 확인하며, 비정상적인 서버를 감지한다.

보안 강화

  • DDoS 방어: 대규모 트래픽 공격(DDoS)을 방어하는 데 도움을 주며, 트래픽 필터링을 통해 악의적인 요청을 차단할 수 있다.

성능 최적화

  • 캐싱: 자주 요청되는 데이터를 캐싱하여 응답 시간을 줄이고 서버 부하를 줄인다.
    • 자주 요청되더라도 캐싱하면 안되면 어떻게 해야하지? -> 로드밸런서는 특정 요청을 캐싱에서 제외할 수 있는 기능을 제공한다.
  • 압축: 트래픽을 압축하여 네트워크 대역폭을 효율적으로 사용한다.
    • 트래픽 압축: 전송되는 데이터의 크기를 압축 -> 네트워크 지연을 줄일 수 있다.
  • SSL 종료: 로드밸런서가 SSL 암호화를 처리하여 백엔드 서버의 부담을 줄인다.

3. 로드 밸런싱 종류

DNS 기반 로드 밸런싱

도메인 이름 시스템(DNS)을 기준으로 분산시키는 방식이다.

image

에를 들어 웹 서버가 있다고 가정했을 때, 여러 대의 웹 서버는 자신만의 공인 IP를 가지고 있다. 사용자가 웹 서비스에 접속하기 위해 도메인 주소를 브라우저에 입력하면, DNS는 도메인의 정보를 조회하는데 이때 여러 웹 서버 중 특정 알고리즘을 통해 하나의 웹 서버 IP 주소를 선택하여 사용자에게 알려주는 방식이다.

DNS를 통해 IP 주소를 반환하는 과정에서 로드 밸런싱이 이루어지기 때문에 애플리케이션 계층(7 Layer)에서 로드 밸런싱이 이루어지는 것을 알 수 있다.

장단점

  • 설정이 간단하고, 네트워크 계층에 구애받지 않는다.

  • 전 세계적으로 분산된 데이터 센터에 적합하다.

  • DNS 캐싱 때문에 부하 분산이 실시간으로 반영되지 않는다.

  • 장애 발생 시 자동으로 서버를 제외하는 기능이 부족한다.

하드웨어 로드 밸런싱

전용 하드웨어 장비를 사용하여 트래픽을 분산시키는 방법이다. 고성능의 전용 로드 밸런서 장비가 트래픽을 분석하고 분배한다.

image

장단점

  • 매우 높은 성능과 안정을 제공한다.

  • 비용이 매우 높다.

소프트웨어 로드 밸런싱

소프트웨어를 사용하여 트래픽을 분산시키는 방법이다. 오픈소스나 상용 소프트웨어를 주로 사용한다.

장단점

  • 유연하고 다양한 설정이 가능하다.

  • 상대적으로 비용이 저렴하다.

  • 서버 자원을 사용하기 때문에 추가적인 부하가 발생할 수 있다.

ex) Nginx, HAProxy, Apache HTTP Server

클라우드 로드 밸런싱

클라우드 서비스 제공자가 제공하는 로드 밸런싱 서비스를 사용하는 방법이다. 예를 들어 Google Cloud를 사용하면, Google Cloud Load Balancing이 직접 로드밸런싱을 하는 것이다.

장단점

  • 확장성과 유연성이 좋다.

  • 설정과 관리가 간편한다.

  • 클라우드 제공자에게 종속될 수 있다.

  • 사용량에 따라 비용이 발생할 수 있다.

ex) AWS Elastic Load Balancing(ELB), Google Cloud Load Balancing, Azure Load Balancer

L4 로드 밸런싱 (Transport Layer)

네트워크의 전송 계층(4 Layer) 에서 트래픽을 분산시키는 방법이다. IP / Port 를 기준으로 패킷 단위로 부하를 분산한다.

작동 방식

클라이언트가 특정 서비스에 접속하려고 할 때, 클라이언트의 요청은 먼저 L4 로드 밸런서로 전달된다. 이 요청은 IP 패킷의 형태로 전송되는데, L4 로드밸런서는 IP 주소와 포트 번호를 기반으로 요청을 처리한다.

IP 정보만 사용하기 때문에, 세션 유지가 어려워 다음과 같은 문제가 발생할 수 있다.

1
2
로그인 요청 > 서버 A로 전달
다음 요청 전달 > 서버 B로 전달 > 서버 B가 클라이언트의 세션 정보를 알지 못해, 다시 로그인해야 할 수도 있음

image

따라서 이러한 문제를 해결하기 위해 IP 주소를 고정하거나 세션 저장소를 사용할 수 있다.

IP 주소 고정

동일한 클라이언트 IP 주소에서 오는 모든 요청을 동일한 서버로 전달하는 방식이다. 하지만, NAT 환경에서 여러 클라이언트가 동일한 IP 주소를 공유할 때 한 서버에만 부하가 가기 때문에 문제가 발생할 수 있다.

세션 저장소

세션 정보를 중앙 저장소(DB, Redis)에 저장하여 모든 서버가 동일한 세션 정보를 공유할 수 있도록 하는 방법이다. 이렇게 하면 클라이언트가 어느 서버에 연결되든 동일한 세션 정보를 사용할 수 있습니다.

또한, L4 로드 밸런싱은 네트워크 전송 계층에서 작동하기 때문에 어플리케이션 계층의 복잡한 로직을 처리할 수 없다. 일부 어플리케이션은 요청 내용에 따라 트래픽을 특정 서버에 라우팅해야할 수 있다. HTTP 헤더, 쿠키와 같은 내용을 기반으로 트래픽을 라우팅하는 경우인데, L4 로드 밸런서를 해당 내용을 인식하지 못해, 세부적인 라우팅 결정을 내릴 수 없다.

장단점

  • 매우 빠르고 효율적이다.

  • 패킷 레벨에서 동작하여 높은 성능을 제공한다.

  • 세션 유지가 어렵다.

  • 어플리케이션 계층의 복잡한 로직을 처리하지 못한다.

L7 로드 밸런싱 (Application Layer)

L7 로드 밸런싱은 어플리케이션 계층에서 트래픽을 분산시키는 방법이다. HTTP, HTTPS, FTP 등의 프로토콜을 기반으로 트래픽을 분산시킨다.

작동 방식

L7 로드 밸런싱은 패킷의 애플리케이션 계층 정보를 분석해야 하기 때문에 L4 로드 밸런싱보다 속도가 느릴 수 있다. 하지만, 세밀한 트래픽 분배가 가능하다.

그래서 예를 들어, 결제 서비스 / 배송 서비스 / 상품 정보 서비스 와 같이 서비스별로 로드밸런싱이 가능한다.

image

장단점

  • 요청 내용을 기반으로 세밀한 트래픽 분배가 가능하다.

  • 쿠키, URL, 헤더 등을 기반으로 트래픽을 분산시킬 수 있다.

  • L4 로드 밸런싱보다 성능이 낮을 수 있다.

  • 설정이 복잡할 수 있다.

4. 로드 밸런싱 알고리즘

  • 라운드 로빈(Round Robin): 서버 리스트를 순차적으로 순환하며 요청을 분배한다.
  • 가중 라운드 로빈(Weighted Round Robin): 각 서버에 가중치를 부여하여, 가중치에 비례해 요청을 분배한다.
  • 최소 연결(Least Connections): 현재 가장 적은 연결을 가지고 있는 서버에 요청을 분배한다.
  • 가중 최소 연결(Weighted Least Connections): 각 서버의 가중치와 현재 연결 수를 고려하여 요청을 분배한다.
  • IP 해시(IP Hash): 클라이언트의 IP 주소를 해시하여 특정 서버에 요청을 분배한다.