본문 바로가기
App 설계

DDIA - 신뢰성,확장성,유지보수성 - 신뢰성

by ocwokocw 2021. 10. 17.

- 이 글은 마틴 클레프만의 데이터 중심 애플리케이션 설계를 기반으로 작성되었습니다.

- 개요

과거에는 CPU, RAM 같은 하드웨어 성능이 애플리케이션을 제한했지만, 애플리케이션들이 계산 중심이 아닌 데이터 중심으로 변화하면서 데이터의 양, 복잡도, 변화속도로 관점이 변경되고 있다. 일반적으로 데이터 중심 애플리케이션이 공통으로 필요로 하는 표준 구성요소는 아래와 같다.

  • DB: 구동 App. 및 다른 App. 에서 데이터를 다시 찾을 수 있게 데이터를 저장
  • Cache: Read 성능 향상을 위한 값 비싼 수행 결과를 기억
  • Index: 키워드로 데이터를 검색하거나 필터링 제공
  • Stream 처리: 비동기 처리를 위한 다른 프로세스로 메시지 전송
  • Batch: 일정 주기로 대량의 누적된 데이터 분석

위의 요소들을 보면서 '별것 아니네' 라는 생각이 들거나 '당연한 말 아닌가?' 라는 생각이 든다면 이는 데이터 시스템이 성공적으로 추상화되었기 때문일 것이다. 아무 기반도 없는 상태로 DB를 구현한다고 생각해보면 이해가 쉬울듯 하다.

소프트웨어 시스템에는 많은 관심사가 있지만 중요하게 여기는 3 가지 관심사에 대해서 알아보도록 하자.

  • 신뢰성: H/W나 S/W 결함이나 인적오류에 직면하더라도 시스템이 올바르게 동작하는 것
  • 확장성: 데이터 양, 트래픽, 복잡도 증가시 이를 처리할 수 있는 적합한 방법
  • 유지보수성: 시간이 지남에도 모든 사용자가 시스템상에서 생산적으로 작업하는 것

- 신뢰성

S/W 개발자마다 신뢰성에 대한 직관적인 자신만의 개념이 있겠지만 일반적으로 생각하는 요소들은 아래와 같다.

  • 사용자가 기대하는 기능 수행
  • 사용자가 범한 실수나 예상치 못한 S/W 사용법 허용
  • 시스템 성능은 예상된 부하와 데이터 양에서 필수적인 Use case를 만족
  • 시스템은 허가되지 않은 접근과 오남용을 방지

신뢰성과 관련한 여러 가지 비슷한 용어들이 있지만 이를 정확하게 알아야 할 필요가 있다.

  • 결함(fault): 잘못될 수 있는 일
  • 내결함성(fault-tolerant) 또는 탄력성(resilient): 결함을 예측하고 대처할 수 있는 시스템에 대해 '내결함성 또는 탄력성을 지녔다.'라고 표현한다.
  • 장애: 사용자에게 필요한 서비스를 제공하지 못하고 시스템이 Down 되는 상태

- H/W 결함

H/W 결함은 일반적으로 HDD, RAM 결함, 정전, 네트워크 케이블 결함과 같은 것을 나타낸다. 보통의 경우 H/W 결함을 극복하기 위해서 구성요소를 중복하여 구성한다. 


- S/W 결함

H/W 결함의 경우 독립적이다. 1 개의 DISK 에서 장애가 발생한 경우 이 장애가 전파되지 않는다. 물론 약한 상관관계(ex - 서버 랙의 온도 같은 원인)가 있을 수는 있지만 다수의 H/W에 동시다발적으로 발생하지는 않는다.

 

시스템내의 체계적인 오류의 경우 예상하기가 어렵고 노드간의 상관관계가 존재한다. 예를 들면 아래와 같은 원인들이 있다.

  • 잘못된 입력으로 인해 모든 App. 서버의 인스턴스가 Down 된다.
  • CPU 시간, 메모리, Disk 공간처럼 공유자원을 과도하게 사용하는 Process
  • 작은 구성요소의 결함이 차례대로 장애를 전파하는 경우

H/W 의 경우 중복구성된 장비로 전환하여 비교적 신속한 해결이 가능하지만 S/W 의 경우 신속한 해결책이 없다. 이를 방지 하기 위해 테스트, 프로세스 격리, 운영환경 시스템 동작 측정, 모니터링, 분석하기 등을 수행해야 한다.


- 인적오류

인간은 미덥지가 못하며 오류의 주된 원인이라고 할 수 있다. 이를 극복하기 위한 조치는 아래와 같다.

  • 오류의 기능성을 최소화하도록 시스템을 설계한다. 잘 설계된 추상화, API, 관리 인터페이스를 사용하라.
  • 실제 시스템에는 영향이 없으면서 실 데이터를 사용할 수 있는 비 운영환경 '샌드박스'를 운영하라.
  • 테스트를 철저히 한다. 단위 Test, 통합 Test, 수동 Test 를 꼼꼼하게 한다.
  • 장애발생시 복구가 용이하도록 설정변경 지원을 통하여 빠른 Rollback 을 지원할 수 있도록 하라.
  • 성능 지표와 오류율 같은 상세하고 명확한 모니터링 대책을 마련해야 한다.

댓글