IT 엔지니어를 위한 네트워크

로드밸런서(Load Balancer) - Part 2 (헬스체크/Health check)

지기(ZIGI) 2023. 3. 19. 20:31

Today Keys :    로드밸런서, L4, L7, 부하분산, Load Balancer, Load Balancing, 가용성, 이중화, SLB, 헬스체크, health, LB

본 포스팅은 'IT 엔지니어를 위한 네트워크 입문' [길벗] 서적에 포함된 '12. 로드밸런서'의 내용 중 소개 및 12.3장의 내용입니다


 

12.3. 헬스 체크

로드 밸런서를 통해 서비스하는 그룹의 서버에 장애가 발생하면 어떻게 될까요? 혹시 서비스가 정상적으로 되지 않는 서버로 서비스를 분산해 일부 사용자에게 서비스되지 않는 경우가 발생하 지 않을까요? 물론 그런 경우는 발생하지 않습니다.로드 밸런서에서는 부하 분산을 하는 각 서버 의 서비스를 주기적으로 헬스 체크(Health Check)해 정상적 인 서 비스 쪽으로만 부하를 분산하고 비 정상적인 서버는 서비스 그룹에서 제외해 트래픽을 보내지 않습니다. 서비스 그룹에서 제외된 후 에도 헬스 체크를 계속 수행해 다시 정상으로 확인되면 서비스 그룹에 해당 장비를 다시 넣어 트 래픽이 서버 쪽으로 보내지도록 해줍니다.

 

12.3.1 헬스체크방식

로드 밸런서는 다양한 헬스 체크 방식으로 서버의 서비스 정상 여부를 판단할 수 있습니다. 이번 장에서는 헬스 체크 방식 중 자주 사용되는 몇 가지를 알아보겠습니다.


12.3.1.1 ICMP

VIP에 연결된 리얼 서버에 대해 ICMP(ping)로 헬스 체크를 수행하는 방법입니다. 단순히 서버가 살아 있는지 여부만 체크하는 방법이므로 잘 사용하지 않습니다.

 

12.3.1.2 TCP 서비스 포트

가장 기본적인 헬스 체크 방법은 로드 밸런서에 설정된 서버의 서비스 포트를 확인하는 것입니 다. 즉,로드 밸런서에서 서버의 서비스 포트 2000번을 등록했다면 로드 밸런서에서는 리얼 IP의 2000번 포트로 SYN을 보내고 해당 리얼 IP를 가진 서버로부터 SYN, ACK를 받으면 서버에 다 시 ACK로 응답하고 FIN을 보내 헬스 체크를 종료합니다. 서비스 포트를 이용해 헬스 체크를 할 때는 실제 서비스 포트가 아닌 다른 서비스 포트로도 가능합니다.

 

12.3.1.3 TCP 서비스 포트: Half Open

일반 TCP 서비스 포트를 확인할 때는 SYN/SYN,ACK/ACK까지 정상적인 3방향 핸드셰이크를 거치게 됩니다. 헬스 체크로 인한 부하를 줄이거나 정상적인 종료 방식보다 빨리 헬스 체크 세션 을 끊기 위해 정상적인 3방향 핸드셰이크와 4방향 핸드셰이크가 아닌 TCP Half Open(절반 개 방) 방식을 사용하기도 합니다. TCP Half Open 방식은 초기의 3방향 핸드셰이크와 동일하게 SYN을 보내고 SYN, ACK를 받지만 이후 ACK 대신 RST를 보내 세션을 끊습니다.

 

12.3.1.4 HTTP 상태코드

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

 

12.3.1.5 콘텐츠 확인(문자열 확인)

로드 밸런서에서 서버로 콘덴츠를 요청하고 응답받은 내용을 확인하여 지정된 콘덴츠가 정상적으 로 응답했는지 여부를 확인하는 헬스 체크 방법도 있습니다. 보통 특정 웹페이지를 호출해 사전에 지정한 문자열이 해당 웹페이지 내에 포함되어 있는지를 체크하는 기능입니다. 이 헬스 체크 방식 을 사용하면 로드 밸런서에서 직접 관리하는 서버의 상태뿐만 아니라 해당 서버의 백엔드(리얼 서 버가 웹 서버인 경우,WAS 서버나 데이터베이스가 백엔드)의 상태를 해당 웹페이지로 체크할 수 있습니다. 앞단의 서버가 백엔드로 요청을 하고 백엔드에서 정상적인 결왓값으로 웹 페이지에 특 정 문자열을 출력하게 해 백엔드 상태까지 확인하면서 헬스 체크를 수행하는 것입니다.

다만 한 가지 유의사항은 단순히 서버에서 응답받은 문자열만 체크하면 정상적인 요청 결긧:값이 아닌 문자열만 체크하므로 비정상적 인 에러 코드에 대한 응답인 경우라도 해당 응답 내용에 헬스 체크를 하려고 했던 문자열이 포함되어 있으면 헬스 체크를 정상으로 판단할 수 있다는 것입니다. 따라서 문자열을 이용한 헬스 체크를 수행할 때는 정상 코드 값도 중복으로 확인하거나 문자열 자 체를 일반적이 아닌 특정 문자열로 지정해 결과가 정상일 때만 헬스 체크가 성공할 수 있도록 해 야합니다.

 


