2022 11 14
2022-11-14¶
Fault Tolerance¶
- 참고: https://ko.wikipedia.org/wiki/%EC%9E%A5%EC%95%A0_%ED%97%88%EC%9A%A9_%EC%8B%9C%EC%8A%A4%ED%85%9C
- 개요
- 시스템을 구성하는 부품의 일부에서 결함 또는 고장이 발생하여도 정상/부분적으로 기능을 수행할 수 있는 시스템
- 부품의 고장이 발생하면 부분적인 기능을 사용할 수 없음
- 치명적 결함 -> 시스템 정지
- 특성
- 개별 구성품만의 특징이 아닌, 머신간의 제휴에 대한 규칙 특성
- TCP에서의 패킷 통신 네트워크 내에서 과부하 => 신뢰성이 높은 쌍방향 통신하도록
- 시스템 안에서는 상태 예외적인 경우를 고려하여 대처할 수 있도록 시스템을 구축할 것
- 자기 안정성을 갖게 하는 것에 의해 시스템이 오류없는 상태로 수렴시키는 것
- 이중화를 하는 것이 좋음
- 장애 복구 방식
- Roll-Forward 복구
- 그 시점의 시스템 상태로 복구 실시
- Roll-Back 복구
- 시스템 상태를 약간 이전으로 되돌려 재개
- Roll-Forward 복구
- 이중화 시스템
- Replication (레플리케이션)
- 동일한 시스템 복수로 준비해 병렬로 실행시킴
- Redundancy (다중화)
- 동일한 시스템 복수로 준비해 장애 일어나면 보조 시스템 전환
- Diversity (다양화)
- 같은 사양에 하드웨어 시스템을 복수로 준비하여 복제화와 같이 운용
- Replication (레플리케이션)
MSA 회복성 패턴¶
- 참고: https://dev.gmarket.com/40
- MSA 환경에서의 장애 양상
- 클라이언트는 정상 동작중인 다른 서버를 이용할 수 있음
- 독립적인 서비스들이 서로 API를 호출하여 통신하는 MSA 구조에서는 여러가지 이유로 호출이 안될 수 있음
- 네트워크 문제로 http 통신에 문제가 생겨 원격 서비스 호출 실패할 수도 있음
- 클라이언트 회복성 패턴
- [Circuit Breaker]
- 응답 지연되는 원격 서비스 차단하여 반복 호출 금지
- 두꺼비집 설치와 비슷
- [Fallback]
- 서비스를 차단한 경우 예외를 발생시키는 대신 "대비책 제공"하거나 "미리 준비된 동작" 실행
- 추천 서비스 문제 => 인기 상품 응답하기
- [Bulkhead]
- 응답시 지연되는 서비스에 자원을 모두 소진하지 않도록 쓰레드 풀을 격리하는 것
- 다른 부분에 영향을 안주도록 격벽을 두는 것
- 시스템 전체로 전파되지 않도록 빠른 실패와 실패 격리
- [Circuit Breaker]
-
Netflix Hystrix
- 라이브러리 추가하면 회로 차단기 패턴을 구현할 수 있음 ㄷㄷ
- 원격 서비스 의존 메서드에
@HystrixCommand활용하면 회로 차단기 패턴 적용 가능 - 여러 설정을 줌으로써 차단을 걸고, 차단 해제할 수 있음
@HystrixCommand( commandProperties={ @HystrixProperty(name="metrics.rollingStats.timeInMilliseconds", value="10000"), @HystrixProperty(name="circuitBreaker.requestVolumeThreshold", value="20"), @HystrixProperty(name="circuitBreaker.errorThresholdPercentage", value="50"), @HystrixProperty(name="circuitBreaker.sleepWindowInMilliseconds", value="5000") } ) public void callOtherServer() { // Some works }
- 회로 차단기 별로 격리된 쓰레드 풀을 지정할 수 있음 (Bulkhead)