Load Balancer
클라우드 환경에서 로드 밸런서는 서비스의 안정성과 확장성을 보장하는 핵심 요소로 매우 중요하다.
이번 글에서는 로드밸런서의 부하 분산 방법과 헬스체크에 대해 알아보겠다.
1. 부하 분산
서비스 규모가 커지면 물리적 또는 가상 서버 한 대로는 모든 요청을 감당할 수 없게 된다. 설사 하나의 서버가 모든 요청을 처리할 수 있다고 해도 이는 단일 장애점(SPoF)이 되며, 이 경우 해당 서버에 문제가 발생하면 전체 서비스에 큰 영향을 미치게 된다. 이를 방지하고 서비스의 가용성을 높이기 위해, 일반적으로 하나의 서비스는 두 대 이상의 서버로 구성되며 각 서버의 IP도 다르게 설정한다. 다수의 서버가 있을 때 특정 서버에 장애가 발생하면 전체 사용자가 아닌 해당 서버와 연결된 일부 사용자에게만 영향을 주는 부분적 장애로 그칠 수 있다.
이러한 문제를 해결하기 위해 L4 또는 L7 스위치로 불리는 로드 밸런서를 사용한다. 로드 밸런서는 동일한 서비스를 제공하는 여러 서버를 등록해 두고, 사용자의 요청이 들어오면 각 요청을 여러 서버로 분산시켜 부하를 나눠준다. 대규모 서비스 운영을 위해 로드 밸런서는 필수적인 요소다. 로드 밸런서는 각 서버의 개별 IP가 아닌 서비스용 가상 IP(VIP)를 제공해 사용자들이 가상 IP를 통해 서버에 접속할 수 있도록 한다.
또한, 로드 밸런서는 서버의 상태를 지속적으로 체크하여 서비스가 가능한 서버에만 요청을 분산시킨다. 서버에 장애가 발생하더라도 다른 서버로 요청을 전달해 서비스를 지속할 수 있는 구조다.
2. FWLB
로드 밸런서는 서버에 대한 부하 분산뿐만 아니라 방화벽을 액티브-액티브 방식으로 구성하는 데도 사용된다. 서버 부하 분산을 SLB(Server Load Balancer), 방화벽 부하 분산을 FWLB(FireWall Load Balancer)라고 한다.
3. 부하 분산 방법
로드 밸런서는 가상 IP 주소를 사용해 각 애플리케이션 서버에 연결을 분산시킨다. 이를 위해 특정 가상 IP 주소와 포트 번호를 서버에 매핑하는데, 각 포트 번호에 연결된 서버 그룹을 활용해 사용자의 요청을 적합한 서버로 라우팅한다.
예를 들어, 서버 1번이 HTTP 서비스, 서버 2번이 HTTPS 서비스, 서버 3번이 HTTP와 HTTPS 모두를 지원한다고 가정하고, 가상 IP가 10.10.10.1인 경우 아래와 같이 구성할 수 있다:
서비스 IP | 서비스 포트 | 서버 |
---|---|---|
10.10.10.1 | HTTP (80) | 서버 #1, #2 |
10.10.10.1 | HTTPS (443) | 서버 #2, #3 |
각 서비스 IP와 포트에 따라 요청을 적절한 서버로 분산시킨다. 또한, 서버의 포트와 실제 서비스되는 포트가 달라도, 포트를 매핑하여 외부에서는 80번 포트로 접속하면서 서버 내부적으로는 다른 포트를 사용할 수 있다.
4. 헬스 체크
로드 밸런서는 각 서버의 상태를 주기적으로 확인하기 위해 헬스 체크(Health Check)를 수행한다.
서버의 서비스 포트를 확인하며, 기본적인 방법은 로드 밸런서에서 서버로 SYN 패킷을 보내고 서버로부터 SYN과 ACK 응답을 받은 후 ACK와 FIN을 보내 헬스 체크를 완료하는 방식이다. 보다 빠른 헬스 체크를 위해 RST 패킷만 전송하는 방식도 있다.
웹 서비스의 경우, 서버의 서비스 포트가 열려 있어도 정상적으로 웹 응답을 반환하지 못할 수 있기 때문에 상태 코드(200 OK) 응답 여부도 헬스 체크에 포함시킬 수 있다.
5. 헬스 체크 주기와 타이머
- 주기(Interval): 서버로 헬스 체크 패킷을 보내는 간격
- 응답 시간(Response): 서버의 응답을 기다리는 시간, 이 시간 내에 응답이 없으면 실패로 간주
- 시도 횟수(Retries): 응답이 없을 시 재시도하는 횟수
- Timeout: 헬스 체크 실패 시 최대 대기 시간
- 서비스 다운 시 주기(Dead Interval): 서버가 다운되었을 때 헬스 체크 주기
6. 부하 분산 알고리즘
- Round Robin: 모든 서버에 순차적으로 요청을 분산하는 방식. 총 세션 수는 동일하지만 각 서버의 활성 세션 수는 다를 수 있다.
- Least Connection: 활성 세션 수가 가장 적은 서버로 요청을 분산한다.
- Weighted Round Robin: 각 서버에 가중치를 부여해 가중치가 높은 서버에 더 많은 요청을 할당한다.
- Weighted Least Connection: 서버의 가중치와 활성 세션 수를 기준으로 부하를 분산한다.
Hash 방식
Hash 방식은 클라이언트의 요청을 동일한 서버로 연결하기 위한 부하 분산 방식이다. 출발지 IP, 목적지 IP, 서비스 포트 등을 해시로 계산하여 항상 동일한 서버로 라우팅되도록 한다. 이를 통해 특정 사용자가 같은 서버에 지속적으로 접속할 수 있도록 설정할 수 있으며, 주로 테스트 시 많이 사용된다.