책/데이터 중심 애플리케이션 설계

데이터 중심 애플리케이션 설계 - 1. 신뢰할 수 있고 확장 가능하며 유지보수하기쉬운 애플리케이션

lingi04 2023. 12. 26. 20:45
  • 오늘날 많은 애플리케이션은 데이터 중심적
    • 애플리케이션의 성능은 CPU 성능보다는 데이터의 양, 복잡도, 변화 속도에 영향을 받는다.
  • 데이터 시스템
    • 데이터베이스 : 데이터를 저장
    • 캐시 : 읽기 속도 향상을 위하여 값비싼 수행 결과를 기억
    • 검색 색인 : 사용자가 키워드로 데이터를 검색하거나 다양한 방법으로 필터링할 수 있게 제공
    • 스트림 처리 : 비동기 처리를 위해 다른 프로세스로 메세지 보내기
    • batch 처리 : 주기적으로 대량의 누적된 데이터를 분석

데이터 시스템에 대한 생각

  • 데이터베이스, 큐, 캐시 등 다른 범주에 속한 도구로 생각이 되지만 데이터 시스템이라는 포괄적인 용어로묶어야함.
    • 분류간 경계가 흐려지고 있고
      • redis, apache kafka
    • 많은 애플리케이션이 단일 도구로는 더 이상 데이터처리와 저장 모두를 만족시킬 수 없는 과도하고 광범위한 요구사항을 갖고 있다.
  • 좋은 데이터 시스템 설계를 위해 고려해야할것
    • 신뢰성, 확장성, 유지보수성

신뢰성

소프트웨어의 경우 일반적인 기대치는 아래와 같다.

  • 애플리케이션은 사용자가 기대한 기능을 수행한다.
  • 시스템은 사용자가 범한 실수나예상치 못한 소프트웨어 사용법을 허용할 수 있다.
  • 시스템 성능은 예상된 부하와 데이터 양에서필수적인사용 사례를 충분히 만족한다.
  • 시스템은 허가되지않은 접근과 오남용을 방지한다.

⇒ 신뢰성을 ‘무언가 잘못되더라도 지속적으로올바르게 동작함.’ 으로 이해할 수 있다.

보안과 관련된 문제는 해결책이 없어 예방책이 더 좋은 경우이지만 이 책에선 해결책이 있는 결함에 대해 다룬다.

결함과 장애

  • 결함 :
    • 잘못될 수 있는 일을 뜻함.
    • 결함을 예측하고대처할 수 있는 시스템을 내결함성 또는 탄력성을 지녔다고 말함.
    • 사양에서 벗어난 시스템의 한 구성 요소
  • 장애:
    • 사용자에게 필요한 서비스를 제공하지 못하고 시스템 전체가 멈춘 경우

결함 확률을 0으로 줄이는 것은 불가. 대개 결함으로 인해 장애가 발생하지 않게끔 내결함성 구조를 설계하는 것이 가장 좋다.

하드웨어 결함

  • 규모가 큰 데이터센터에서 하드웨어 결함은 늘상 일어나는 일.
  • 하드웨어 구성 요소에 중복을추가하는 방법이 일반적
    • 디스크를 raid 구성으로 설치
    • 서버는 이중 전원 디바이스와 핫 스왑 가능한 cpu
    • 데이터센터는 건전지와 예비 전원용 발전기
  • 고가용성이 절대적으로 필수적인 소수의 애플리케이션에서만 필요했지만
    • 애플리케이션의 규모가 커지면서(계산량, 데이터량 증가) 많은 수의 장비를 사용하게 되었고
    • 클라우드플랫폼을 많이 사용하게 되면서
    • 소프트웨어 내결함성 기술을 사용하거나 하드웨어 중복성을 추가해 전체 장비의 손실을 견딜 수 있는 시스템으로 점점 옮겨가고 있다.

소프트웨어 오류

  • 시스템 내 체계적 오류
    • 노드간 상관관계 때문에(상관관계가 없는 하드웨어 결함 보다) 시스템 오류를 더욱 많이 유발함.
      • 리눅스 커널 윤초 버그
      • 공유 자원을 과도하게 사용하는 일부 프로세스
      • 시스템의 속도가느려져 반응이 없거나잘못된 응답을 반환하는 서비스
      • 한 구성 요소의 결함이다른 구성 요소의 결함 야기. 연쇄장애
  • 특정 상황에 의해 발생하기 전까지 오랫동안 나타나지 않는다.[11]
  • 신속한 해결책은 없다.
    • 시스템의 가정과 상호작용에 대해서 주의깊게 생각
    • 빈틈 없는 테스트
    • 프로세스 격리
    • 죽은 프로세스의 재시작 허용(?)
    • 프로덕션 환경에서 시스템 동작의 측정
    • 모니터링
    • 이상동작에 대해 알람 걸어놓기

