티스토리 뷰

로드 밸런서

  • 서버나 장비의 부하를 분산(Load Balancing)하기 위해 사용하는 장비
  • ex) L4 스위치, ADC / AWS의 NLB, ALB / HAProxy

왜 로드 밸런서를 쓰는가?

 

로드 밸런서는 서버의 부하를 분산시키기 위해 사용한다. 그렇다면 왜 서버의 부하를 분산시켜야 할까?

 

서비스를 운영하는데 하나의 서버로도 무리 없이 운영할 수 있었다. 클라이언트로부터 요청이 들어오면 서버는 응답을 한다. 어느 날, 예상했던 요청보다 더 많은 요청이 들어왔다. 서버는 요청을 감당하지 못해 뻗어버리고 이는 곧 서비스 장애로 연결된다. 클라이언트는 원하는 리소스를 받지 못하게 되는 것이다.

 

그렇다면, 많은 요청이 들어와도 서버가 뻗지 않고 응답할 수 있는 방법은 없을까? 두 가지 해결책이 있다.
해당 서버의 성능을 업그레이드 시키거나(1개), 서버의 개수를 늘리거나(2,3,4개...)

서버의 성능을 업그레이드 시키는 확장 방법을 스케일 업, 서버의 개수를 여러 개로 늘려 요청을 분산시키는 확장 방법 스케일 아웃이라고 한다.

스케일 업 vs 스케일 아웃

스케일 업은 고성능의 하드웨어와 부품 추가가 되어야 하기 떄문에 가격의 부담이 있다. 또 한 대의 서버만 배치했을 경우 서버에 문제가 생기면 곧바로 서비스 장애로 이어진다. 스케일 아웃은 하드웨어 성능 자체는 스케일 업에 비해 떨어지더라도 여러 서버를 배치함으로써 요청을 분산시키고 한 서버에 문제가 생겨도 정상적인 다른 서버로 연결해줌으로써 서비스 장애를 방지한다.

 

  스케일 업(Scale-Up) 스케일 아웃(Scale-Out)
설명 하드웨어 성능 자체를 업그레이드하거나 더 높은 성능의 시스템으로 마이그레이션하는 방법 여러 대의 서버로 로드를 분산하는 방법.
서비스 자체를 구분해 나누거나 같은 서비스를 분산해 처리하는 방법이 있다
장점 부품을 쉽게 추가할 수 있으면 시스템 설계 변경 없이 서비스 사용량을 쉽게 늘릴 수 있다. 스케일 업 방식보다 더 적은 비용으로 시스템 확장이 가능하다. 여러 대의 시스템에 로드를 적절히 분산해 하나의 시스템에 장애가 발생하더라도 서비스에 미치는 영향이 없도록 결함허용을 구현할 수 있다.
단점 부품 추가가 어렵다. 시스템이 커질수록 비용이 기하급수적으로 증가한다. 스케일 아웃을 위해 별도의 복잡한 아키텍처를 이해하고 운영해야만 할 수 있다. 프로세스나 네트워크 장비가 추가로 필요할 수 있다.

 

 

스케일을 아웃시켜 여러 서버가 구성되었다. 그런데 이렇게 되니 클라이언트는 어느 서버로 요청을 보내야 할지 모르겠다. 실제 서버가 확장되더라도 클라이언트 입장에서는 하나의 서비스로 인식해야 할 필요가 있다. 이 때 로드 밸런서가 사용된다.

여러 서버 앞에 로드 밸런서를 배치해 클라이언트는 서비스에 사용되는 대표 IP(서비스 IP)에만 요청을 보낼 수 있도록 한다. 로드 밸런서는 받은 요청들을 각각의 서버로 할당해 부하를 분산한다.

  • 가상 서버(Virtual Server) : 사용자가 바라보는 실제 서비스
  • 가상 IP(Virtual IP, VIP) : 사용자가 접근해야 하는 서비스 IP 주소.
  • 리얼 서버(Real Server) : 실제 서비스를 수행하는 서버
  • 리얼 IP(Real IP, RIP) : 실제 서버의 IP

로드 밸런서는 무슨 일을 하는가?

