[데이터 중심 애플리케이션 설계] 01장

book-cover

[DDIA] 1장. 신뢰성·확장성·유지보수성을 갖춘 데이터 시스템

읽은 책: Designing Data-Intensive Applications (Martin Kleppmann)
목표: “데이터 중심 애플리케이션”을 설계할 때 무엇을 우선순위로 봐야 하는지 큰 그림 잡기


0. 이 장이 던지는 질문

현대 애플리케이션은 단순히 “DB 하나”로 끝나지 않는다.
캐시, 검색 인덱스, 메시지 큐, 스트림/배치 처리 등 여러 컴포넌트가 엮여 데이터 시스템을 이룬다.

이 장의 핵심 질문은 이거다:

  • 시스템이 커지고 복잡해져도 얼마나 믿을 수 있는가? (Reliability)
  • 트래픽/데이터가 늘어나도 버틸 수 있는가? (Scalability)
  • 팀과 코드가 바뀌어도 운영/개선이 가능한가? (Maintainability)

1. 데이터 중심 애플리케이션이란?

일반적인 애플리케이션은 “계산(Compute)”보다 “데이터(Data)”가 중심이 되는 경우가 많다.
그래서 성능/안정성/개발 난이도의 병목이 데이터 계층에서 터지기 쉽다.

대표적인 데이터 시스템 구성요소:

  • 데이터베이스 (DB)
  • 캐시
  • 검색 인덱스
  • 스트림 처리/메시지 큐
  • 배치 처리 시스템

중요 포인트:

  • 각각은 “데이터를 다루는 목적이 다름”
  • 한 컴포넌트만 최적화해도 전체가 좋아지지 않음(시스템 관점 필요)

2. 신뢰성(Reliability): “정상적으로 계속 동작하는가?”

2.1 신뢰성의 의미

  • 사용자가 기대한 기능을 올바르게 수행
  • 장애/실수/예상치 못한 상황에서도 가능한 한 정상 서비스 유지
  • 장애가 나더라도 “피해를 제한하고 복구 가능”해야 함

2.2 장애(Fault) vs 고장(Failure)

  • Fault: 구성 요소 일부가 잘못되는 상황(디스크 불량, 네트워크 단절, 버그 등)
  • Failure: 시스템 전체가 사용자에게 서비스를 못하는 상태

즉, fault는 피할 수 없고, 설계로 failure로 번지지 않게 해야 한다.

2.3 현실에서 흔한 fault 원인

  • 하드웨어 문제(디스크, 메모리, 전원, 네트워크)
  • 소프트웨어 문제(버그, 메모리 릭, 리소스 고갈, 의존성 장애)
  • 사람 문제(잘못된 배포, 설정 실수, 운영 절차 미흡)

2.4 신뢰성을 높이는 전형적인 접근

  • 중복(Replication), 페일오버, 롤백
  • 격리(격리된 배포/점진적 롤아웃), 제한(레이트 리밋)
  • 관측성(로그/메트릭/트레이싱), 장애 대응 프로세스

개인 메모: “장애 0”은 목표가 아니라 환상.
목표는 장애가 나도 서비스가 망가지지 않는 구조빨리 복구하는 능력.


3. 확장성(Scalability): “부하가 늘면 어떻게 대응할까?”

확장성은 “현재 빠르다”가 아니라, 부하가 증가할 때 성능을 유지/개선할 수 있는 능력이다.

3.1 먼저 부하(Load)를 정의해야 한다

확장 설계는 감으로 하면 망한다.
다음 같은 부하 파라미터를 수치로 잡는 게 출발점이다.

  • 초당 요청 수(QPS)
  • 읽기/쓰기 비율
  • 활성 사용자 수
  • 데이터 크기(총 저장량, 인덱스 크기)
  • 이벤트/메시지 처리량(초당 n건)

3.2 성능(Performance) 측정은 평균이 아니라 “꼬리”가 중요

사용자는 “평균”이 아니라 느린 순간을 체감한다.

  • 지연시간(latency): 요청 1건이 끝날 때까지 걸리는 시간
  • 처리량(throughput): 단위 시간당 처리한 요청 수

지연시간은 보통 퍼센타일(p95, p99)로 본다.

  • p95: 95% 요청이 이 시간 이내에 끝남
  • p99: 99% 요청이 이 시간 이내에 끝남 (꼬리 지연)

운영 관점에선 p99가 흔히 “사용자 불만”과 직결된다.

3.3 확장 전략: 스케일 업 vs 스케일 아웃

  • 스케일 업(수직 확장): 더 좋은 서버로 교체
    • 장점: 단순함
    • 단점: 한계/비용/단일 장애 지점 위험
  • 스케일 아웃(수평 확장): 서버 수를 늘림
    • 장점: 더 큰 규모까지 가능
    • 단점: 분산 시스템 복잡도(데이터 분할, 일관성, 장애처리)가 급상승

4. 유지보수성(Maintainability): “미래의 내가 고칠 수 있는가?”

이 장에서 유지보수성은 크게 3가지로 쪼갠다.

4.1 운용성(Operability)

  • 운영하기 쉬운 시스템인가?
  • 모니터링/배포/복구/문서화/자동화가 갖춰져 있는가?

4.2 단순성(Simplicity)

  • 복잡도를 줄였는가?
  • “우발적 복잡도(불필요한 복잡함)”를 제거했는가?

복잡도가 쌓이면:

  • 장애 원인 파악이 느려짐
  • 변경 비용이 폭증
  • 신규 인원이 온보딩 불가

4.3 발전성(Evolvability)

  • 요구사항이 바뀌었을 때 확장/변경 가능한 구조인가?
  • 새로운 기능 추가가 “기존을 망가뜨리지” 않는가?

개인 메모: 유지보수성은 성능보다 뒤에 밀리기 쉽지만,
규모가 커질수록 “개발 속도” 자체를 결정한다.


5. 이 장의 결론: 좋은 데이터 시스템의 3요소

정리하면, 데이터 중심 시스템 설계의 핵심은:

  1. 신뢰성: 부분 장애가 전체 실패가 되지 않게
  2. 확장성: 부하를 수치로 정의하고, 꼬리 지연을 관리하며
  3. 유지보수성: 운영·단순성·발전성을 확보하는 것

그리고 중요한 전제:

  • 이 세 가지는 항상 트레이드오프가 존재한다.
  • 정답은 없고, “현재의 요구사항 + 미래의 변화”를 기준으로 선택해야 한다.

6. 내가 적용해볼 체크리스트

  • 우리 서비스의 부하 파라미터(QPS/읽기쓰기 비율/데이터 크기)를 숫자로 말할 수 있나?
  • 평균 latency 말고 p95/p99를 보고 있나?
  • 장애가 났을 때 “어떻게 탐지하고, 어디서 복구하고, 얼마나 걸리는지”가 정의돼 있나?
  • 구성 요소가 늘어나는 만큼 관측성과 운영 자동화가 따라가고 있나?

7. 한 줄 요약(5줄)

  • 데이터 중심 앱은 여러 데이터 시스템이 엮인 “시스템”이다.
  • 신뢰성은 fault를 전제로 failure를 막는 설계다.
  • 확장성은 부하를 정의하고, 퍼센타일 지연을 관리하는 능력이다.
  • 유지보수성은 운영성/단순성/발전성으로 설명된다.
  • 결국 설계는 트레이드오프 선택이며, 요구사항을 수치화하는 게 시작점이다.

Leave a comment