인적 오류

  • 운영자의 설정 오류가 중단의주요원인. 하드웨어결함은 10~25%
  • 사람은 미덥지 않다.. 그럼에도 신뢰성 있는 소프트웨어를 만들기위해선
    • 오류의 가능성을 최소화하는 방향으로 시스템을 설계하라.
      • 잘 설계된 추상화, API, 관리 인터페이스
    • sandbox 환경을 제공.
      • 실제 데이터를 볼 수 있지만 사용자에게는 영향이 없도록
    • 모든 수준에서 철저히 테스트
      • 단위 테스트, 전체 시스템 통합 테스트, 수동 테스트까지
    • 인적 오류를 빠르게 복구할 수 있도록
      • 설정 변경은 빠르게 롤백 가능하게, 새로운 코드는 서서히 롤 아웃
    • 상세하고명확한 모니터링 대책 마련
      • 성능 지표와 오류율 등
    • 조작 교육과 실습 실행

확장성

  • 증가한부하에 대처하는 시스템 능력을 설명하는 데 사용
  • 확장성을 논한다는 것은
    • 확장성이 있나?없나? 같은 것이 아니고
    • 시스템이 특정 방식으로 커지면 대처하기 위해 어떤 선택을 할것인가?, 추가 부하를 다루기 위해 계산 자원을 어떻게 투입할까? 를 고민하는 문제.

부하 기술하기

  • 부하 매개변수 선택은 시스템 설계에 따라달라짐.
    • 웹 서버의 초당 요청 수
    • DB의 읽기/쓰기 비율
    • 대화방의 동시 활성 사용자
    • 캐시 적중률
  • 트위터를 예로들면
    • 초당 12000건 쓰기?
    • fan-out?

성능 기술하기

  • 성능 측정 방법
    • 부하 매개변수를 증가시키고 시스템자원은 변경하지 않으면 성능은어떤 영향으 ㄹ받을까?
    • 부하 매개변수를 증가시켰을 때 성능이 변하지 않고 유지되길 원한다면 자원은 얼마나 많이늘려야 할까?
  • 기술 방법
    • 평균 응답 시간
    • 백분위 - 중앙값
    • 백분위 - 95, 99, 99.9분위(p95, p99, p999)
      • 꼬리 지연 시간 이라고부름
      • 아마존은 내부 서비스의 응답시간 요구사항을 p999 로 기술함. 1000명 중 1명의 고객이지만 구매를 많이 해서 계정에 가장 많은 데이터를 갖고있는 소중한 고객
      • SLA에서도 사용
      • 큐 대기 지연(queueing delay) 에도 중요함. 선두 차단(head-of-line blocking) 때문

부하 대응 접근방식

  • Scale up (용량 확장, 수직 확장) 과 Scale out (규모 확장, 수평 확장) 을 적절히
    • 다수의 장비에 상태 비저장 서비스를 배포하는 일은상당히 간단함.
    • 단일 노드에 상태 유지 데이터 시스템을 분산 설치 하는 것은 복잡도가 크기때문에 고가용성 요구가 있을 때까지 단일 노드에 DB를 유지하여 scale up 하는게 통념.
  • 범용적이고모든 상황에 맞는 확장 아키텍처는 없다.
    • 읽기의 양
    • 쓰기의 양
    • 저장할 데이터의 양
    • 데이터의 복잡도
    • 응답 시간 요구사항
    • 접근 패턴
    • 등 여러 요소를 따져보고 적절한 아키텍처를 선택해야함
  • 스타트업들은 빠르게 반복해서제품 기능 갯너 작업 하는게 좀 더 중요

유지보수성

소프트웨어 비용의 대부분은 유지보수에 들어감.

레거시 소프트웨어를 직접 만들지 않게끔 소프트웨어를 설계해야 한다.

아래와 같은 세 원칙이 있다.

운용성: 운영의 편리함 만들기

  • 동일하게 반복 되는 태스크를 쉽게 수행하게끔 만들어 운영팀이 고부가가치 활동에 노력을 집중할 수 있는 환경
  • 모니터링, 런타임 도앚꽈 시스템의 내부에 대한 가시성
  • 자동화!!
  • 개별장비 의존성 회피 등
  • 좋은 문서와 이해하기 쉬운운영 모델
  • 만족할 만한 기본동작 제공, 필요할때 값을 변경할 수 있도록
  • 적절한 자기 회복 & 관리자가 시스템 상태 수동 제어 할 수 있도록
  • 예측 가능하게 동작 & 예기치 않은 상황 최소화

단순성: 복잡도 관리

  • 개발자가 시스템을 이해하고 추론하기 어려워지면 시스템에 숨겨진 가정과 의도치 않은 결과 및 예기치 않은 상호작용을 간과하기 쉽다.
    • 같은 repository 안에 naming 규칙이 다름
    • 같은 개념인데 다른 naming
    • 임시방편으로 문제를 해결한 특수 사례
  • 추상화를 통해 우발적인 복잡도를 줄이자.

발전성: 변화를 쉽게 만들기

  • 시스템의 요구사항은 끊임없이 발전한다.
    • 예기치 않은 사용 사례
    • 법적 규제 변경
    • 시스템의 성장으로 인한 아키텍처 ㅂ녀경
  • 조직 프로세스 측면에서 애자일 작업 패턴
    • 자주 변화하는 환경에서 소프트웨어를 개발할 때 도움이 되는 기술 도구와 패턴
      • TDD
      • refactoring
  • 간단하고 이해하기 쉬운 시스템을 만들기