책너두 (데이터 중심 애플리케이션 설계) 1일차 (~10p)

요약

  • 데이터 시스템의 포괄적인 의미와, 왜 포괄적으로 사용해야하는지 이해하게 됨.
  • 애플리케이션의 신뢰성 에 대한 내용을 여러 관점에서 생각할 수 있었음.
    • 하드웨어 결함
      • Redundancy, 고가용성
    • 소프트웨어 결함
      • 소프트웨어 결함을 찾기 위한 의식적인 작업들을 꾸준히 수행해야 함.
    • 인적 결함
      • 인적 오류를 최소화할 수 있는 방향으로 데이터 시스템을 설계해야 함.
    • 각 결함에서 우리가 취해야할 자세에 대한 내용을 설명해주고 있음.
  • 카오스 몽키 부분은 실제로 AWS GAME DAY 에서 경험해 본 적이 있다. 상당히 공감하며 책을 읽었다.

발췌

  • 이 책에서는 신뢰할 수 없는 여러 부품으로 신뢰할 수 있는 시스템을 구축하는 다양한 기법을 다룸 (p7)

메모

1장. 신뢰할 수 있고 확장 가능하며 유지보수하기 쉬운 애플리케이션

  • 일반적인 데이터 중심 애플리케이션은 공통으로 필요로 하는 기능을 제공하는 표준 구성 요소로 만듦. (Standard building block)
    • 데이터베이스
    • 캐시
    • 검색 색인(search index)
    • 스트림 처리(stream processing)
    • 일괄 처리(batch processing)
  • 위의 내용이 당연하다고 생각이 든다면, 데이터 시스템 이 성공적으로 추상화됐기 때문임.
    • 하지만 애플리케이션마다 요구사항이 다르므로 애플리케이션을 만들 때 어떤 도구와 어떤 접근 방식이 수행 중인 작업에 가장 적합한지 생각해야 함.

데이터 시스템에 대한 생각

  • 데이터 시스템 이라는 포괄적 용어로 묶어야 하는 이유는?
    1. 새로운 도구들은 다양한 사례(use case)에 최적화됐기 때문에 더 이상 전통적인 분류에 딱 들어맞지 않음.
      • ex) 메시지 큐로 사용하는 데이터스토어인 레디스 / 데이터베이스처럼 지속성을 보장하는 메시지 큐인 아파치 카프카 → 분류 간 경계가 흐림.
    2. 많은 애플리케이션이 단일 도구로는 더 이상 데이터 처리와 저장 모두를 만족시킬 수 없는 과도하고 광범위한 요구사항을 갖고 있음.
      • ex) 데이터베이스와 분리된 애플리케이션 관리 캐시 계층 (memcached)이나 엘라스틱서치(Elasticsearch), 솔라(solr) 같은 전문(full-text) 검색 서버는 애플리케이션 코드의 책임임.(데이터 베이스와 동기화, 색인 유지 작업들을 해야하기 때문)
  • 복합 데이터 시스템(composite data system) 은 외부 클라이언트가 일관된 결과를 볼 수 있게끔 쓰기작업에서 캐시를 올바르게 무효화하거나 업데이트 하는 특정 보장 기능을 제공할 수 있음.
    • 더이상 개발자는 애플리케이션 개발자뿐만 아니라 데이터 시스템 설계자이기도 함.
  • 데이터 시스템, 서비스 설계시, 데이터를 정확하고 완전하게 유지하려면 어떻게 해야 할까?
    • 대부분의 소프트웨어 시스템에서 중요하게 여기는 세 가지 관심사가 다음과 같음.
      1. 신뢰성 → 시스템이 어떠한 역경에 직면해도 시스템이 지속적으로 올바르게 동작해야함.
      2. 확장성 → 시스템이 데이터, 트래픽양이 증가하고 복잡도가 증가해도 이를 잘 처리할 방법이 있어야 함
      3. 유지보수성 → 시가이 지나더라도 다양한 사람이 시스템 상에서 생산적으로 작업할 수 있어야 함.

