AWS 기술 블로그
Application Load Balancer 자동 대상 가중치를 통해 애플리케이션 가용성 향상
본 글은 원본 Improving availability with Application Load Balancer automatic target weights 번역글 입니다.
이 블로그에서는 웹 애플리케이션 사용자가 경험하는 오류 수를 줄일 수 있는 Automatic Target Weights(ATW)에 대해 살펴봅니다. ATW는 Application Load Balancer(ALB)뒤에 있는 대상에 대한 회색 실패를 감지하고 완화할 수 있는 기능을 제공합니다. 회색 실패는 ALB 대상이 활성 로드 밸런서 상태 확인을 통과하여 정상으로 보이지만 여전히 오류를 반환하는 경우에 발생합니다. 이 시나리오는 애플리케이션 버그, 종속성 실패, 간혈적인 네트워크 패킷 손실, 새로 시작된 대상의 콜드 캐시, CPU 과부하 등 여러 가지 원인으로 인해 발생할 수 있습니다.
애플리케이션 가용성을 향상시키고 이러한 회색 실패를 해결하기 위해 ALB는 이상 감지와 가중 랜덤이라는 로드 밸런싱 알고리즘을 포함하는 ATW기능을 출시했습니다. ATW의 이상 감지는 HTTP 반환 상태 코드와 TCP/TLS 오류를 분석하여 동일한 대상 그룹의 다른 대상에 비해 불균형한 오류비율을 보이는 대상을 식별합니다. ATW가 이상 대상을 식별하면 성능이 떨어지는 대상으로의 트래픽을 줄이고 이러한 오류를 보이지 않는 대상에 더 많은 트래픽을 할당합니다. 회색 실패가 감소하거나 중지되면 ALB는 이러한 대상으로의 트래픽을 서서히 다시 증가시킵니다.
이상 감지
ATW 기능에는 두 가지 측면이 있습니다: 이상 감지와 이상 완화입니다. 이상 감지는 최소 3개의 정상 대상이 있는 HTTP/HTTPS 대상 그룹에서 자동으로 활성화됩니다. 이는 HTTP/TCP/TLS 응답을 기반으로 회색 실패의 징후를 보이는 대상을 찾습니다.
등록된 대상 콘솔(그림 1)을 보면 “Anomaly detection result”라는 새로운 열이 있음을 알 수 있습니다. 이 열은 정상적으로 작동하는 대상에 대해 “Normal”로 표시됩니다. 그러나 대상이 회색 실패를 경험하고 있다면 “Anomalous”로 표시됩니다. 이는 애플리케이션의 버그, 과부화된 서버 또는 잘못된 구성으로 인한 결과일 수 있습니다.
ATW는 각 타겟의 응답을 살펴 5초마다 이상 징후 탐지 결과를 계산합니다. 다른 대상보다 HTTP 5xx, TCP 또는 TLS 오류의 비율(오류 수를 총 요청 수로 나눈 값)이 현저히 높은 대상은 비정상적인 것으로 간주됩니다.
이상 완화
웹 애플리케이션 사용자가 경험하는 오류를 줄이려면 회색 실패가 발생하는 대상으로 전송되는 요청 수를 줄이는 이상 완화를 활성화해야 합니다. AWS 콘솔, AWS CloudFormation, API 또는 CLI를 사용하여 ATW 완화 모드를 활성화할 수 있습니다. 콘솔을 사용하여 활성화하려면 대상 그룹 속성 섹션으로 이동하여 로드 밸런싱 알고리즘 “Weighted random”을 선택하고 “Turn on anomaly mitigation”을 선택했는지 확인하십시요
또는 CLI를 사용하여 이상 징후 완화를 활성화할 수 도 있습니다.
aws elbv2 modify-target-group-attributes --target-group-arn <Target Group ARN> \
--attributes Key=load_balancing.algorithm.type,Value=weighted_random \
key=load_balancing.algorithm.anomaly_mitigation,Value=on
이제 대상 그룹의 등록된 대상을 보면 “Mitigation in effect”라는 제목의 새 열이 표시됩니다.
이상 완화를 활성화하고 ATW가 이상 대상을 감지하면 ALB는 해당 대상으로 전송되는 트래픽의 양을 줄입니다. 이상 대상이 계속해서 다른 대상보다 현저히 높은 비율의 5xx/TCP/TLS 오류를 경험한다면 가중치는 계속 하향 조정되어 트래픽을 더욱 줄입니다. 대상이 5xx/TCP/TLS 오류의 비율이 낮아지는 등 회복의 징후를 보이면 ATW는 대상 동적 가중치를 증가시켜 이상 대상으로의 트래픽을 서서히 증가시킵니다.
DescribeTargetHealth API 또는 CLI를 사용하여 유사한 정보를 검색할 수 있습니다.
aws elbv2 describe-target-health \
--targets Id=<Target ID>,Port=<Target Port> \
--target-group-arn <Target Group ARN> \
--include AnomalyDetection
각 대상에 대해 응답에는 “Result”를 “anomalous”로 설명하는 “AnomlayDetection” 섹션이 포함됩니다. 또한 “MitigationInEffect” 상태도 예 또는 아니오로 포함됩니다. 다음 코드조각은 비정상적인 대상에 대한 DescribeTargetHealth의 예시입니다.
{
“Target”: {
“Id”: “i-00000000000000000”,
“Port”: 80
},
“HealthCheckPort”: “80”,
“TargetHealth": {
“State”: “healthy”
},
“AnomalyDetection": {
“Result”: “anomalous”,
“MitigationInEffect”: “yes”
}
}
ATW 이상 완화의 효과 확인
웹 어플리케이션의 상태를 모니터링하고 이상 감지 및 완화가 어떻게 작동하는지 확인하기 위해 CloudWatch 대시보드를 만드는 것이 도움이 될 수 있습니다. 그림 4의 스크린샷은 이상 완화를 황성화하기 전과 후의 예제 웹 어플리케이션 트래픽을 보여줍니다.
그래프의 왼쪽에서 애플리케이션의 이상 징후 완화를 활성화하기 전에 많은 수의 HTTP 5xx오류(80만 건의 요청 중 약 25%)가 발생한 것을 볼 수 있습니다. ‘비정상 호스트 수’ 그래프에서는 12개 대상 중 4개가 회색 장애를 경험했음을 보여줍니다.
기간의 절반이 지나면 이상 징후 완화 활성화의 영향을 확인할 수 있습니다. 경감된 호스트 수가 4개로 급증한 것을 알 수 있습니다. 동시에 HTTP 5xx 오류 수는 10,000건 미만으로 떨어지고 HTTP 2xx 응답 수는 200,000건 급증합니다.
이 예에서 ATW 이상 징후 탐지 및 완화는 다른 방법으로는 사용자가 경험했을 오류의 96%를 자동으로 제거했습니다.
ATW 이상 완화 및 오토 스케일링 그룹
랜덤 가중 로드 밸런싱 알고리즘과 함께 오토 스케일링 그룹 정책을 사용할 수 있습니다. 그러나 평균 CPU 사용률을 기반으로 하는 동적 스케일링 정책이 있는 경우, 개별 인스턴스의 CPU사용률은 변경되지만 메트릭(전체 평균)은 개별 대상이 ATW 완화 중일 때 변경되지 않습니다.
완회된 대상으로 인해 손실된 용량을 고려한 평균 CPU 사용률을 계산하기 위해 사용자 지정 CloudWatch메트릭을 생성할 수 있습니다. 이 메트릭은 오토 스케일링 그룹 평균 CPU 사용률을 사용하고 완화되지 않은 대상의 수를 기반으로 메트릭 값을 조정합니다.
사용자 지정 지표는 다음과 같습니다.
(EC2_AutoScalingGroup_CpuUtilization * AutoScaling_GroupInServiceInstances) / (AutoScaling_GroupInServiceInstances - MitigatedHostCount)
고려사항
ATW 작동 방식에 대해 알아야 할 몇 가지 사항은 다음과 같습니다.
- ATW는 3개 이상의 대상이 있는 대상 그룹에서만 사용할 수 있습니다.
- 교차 영역이 활성화된 경우 ATW는 대상 그룹의 모든 대상 중 최대 50%에 대한 실패를 감지하고 완화합니다.
- 교차 영역이 비활성화된 경우 ATW는 가용 영역(AZ)당 최대 50%의 대상에 대한 실패를 감지하고 완화합니다.
- 요청 속도가 대상당 초당 2개 미만인 경우 ATW가 이상 대상을 감지하지 못할 수 있습니다.
- 대부분의 대상이 회색 실패를 경험하고 있을 때 ATW는 이상치를 감지하거나 완화를 수행할 수 없습니다.
- ATW 감지 및 완화 기능을 사용할 때 추가 요금은 없습니다.
결론
ATW는 이제 모든 상용 AWS 리전의 기존 및 새로 생성된 ALB에서 사용할 수 있습니다. 지금 바로 실험을 시작해보시기 바랍니다. 이 기능에 대해 자세히 알아보려면 문서를 참조하십시요.