2 minute read

신뢰가능하고, 확장가능하며, 유지보수 가능한 애플리케이션

대부분의 애플리케이션은 계산집약적(compute-intensive) 보다는 데이터집약적(data-intensive)하다. 애플리케이션의 문제점은 데이터의 양, 데이터의 복잡도, 데이터가 얼마나 빨리 변하는지다.

  • 데이터베이스: 데이터를 저장하고 다른 애플리케이션이 나중에 찾음
  • 캐시: 비싼 연산 결과를 기억하고 빠르게 읽어드림
  • 검색 인덱스: 다양한 방법으로 키워드를 탐색하거나 필터링함
  • 스트림 프로세싱: 메시지를 다른 프로세스에 비동기로 보냄
  • 배치 프로세싱: 대량으로 쌓인 데이터를 주기적으로 처리함

저마다의 특성을 가진 데이터베이스 시스템은 많다. 그렇기 때문에 어느 상황에서 적합한 툴을 사용해야하는지가 쉽지 않다.

데이터 시스템 짚어보기

데이터베이스, 큐, 캐시는 모두 다른 범주에 들어가는 툴이다. 하지만 우리는 왜 그것을 데이터 시스템이라는 단어로 함축하여 사용하는가?

대부분의 애플리케이션은 넓은 범위의 요구사항을 원한다. 하나의 툴로는 그것을 충족할 수 없지만 작업(tasks)단위로 나누었을 때 하나에 툴은 효과적으로 동작한다. 예를 들어, Memcached와 같은 애플리케이션 관리형 캐싱 계층이 메인 데이터베이스와 격리되어 있다면, 애플리케이션이 캐싱과 메인 데이터베이스의 싱크를 책임져야 한다.

데이터 시스템이나 서비스를 디자인 할때 여러가지 어려운 문제들이 생긴다. 예를 들어 다음과 같은 질문들이 있다.

  • 내부적으로 문제가 발생하더라도 데이터가 정확하고 완전하게 유지되게 하려면 어떻게 해야하는가?
  • 시스템의 일부가 저하되는 경우에도 고객에게 일관되게 우수한 성능을 제공하려면 어떻게 해야 하는가?
  • 부하 증가를 처리하기 위해 어떻게 확장하는가?
  • 서비스를 위한 좋은 API란 무엇인가?

신뢰성

신뢰성이란 시스템이 어떤 문제에 직면하더라도 올바르게 동작을 지속하는 정도를 가리킨다.

오류(fault)는 장애(failure)와 동일하지 않다 오류는 시스템에 정의된 요구사항에서 벗어나는 것을 의미한다. 장애는 시스템 전체가 서비스 제공이 중단되는 것을 말한다. 따라서, 오류를 방지하므로서 장애를 막는 방식으로 디자인하는 것이 최선이다.

하드웨어 오류

우리는 시스템 오류의 원인을 대부분 하드웨어 오류로 생각하기 쉽다.

  • 하드 디스크가 고장나거나
  • RAM이 장애가 있거나
  • 전력망이 정전되거나
  • 누군가 네트워크 케이블을 잘못 꽂는다거나 하는 것들이 하드웨어 오류다.

하드디스크의 평균 무고장 시간, MTTF(mean time to failure) 는 10년에서 50년이다. 대략 10,000개의 디스크로 구성된 스토리지 클러스터는 하루 평균 1개의 디스크가 고장난다는 것이다.

하드디스크 장애를 대처하기 위해서 하드웨어 중복을 추가하는 방법이 있다.

  • RAID로 디스크를 구성
  • 서버의 이중 전원 공급 장치
  • 핫스왑이 가능한 CPU
  • 데이터 센터의 백업을 위한 배터리

예전에는 단일 머신이 전체 장애를 일으키는 경우가 드믈었다. 하드웨어 구성요소를 이중화하여 고가용성을 요구하는 애플리케이션의 수는 적었다. 하지만, 최근에는 데이터의 양과 컴퓨팅 자원이 많이 필요하여 더 많은 애플리케이션이 많은 머신을 사용한다.

소프트웨어 에러

하드웨어 오류는 무작위적이고 서로 영향을 크게 주진 않는다. 노드 간에 상관관계가 있는 소프트웨어 오류는 하드웨어 오류보다 더 많은 시스템 오류를 유발한다. 예를 들어,

  • 2012년 6월 30일 윤초가 발생하여 Linux 커널의 버그로 인해 모든 인스턴스가 충돌했다.
  • 공유 리소스(CPU 시간, 메모리, 디스크 공간, 네트워크 대역폭)을 사용하는 프로세스
  • 시스템이 다른 시스템에 의존할 때 해당 시스템이 오류가 발생할 경우 연쇄적인 오류가 발생한다.

소프트웨어 에러에 대한 빠른 해결책은 없다. 다만, 다음과 같은 것이 도움이 될 수 있다.

  • 시스템의 가정과 상호 작용에 대해 신중히 판단하기
  • 철저한 테스트
  • 프로세스 격리
  • 프로세스 충돌 및 재시작 허용
  • 프로덕션 환경에서 시스템 동작 측정
  • 모니터링과 분석

휴먼 에러

소프트웨어 시스템을 설계하고 구축하고 그것을 운영하는 것은 사람이다. 신뢰할 수 없는 인간을 극복하기 위해 시스템을 신뢰가능하게 만들려면 다음을 적용하라.

  • 오류 발생 가능성이 최소화된 방식으로 설계하기(추상화와 API)
  • 실수를 많이 하는 과 실패를 유발하는 곳을 분리하기( 비프로덕션 샌드박스 환경을 제공)
  • 단위 테스트 부터 전체 시스템 통합 테스트 및 수동 테스트까지 모든 수준에서 철저한 테스트 실시