Fault Injection

Fault Injection은 시스템의 복원력을 테스트하기 위해 의도적으로 장애를 주입하는 기법입니다.

목차

Why Fault Injection?

프로덕션 환경에서의 복원력 테스트

마이크로서비스 아키텍처에서는 수많은 서비스가 서로 의존하며, 하나의 서비스 장애가 전체 시스템에 영향을 미칠 수 있습니다. Fault Injection은 다음과 같은 이유로 필수적입니다:

1. Chaos Engineering의 핵심 원칙

Netflix의 Chaos Monkey에서 시작된 Chaos Engineering은 프로덕션 환경에서 장애를 사전에 경험하고 시스템의 약점을 발견하는 것을 목표로 합니다.

spinner

2. 실제 프로덕션 시나리오 재현

프로덕션 환경에서는 다음과 같은 문제가 발생할 수 있습니다:

시나리오
원인
Fault Injection 테스트

네트워크 지연

지역 간 네트워크 latency

Delay Injection

서비스 타임아웃

느린 데이터베이스 쿼리

Delay Injection

일시적 장애

서비스 재시작, 스케일 다운

Abort Injection

부분적 장애

일부 파드만 실패

Percentage 기반 Injection

Cascading Failure

한 서비스 장애가 다른 서비스로 전파

조합된 Fault Injection

3. Circuit Breaker와 Timeout 설정 검증

Fault Injection 없이는 Circuit Breaker와 Timeout 설정이 실제로 작동하는지 확인하기 어렵습니다.

spinner

4. 안전한 배포 검증

새 버전을 배포할 때 의존 서비스의 장애 상황에서도 안전한지 확인할 수 있습니다:

  • 새 버전이 timeout을 올바르게 처리하는가?

  • 의존 서비스 장애 시 graceful degradation을 수행하는가?

  • 에러 처리 로직이 제대로 작동하는가?

When to Use Fault Injection

Fault Injection은 다음과 같은 상황에서 사용해야 합니다:

1. 개발 및 테스트 환경

시나리오: 새로운 마이크로서비스 개발

Use Case:

  • 결제 서비스가 느려지거나 실패할 때 주문 서비스가 어떻게 반응하는지 테스트

  • 사용자에게 적절한 에러 메시지를 보여주는지 확인

2. 스테이징 환경에서의 통합 테스트

시나리오: 프로덕션 배포 전 최종 검증

Use Case:

  • 프로덕션 배포 전 시스템 전체의 복원력 검증

  • 모니터링 알람이 제대로 작동하는지 확인

3. 프로덕션 환경에서의 Chaos Testing

시나리오: 프로덕션 복원력 정기 테스트

Use Case:

  • Netflix 스타일 Chaos Engineering

  • 프로덕션 환경에서 실제 장애 상황 대응 능력 검증

  • 주의: 매우 낮은 비율(1-5%)로 시작하고, 영향을 모니터링

4. Timeout 및 Retry 정책 조정

시나리오: 최적의 Timeout 값 찾기

Use Case:

  • 현재 timeout 설정(5초)이 적절한지 테스트

  • 10초 지연 시 timeout이 작동하는지 확인

  • 사용자 경험을 해치지 않는 최적의 값 찾기

5. Circuit Breaker 동작 검증

시나리오: Circuit Breaker가 제대로 작동하는지 확인

Use Case:

  • 60% 실패율에서 Circuit Breaker가 5번 연속 에러 후 작동하는지 확인

  • 30초 후 자동으로 복구되는지 검증

6. 특정 사용자 그룹에 대한 테스트

시나리오: 베타 테스터에게만 장애 주입

Use Case:

  • 실제 사용자 영향 없이 안전하게 테스트

  • 베타 테스터의 피드백으로 개선

Fault Injection 개요

spinner

Delay 주입

Abort 주입

실전 예제

1. Delay와 Abort 조합

실제 프로덕션 환경에서는 지연과 실패가 동시에 발생할 수 있습니다:

결과:

  • 20%의 요청은 3초 지연

  • 10%의 요청은 즉시 503 에러

  • 나머지 70%는 정상 처리

