본문으로 건너뛰기

내결함성(Fault Tolerance)과 고가용성(High Availability) 제대로 이해하기

· 약 9분
Johny Cho
Back End Engineer @ NHN


이번 포스트에서는 내결함성(Fault Tolerance)고가용성(High Availability) 을 명확히 구분하고, 실제 서비스 사례를 통해 각각이 어떤 문제를 해결하는지 살펴보고자 합니다.

분산 시스템과 클라우드 환경에서 내결함성(Fault Tolerance)고가용성(High Availability) 은 매우 중요한 개념입니다.
두 용어는 종종 혼용되지만, 엄밀히 말하면 서로 다른 초점과 해결 방식을 가지고 있습니다.


내결함성(Fault Tolerance)이란?

내결함성이란 시스템 일부에 장애가 발생하더라도 서비스 요청 처리를 계속할 수 있도록 하는 능력을 의미합니다. 즉, 장애 상황에서도 사용자가 정상적인 응답을 받을 수 있도록 설계된 특성입니다.


내결함성 사례 – 장애 발생 시에도 서비스가 지속된다

사례 1: 주문 조회 서비스에서 캐시 장애

상황

  • 사용자가 주문 내역을 조회할 때, 시스템은 Redis 캐시를 우선 조회하고, 캐시에 데이터가 없으면 DB를 조회합니다.

장애 발생

  • Redis 서버가 장애를 일으킵니다.

내결함성이 없는 경우

Redis 장애로 인해 예외가 발생하고, 주문 조회가 실패합니다.

내결함성이 적용된 경우

Redis 장애가 발생해 캐시 조회에 실패하더라도 DB로 대체 조회를 수행하여 주문 조회가 정상적으로 처리됩니다.

이처럼 장애가 발생했지만 서비스는 중단되지 않습니다.

사례 2: 외부 결제 API 호출 실패

상황

  • 결제 승인 시 외부 결제 대행사(PG) API를 호출합니다.

장애 발생

  • 일시적인 네트워크 타임아웃이 발생합니다.

내결함성 적용

재시도(Retry)와 회로 차단기(Circuit Breaker) 패턴을 도입하여 1차 호출 실패 시 재시도를 수행하고, 일정 횟수 이상 실패하면 사용자에게 실패를 안내합니다.

이를 통해 장애가 다른 서비스로 확산되지 않고 시스템 전체의 안정성이 유지됩니다.


고가용성(High Availability)이란?

고가용성이란 시스템이 가능한 한 오랜 시간 동안 중단 없이 서비스를 제공하는 특성을 의미합니다.
즉, 서비스가 얼마나 자주 그리고 얼마나 오래 정상적으로 운영되는지를 나타냅니다.


고가용성 사례 – 장애 발생 후 빠른 복구

사례 1: 웹 서버 장애

상황

  • 웹 서버 3대가 로드밸런서 뒤에서 서비스를 제공합니다.
                ┌─────────────┐
│ User │
└─────────────┘


┌─────────────────┐
│ Load Balancer │
└─────────────────┘

┌────────────────┴───────────────┐
│ │ │
▼ ▼ ▼
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ Server A │ │ Server B │ │ Server C │
│ │ │ (DOWN) │ │ │
└─────────────┘ └─────────────┘ └─────────────┘

장애 발생

  • Server B가 다운됩니다.

고가용성 적용

헬스체크를 통해 Server B의 장애를 감지하고, 로드밸런서가 해당 서버를 트래픽 분배 대상에서 제외합니다.
이후 트래픽은 Server A와 Server C로 재분배됩니다.

이로 인해 일부 서버가 장애를 겪었지만, 사용자는 거의 장애를 느끼지 못합니다.


사례 2: 배치 서버 장애

상황

  • 하루에 한 번 실행되는 배치 작업이 서버 1대에서 수행됩니다.

문제

  • 배치 실행 중 서버가 다운되면 작업이 실패합니다.

고가용성 적용

  • 배치 서버를 다중화하고 Quartz Cluster 또는 Kubernetes CronJob과 같은 클러스터링 기술을 도입합니다.
  • 서버 A에 장애가 발생하면 서버 B가 다음 스케줄을 대신 실행하여 배치 작업이 특정 서버에 종속되지 않도록 합니다.

내결함성과 고가용성의 차이

구분내결함성고가용성
초점장애를 견디는 능력장애 후 빠른 복구
관점요청 처리의 지속성서비스 중단 시간 최소화
접근 방식설계 중심운영 및 인프라 중심
목표기능 유지최대한의 업타임 확보
  • 내결함성은 타이어가 펑크 나도 예비 타이어로 계속 주행하는 자동차와 같습니다.
  • 고가용성은 사고가 나면 즉시 다른 차량으로 갈아타는 렌터카 서비스와 같습니다.

실무에서 내결함성과 고가용성의 병행 적용

내결함성과 고가용성은 서로 경쟁하는 개념이 아니라 상호 보완적인 관계입니다.

사례: 추천 서비스 장애 대응

  • 내결함성 측면에서는 추천 서버 장애 시 기본 추천 목록을 제공하여 서비스 연속성을 유지합니다.
  • 고가용성 측면에서는 장애 인스턴스를 자동으로 제거하고 신규 인스턴스를 신속히 생성하여 빠른 복구를 지원합니다.

결과적으로 장애를 견디면서 동시에 빠르게 복구하는 시스템을 구현할 수 있습니다.


현실적인 설계 전략

모든 기능을 완벽한 내결함성으로 설계하면 비용과 시스템 복잡도가 크게 증가합니다. 따라서 실무에서는 다음과 같은 전략을 권장합니다.

  • 핵심 비즈니스 흐름에는 강력한 내결함성을 적용한다.
  • 부가 기능에는 고가용성과 점진적 서비스 저하(Graceful Degradation)를 적용한다.

마치며

내결함성은 장애 발생 시에도 요청 처리를 지속할 수 있는 능력이며, 고가용성은 장애 발생 후 빠른 복구를 통해 서비스 중단 시간을 최소화하는 개념입니다. 실무에서는 두 개념을 함께 적용하여 서비스의 연속성과 안정성을 확보합니다.

분산 시스템에서는 장애를 완전히 제거하는 것은 현실적으로 불가능합니다. 중요한 것은 장애를 어떻게 견디고, 얼마나 신속하게 복구하는가 입니다. 내결함성과 고가용성을 정확히 이해하고 적절히 적용하는 것이 안정적인 시스템 설계의 출발점입니다.

Loading comments...