로드 밸런서는 부하 분산 외에도 서비스 헬스 체크, 대용량 세션 처리를 할 수 있는 기능이 있다.

1. 부하 분산(Load Balancing)

로드 밸런싱은 서버의 부하(=Load)를 분산(=Balancing)해주는 기술이다. 로드 밸런싱의 종류는 L4 로드 밸런싱과 L7 로드 밸런싱이 있다. 일반적으로 로드 밸런서가 동작하는 방식이라고 하면 L4 로드 밸런싱을 의미한다. L4이므로 TCP, UDP 정보(특히 포트)를 기반으로 로드 밸런싱을 수행한다.

과정

  • 서버 #1은 http 서비스 데몬이 동작
  • 서버 #2은 http 서비스 데몬, https 서비스 데몬이 동작
  • 서버 #3은 https 서비스 데몬이 동작

  1. 클라이언트는 가상 IP(VIP)에 서비스를 요청한다.
  2. VIP는 리얼 서버들이 바인딩 되어 있다. 요청 정보에 따라 부하 분산 그룹을 설정한다. 부하 분산 그룹을 만드는 기준은 아래와 같다.
    • 3계층 정보인 IP 주소, 4계층 정보인 서비스 포트(로드 밸런서 - L4 스위치)
    • 위 조건에 7계층 정보가 추가(로드 밸런서 : L7 스위치)
  3. 부하 분산 알고리즘을 통해 그룹 중 어떤 리얼 서버로 요청을 보낼 것인지 선택한다.
  4. 선택된 서버의 IP로 목적지 IP를 변환하고 리얼 IP로 요청을 전달한다.

부하 분산 알고리즘

라운드 로빈(Round Robin)
  • 현재 구성된 장비를 순차적으로 돌아가면서 서비스를 요청하는 방식
  • 순차적으로 모든 장비에 분산 => 누적 세션 수는 같아진다.
최소 접속 방식(Least Connection)
  • 서버가 가진 세션 부하를 확인해서 현재 세션이 가장 적게 연결된 장비로 서비스를 요청하는 방식
  • 서비스 별로 세션 수를 관리하면서 부하를 분산하므로 장비에서 처리하는 활성화 세션 수가 비슷하다.
해시(Hash)
  • 해시 알고리즘을 이용해 얻은 결과값으로 어떤 장비로 서비스를 요청할지 결정
    • 알고리즘에 사용되는 값들은 주로 출발지 IP주소, 목적지 IP 주소, 출발지 서비스 포트, 목적지 서비스 포트를 사용한다.
  • 클라이언트가 같은 서버에 지속적으로 접속할 수 있다.
  • 서버의 부하는 고려하지 않는다.
  • 세션을 유지해야 하는 서비스에 적합한 분산 방식

2. 헬스 체크(Health Check)

로드 밸런서는 부하 분산을 하는 각 서버의 서비스가 정상인지 주기적으로 헬스 체크를 한다. 비정상적인 서버는 서비스 그룹에 제외시켜 트래픽을 보내지 않도록 처리한다.

ICMP

  • VIP에 연결된 리얼 서버에 대해 ping으로 헬스 체크를 수행한다.
  • 서버가 살아 있는지만 확인한다.

TCP 서비스 포트

  • 로드 밸런서에 설정된 서버의 서비스 포트로 SYN을 보내 헬스 체크를 수행한다.
  • 리얼 IP를 가진 서버로부터 SYN, ACK를 받으면 서버에 다시 ACK로 응답하고 FIN을 보내 헬스 체크를 종료한다.

HTTP 상태 코드

  • 웹 서비스를 할 때 서비스 포트는 TCP로 정상적으로 열리는데, 응답을 정상적으로 하지 못하는 경우 HTTP 상태 코드를 확인하여 헬스 체크를 수행한다.
  • 로드 밸런서가 서버로 3방향 핸드셰이크를 거치고 HTTP를 요청해 정상적인 상태 코드 응답(200 OK)인지 확인한다.

참고자료

'Infra' 카테고리의 다른 글

GitHub Actions 시작하기 - 구성요소  (0) 2024.04.07
[AWS] CloudFront?  (0) 2022.06.21
댓글