신뢰성

  • 소프트웨어에서 일반적인 기대치는 다음과 같음.
    • 애플리케이션은 사용자가 기대한 기능을 수행함.
    • 사용자가 범한 실수나 예상치 못한 소프트웨어 사용법을 허용할 수 있음.
    • 시스템 성능은 예상된 부하, 데이터 양에 실푸적인 사용 사례를 충분히 만족함.
    • 시스템은 허가되지 않은 접근, 오남용을 방지함.
  • 결함(fault) → 잘못될 수 있는 일
  • 내결함성(fault-tolerant) or 탄력성(resilient) → 결함을 예측하고 대처할 수 있는 시스템
    • 내결함성이란, 모든 종류의 결함을 견딜 수 있는 시스템을 의미하지 않음. 특정 유형의 결함 내성에 대한 내용임
  • 결함은 장애(failure)와 동일하지 않음.
    • 결함 : 사양에 벗어난 시스템의 한 구성 요소
    • 장애 : 사용자에게 필요한 서비스 제공 X, 시스템 전체가 멈춤
  • 내결함성 시스템에서 고의적으로 결함을 일으킴으로써 내결함성 시스템을 지속적으로 훈련하고 테스트해서 결함이 자연적으로 발생했을 때 올바르게 처리할 수 있다는 자신감을 높인다.
    • ex) 넷플릭스의 카오스 몽키(Chaos Monkey)
  • 위 내용은 결함 예방이 아닌 내결함성을 얘기한 것이지만, 보안 문제는 예방이 가장 좋은 경우임.
    • 공격자가 시스템을 손상시키면 이는 되돌릴 수 없기 때문

하드웨어 결함

  • 규모가 큰 데이터 센터에서는 하드웨어 결함이 늘상 일어난다고 함.
  • 시스템 장애율을 줄이기 위한 대응
    • 하드웨어 구성 요소에 중복(redundancy)을 추가하는 방법
      • 디스크에 RAID 구성을 설치
      • 서버는 이중 전원 디바이스와 핫 스왑(hot-swap) 가능한 CPU를 갖춤
      • 데이터센터는 건전지, 예비 전원용 디젤 발전기를 갖춤
      • 이마저도 옛날에는 고가용성이 절대적으로 필수적인 소수 애플리케이션에서만 필요했음.
        • 하지만 이제는 데이터 양과 애플리케이션 계산 요구가 늘어나면서 더 많은 애플리케이션이 많은 수의 장비를 사용하고 있음.
  • 위와 같은 이유로 하드웨어 중복성을 추가해서 전체 장비의 손실을 견딜 수 있는 시스템으로 옮겨가고 있음.

소프트웨어 오류

  • 하드웨어 결함은 무작위적이며, 서로 독립적임.
  • 하지만 소프트웨어 오류(시스템 내 체계적 오류)의 경우는 시스템 오류를 더욱 많이 유발한다.
    • 잘못된 특정 입력이 있을 떄 모든 애플리케이션 서버 인스턴스가 죽는 소프트웨어 버그
    • 공유 자원을 과도하게 사용하는 일부 프로세스
    • 시스템 속도가 느려 반응이 없거나 잘못된 응답을 반환하는 서비스
    • 한 구성 요소의 작은 결함으로 인해 다른 구성 요소의 결함을 야기하는 연쇄 장애(cascading failure)
  • 이와 같은 소프트웨어 결함은 특정 상황에 의해 발생하기 전까지 오랫동안 나타나지 않음..
  • 이러한 문제는 신속한 해결책이 없음.
    • 시스템간의 상호작용에 주의깊게 생각하기
    • 빈틈없는 테스트
    • 프로세스 격리
    • 죽은 프로세스 재시작 허용
    • 프로덕션 환경에서 시스템 동작 측정
    • 모니터링
    • 분석
      • 위와 같은 작은 일들이 문제 해결에 도움을 줄 수 있음.

인적 오류

  • 한 연구에 따르면 운영자의 설정 오류가 중단의 주요 원인인 반면, 하드웨어(서버, 네트워크) 결함은 중단 원인의 10~25% 정도에 그침.
  • 인적 오류가 있음에도, 시스템을 어떻게 신뢰성있게 만들까?
    • 오류 가능성을 최소화하는 방향으로 시스템을 설계할 것
    • 사람이 실수로 발생할 수 있는 부분을 분리해서 실제 사용자에게 영향이 없도록할 것
    • 단위 테스트, 전체 시스템 통합 테스트, 수동 테스트, 모든 수준에서 철저히 테스트할 것 (특히 코너 케이스를 다루는데 유용)
    • 인적 오류를 빠르게 쉽게 복구할 수 있게 할 것
    • 성능 지표, 오류율과 같은 상세하고 명확한 모니터링 대책을 마련할 것 (ex : 원격 측정)
    • 조작 교육과 실습을 시행할 것

신뢰성은 얼마나 중요할까?

  • 비즈니스 애플리케이션에서 버그는 생산성 저하의 원인이고, 명성에 타격을 준다는 면에서 많은 비용이 듦.
  • 애플리케이션 사용자에 대한 책임도 있음.
    • 제품을 개발하는데 있어서 개발 비용을 줄이기 위해 신뢰성을 희생해야 하는 상황이 있음.
    • 이때, 개발 비용을 줄이는 시점을 잘 알고 있어야 함.

댓글

Designed by JB FACTORY