2. 조건부 Fault Injection

특정 조건에서만 장애를 주입:

3. 점진적 장애 주입 (Progressive Fault Injection)

단계적으로 장애 비율을 증가시켜 테스트:

4. HTTP 상태 코드별 테스트

다양한 HTTP 에러 코드로 테스트:

Real-World Scenarios

시나리오 1: 데이터베이스 느린 쿼리 시뮬레이션

상황: 데이터베이스 쿼리가 간헐적으로 느려지는 경우

테스트 목표:

  1. 애플리케이션의 timeout 설정이 적절한가?

  2. Connection pool이 고갈되지 않는가?

  3. 사용자에게 적절한 에러 메시지가 표시되는가?

예상 결과:

  • ✅ 적절한 timeout으로 빠른 실패 (fail-fast)

  • ✅ Connection pool 관리 정상

  • ❌ 전체 시스템 응답 지연 → Circuit Breaker 필요

시나리오 2: 마이크로서비스 Cascade Failure 테스트

상황: 한 서비스의 장애가 다른 서비스로 전파되는지 확인

spinner

테스트 목표:

  1. 결제 실패 시 주문 서비스가 graceful하게 처리하는가?

  2. Circuit Breaker가 작동하여 재고 서비스는 정상 작동하는가?

  3. 프론트엔드에 적절한 사용자 메시지가 표시되는가?

시나리오 3: API Rate Limit 상황 테스트

상황: 외부 API가 rate limit에 도달하는 상황 시뮬레이션

테스트 목표:

  1. 429 에러를 적절하게 처리하는가?

  2. Retry 로직이 Exponential Backoff를 사용하는가?

  3. 캐시를 활용하여 API 호출을 줄이는가?

시나리오 4: 지역 간 네트워크 지연 시뮬레이션

상황: 다른 리전의 서비스 호출 시 지연

테스트 목표:

  1. 글로벌 서비스에서 지역 간 latency 영향 확인

  2. 캐싱이나 CDN으로 최적화 가능 여부 판단

  3. SLA 목표(예: 95% 요청이 500ms 이내)를 충족하는가?

시나리오 5: 배포 중 일시적 장애 시뮬레이션

상황: Rolling Update 중 일부 파드가 일시적으로 사용 불가

테스트 목표:

  1. 배포 중에도 가용성 유지 (최소 75%)

  2. Readiness Probe가 제대로 작동하는가?

  3. Load Balancer가 건강한 파드로만 트래픽 전달하는가?

Testing Strategies

1. Progressive Chaos Engineering

점진적으로 장애 비율을 증가시켜 시스템의 한계를 찾습니다:

spinner

단계별 실행:

2. Time-Based Testing

특정 시간대에만 장애를 주입:

3. Automated Testing Pipeline

CI/CD 파이프라인에 통합:

4. Monitoring and Alerting

장애 주입 중 핵심 메트릭 모니터링:

5. Blue-Green Fault Injection

Blue 환경에 장애를 주입하고 Green 환경과 비교:

비교 메트릭:

  • 에러율

  • 응답 시간 (P50, P95, P99)

  • 사용자 경험 지표

모범 사례

1. 작게 시작하기

  • **처음에는 1-5%**의 낮은 비율로 시작

  • 개발/스테이징 환경에서 충분히 테스트

  • 프로덕션에서는 비즈니스 영향이 적은 시간대에 실행

2. 모니터링 필수

Fault Injection 적용 전 모니터링 대시보드 준비:

3. 명확한 레이블 사용

4. 자동 롤백 메커니즘

5. 문서화

모든 Fault Injection 테스트를 문서화:

6. 프로덕션 환경 주의사항

  • 비즈니스 영향 평가: 장애 주입이 실제 사용자에게 미치는 영향 분석

  • 점진적 확대: 1% → 5% → 10% 순으로 천천히

  • 알림 설정: 임계값 초과 시 즉시 알림

  • 롤백 준비: 언제든지 즉시 롤백 가능하도록 준비

  • 비즈니스 시간 피하기: 트래픽이 적은 시간대 선택

7. 정기적인 테스트

참고 자료

마지막 업데이트