Post

데이터 중심 애플리케이션 설계 1장

데이터 중심 애플리케이션 설계 1장

데이터 시스템

애플리케이션 기본 요소

  • 데이터베이스
  • 캐시
  • 검색 색인
  • 스트림 처리
  • 일괄 처리

소프트웨어 시스템의 주요 관심사

  1. 신뢰성 (Reliability)
    • HW/SW 결함, 휴먼 에러 등에 직면하더라도 시스템은 지속적으로 올바르게 동작해야 함
  2. 확장성 (Scalability)
    • 시스템의 데이터 양, 트래픽 양, 복잡도가 증가하면서 이를 처리할 수 있는 적절한 방법이 있어야 함
  3. 유지보수성 (Maintainability)
    • 모든 사용자가 시스템 상에서 생산적으로 작업할 수 있게 해야 함

신뢰성

소프트웨어에 대한 기대치

  • 애플리케이션은 사용자가 기대한 기능을 수행함

  • 시스템은 사용자가 범한 실수나 예상치 못한 소프트웨어 사용법을 허용할 수 있음

  • 시스템 성능은 예상된 부하와 데이터 양에서 필수적인 사용 사례를 충분히 만족함

  • 시스템은 허가되지 않은 접근과 오남용을 방지함

결함 ≠ 장애

  • 결함: 사양에서 벗어난 시스템의 한 구성 요소
    • 결함 확률을 0으로 줄이는 것은 불가능

    • → 결함으로 인해 장애가 발생하지 않도록 내결함성 구조 를 설계해야 함

      • 고의적으로 결함을 유도함으로써 훈련 및 테스트 수행
  • 장애: 사용자에게 필요한 서비스를 제공하지 못하고 시스템 전체가 멈춘 경우

결함 대처 방법

  • HW
    • 소프트웨어 내결함성 기술 사용

    • 하드웨어 중복성 추가 → 전체 장비의 손실을 견딜 수 있도록

  • SW
    • 시스템의 가정과 상호작용에 대해 주의깊게 생각

    • 빈틈없는 테스트

    • 프로섹스 격리

    • 죽은 프로세스의 재시작 허용

    • 프로덕션 환경에서 시스템 동작 측정

    • 모니터링, 분석하기

      • 시스템 동작 중 경고 알림 발생 등
  • 휴먼 에러
    • 오류의 가능성을 최소화하는 방향으로 시스템 설계
      • 사람이 가장 많이 실수하는 부분에서 사람의 실수로 장애가 발생할 수 있는 부분 분리 (비 프로덕션 샌드박스 제공)
    • 단위 테스트 → 전체 시스템 통합 테스트 + 수동 테스트까지 모든 수준에서 철저하게 테스트

    • 휴먼 에러를 빠르고 쉽게 복구할 수 있도록 설계

    • 성능 지표, 오류율 같은 상세한 모니터링 지표 마련

확장성

성능 저하의 흔한 이유 중 하나는 부하 증가!

시스템의 현재 부하 기술

  • 부하 매개변수로 나타낼 수 있음
    • 웹 서버의 초당 요청 수

    • 데이터베이스의 읽기 : 쓰기 비율

    • 동시 활성 사용자

    • 캐시 적중률 등

  • 평균적인 경우 또는 소수의 극단적인 경우를 분석하여 대처

성능 기술

부하가 증가할 때 어떤 일이 일어날지 예측하려면 성능 수치가 필요함

  • 처리량

  • 응답 시간 (분포 → 중앙값 또는 상위 백분위값으로 보통 판단함)

백분위 모니터링

상위 백분위는 여러번 호출되는 백엔드 서비스에서 특히 중요함.

병렬로 호출해도 최종 사용자 요청은 병렬 호출 중 가장 느린 호출이 완료되길 기다려야 함 → 작은 비율의 호출만 느려도 최종 사용자 요청이 여러 번 백엔드를 호출하면 느린 호출이 발생할 가능성이 증가함. ⇒ 꼬리 지연 증폭

  • 지속적으로 백분위를 효율적으로 계산
    • 1분마다 구간 내 중앙값과 기타 백분위를 계산해 각 지표를 그래프에 그리기

    • forward decay

    • t-digest

    • Hdr Histogram

  • 백분위 평균은 수학적으로 의미가 없음

  • 히스토그램을 이용하여 응답 시간 데이터 집계

부하 대응 접근 방식

  • 아키텍처 결정 요소
    • 읽기의 양, 쓰기의 양, 저장할 데이터의 양, 데이터의 복잡도, 응답 시간 요구사항, 접근 패턴 등
  • 애플리케이션의 주요 동작이 무엇이고, 잘 하지 않는 동작은 무엇인지에 대한 가정을 바탕으로 구축 → 부하 매개변수

유지보수성

  • 소프트웨어 비용의 대부분은 유지보수에 들어감
    • 버그 수정, 시스템 운영 유지, 장애 조사, 새로운 플랫폼 적응, 새 사용 사례를 위한 변경, 기술 부채 상환, 새로운 기능 추가 등
  • 레거시 소프트웨어를 만들지 않게끔 설계하기 위한 설계 원칙
    • 운용성 (operability)
      • 운영팀이 시스템을 원할하게 운영할 수 있게 쉽게 만들기
    • 단순성 (simplicity)
      • 복잡도를 최대한 제거해 새로운 엔지니어가 시스템을 이해하기 쉽게 만들기
    • 발전성 (evolvability)
      • 엔지니어가 이후에 시스템을 쉽게 변경할 수 있게 만들기

      • 유연성, 수정 가능성, 적응성

운용성

  • 시스템 상태 모니터링 및 빠른 복원

  • 시스템 장애, 성능 저하 등의 문제 원인 추적

  • 보안 패치 등 소프트웨어와 플랫폼을 최신 상태로 유지

  • 다른 시스템이 서로 어떻게 영향을 주는지 확인 → 문제가 생길 수 있는 변경 사항 차단

  • 발생 가능한 문제를 예측해 문제가 발생하기 전 해결

  • 배포, 설정 관리 등 도구 마련

  • 설정 변경으로 생기는 시스템 보안 유지보수

  • 예측 가능한 운영과 안정적인 서비스 환경을 유지하기 위한 절차 정의

단순성

  • 복잡도를 줄이기 위한 도구 ⇒ 추상화
    • 많은 세부 구현을 숨길 수 있음

    • 다른 애플리케이션에도 사용 가능

    • 비슷한 기능을 여러번 재구현하지 않아도 됨

This post is licensed under CC BY 4.0 by the author.