참고

3방향 vs 4방향 연결 종료(Close)

앞에서 다룬 헬스 체크 방식에서는 4방향 핸드셰이크로 연결을 종료했지만 경우에 따라 다음과 같이 3방향 핸드셰이크로 연결을 종료하기도 합니다.

 

다양한 헬스 체크 방법

여기서 다루지 않은 다양한 헬스 체크 방법이 있습니다. 대부분의 로드 밸런서가 사전에 정의된 다양한 헬스 체크 방식을 지원하므로 서비스에 적합한 헬스 체크 방식을 선택하면 됩니다.

 

 

 

 

12.3.2 헬스체크주기 와 타이머

다음은 헬스 체크 방법 외에 헬스 체크의 주요 고려사항인 헬스 체크 주기에 대해 알아보겠습니 다. 헬스 체크 주기를 볼 때는 응답 시社 시도 횟수,타임아웃 등 다양한 타이머를 함께 고려해야 합니다. 주요 타이머 값은 다음과 같습니 다.

  • 주기 (Interval)
    로드 밸런서에서 서버로 헬스 체크 패킷을 보내는 주기
  • 응답 시간(Response)
    로드 밸런서에서 서버로 헬스 체크 패킷을 보내고 응답을 기다리는 시간 해당 시간까지 응답이 오지 않으면 실패로 간주
  • 시도 횟수(Retries)
    로드 밸런서에서 헬스 체크 실패 시 최대 시도 횟수 최대 시도 횟수 이전에 성공 시 시도 횟수는 초기화됨
  • 타임아웃(Timeout)
    로드 밸런서에서 헬스 체크 실패 시 최대 대기 시간
    헬스 체크 패킷을 서버로 전송한 후 이 시간 내에 성공하지 못하면 해당 서버는 다운
  • 서비스 다운 시의 주기(Dead Interval)
    서비스의 기본적 인 헬스 체크 주기가 아닌,서비스 다운 시의 헬스 체크 주기 서비스가 죽은 상태에서 헬스 체크 주기를 별도로 더 늘릴 때 사용

 

실제 헬스 체크와 관련해 다양한 타이머 값이 있지만 주요 타이머 값으로 헬스 체크 타이머가 어 떻게 동작하는지 알아보겠습니다.

다음 그림은 헬스 체크를 수행하는 주기와 타이머를 시각화한 것입니다.

 

 

모양은 로드 밸런서에서 서버로 헬스 체크 패킷을 보내는 시점을 나타냅니다. 헬스 체크 주기 시간마다 로드 밸런서는 서버로 헬스 체크 패킷을 전송합니다. 주기가 3초로 설정되었다면 3초마 다 헬스 체크 패킷을 서버로 전송합니다. 이때 원 모양 사이의 시간이 3초가 됩니다.

마름모 모양은 로드 밸런서가 보낸 헬스 체크 패킷에 대한 서버의 응답을 최대로 기다리는 시간입 니다. 응답 시간으로 설정된 시간 내에 서버에서 응답이 오지 않으면 로드 밸런서는 해당 헬스 체 크 시도를 실패로 처리합니다. 응답 시간을 1초로 주었다면 원 모양의 헬스 체크 패킷 전송 이후 1초 내에 서버에서 응답을 수신해야 합니다. 이때 유의사항은 헬스 체크 패킷을 보내는 주기(시 간)를 응답 시간보다 크게 설정해야 한다는 것입니다.

로드 밸런서가 서버에서 정상적인 응답을 받지 못하면 로드 밸런서는 정해진 시도 횟수만큼 헬스 체크를 다시 시도하고 이후에도 서버로부터 응답을 받지 못하면 해당 서비스는 다운된 것으로 체 크되어 해당 서비스가 동작하는 서버로 트래픽이 분산되지 않습니다.

이런 서비스 다운까지의 동작을 헬스 체크 주기와 시도 횟수,응답시간으로 산정하거나 전체 타임 아웃 시간으로 산정하기도 합니다. 헬스 체크가 실패한 첫 번째 시도 시간부터 사전에 정해진 타 임아웃까지 헬스 체크가 실패하면 서비스 다운으로 체크할 수도 있습니다.

다음 두 가지 경우는 서비스 다운까지의 시간이 동일합니다.

  • 주기 3초,시도 횟수 2회,응답시간 1초 (3초 * 3회) + 1초 = 10초
  • 주기 3초,타임아웃 10초

서비스가 다운된 후에는 기본 헬스 체크 주기마다 헬스 체크를 수행하지 않고 더 긴 주기로 헬스 체크를 수행하는 기능이 있는 로드 밸런서도 있습니다. 서비스가 다운된 시점에 헬스 체크 주기시 간을 길게 늘여 부하를 감소시킬 수 있다는 장점이 있지만 서비스가 다시 올라오는 시간이 늦어진 다는 단점도 있습니다.

헬스 체크 관련 타이머 값은 장애가 발생했을 때, 장애시간에 영향을 미칠 수 있는 값이므로 각 타 이머가 헬스 체크를 할 때,동작 방식을 정확히 이해해야 합니다.

 


참고

로드 밸런서에서 설정할 수 있는 헬스 체크 방식과 타이머 등은 장비나 서비스를 제공하는 벤더마 다 다를 수 있습니다.