데이터 중심 애플리케이션 설계 1장
데이터 시스템
애플리케이션 기본 요소
- 데이터베이스
- 캐시
- 검색 색인
- 스트림 처리
- 일괄 처리
소프트웨어 시스템의 주요 관심사
- 신뢰성 (Reliability)
- HW/SW 결함, 휴먼 에러 등에 직면하더라도 시스템은 지속적으로 올바르게 동작해야 함
- 확장성 (Scalability)
- 시스템의 데이터 양, 트래픽 양, 복잡도가 증가하면서 이를 처리할 수 있는 적절한 방법이 있어야 함
- 유지보수성 (Maintainability)
- 모든 사용자가 시스템 상에서 생산적으로 작업할 수 있게 해야 함
신뢰성
소프트웨어에 대한 기대치
애플리케이션은 사용자가 기대한 기능을 수행함
시스템은 사용자가 범한 실수나 예상치 못한 소프트웨어 사용법을 허용할 수 있음
시스템 성능은 예상된 부하와 데이터 양에서 필수적인 사용 사례를 충분히 만족함
시스템은 허가되지 않은 접근과 오남용을 방지함
결함 ≠ 장애
- 결함: 사양에서 벗어난 시스템의 한 구성 요소
결함 확률을 0으로 줄이는 것은 불가능
→ 결함으로 인해 장애가 발생하지 않도록 내결함성 구조 를 설계해야 함
- 고의적으로 결함을 유도함으로써 훈련 및 테스트 수행
- 장애: 사용자에게 필요한 서비스를 제공하지 못하고 시스템 전체가 멈춘 경우
결함 대처 방법
- HW
소프트웨어 내결함성 기술 사용
하드웨어 중복성 추가 → 전체 장비의 손실을 견딜 수 있도록
- SW
시스템의 가정과 상호작용에 대해 주의깊게 생각
빈틈없는 테스트
프로섹스 격리
죽은 프로세스의 재시작 허용
프로덕션 환경에서 시스템 동작 측정
모니터링, 분석하기
- 시스템 동작 중 경고 알림 발생 등
- 휴먼 에러
- 오류의 가능성을 최소화하는 방향으로 시스템 설계
- 사람이 가장 많이 실수하는 부분에서 사람의 실수로 장애가 발생할 수 있는 부분 분리 (비 프로덕션 샌드박스 제공)
단위 테스트 → 전체 시스템 통합 테스트 + 수동 테스트까지 모든 수준에서 철저하게 테스트
휴먼 에러를 빠르고 쉽게 복구할 수 있도록 설계
- 성능 지표, 오류율 같은 상세한 모니터링 지표 마련
- 오류의 가능성을 최소화하는 방향으로 시스템 설계
확장성
성능 저하의 흔한 이유 중 하나는 부하 증가!
시스템의 현재 부하 기술
- 부하 매개변수로 나타낼 수 있음
웹 서버의 초당 요청 수
데이터베이스의 읽기 : 쓰기 비율
동시 활성 사용자
캐시 적중률 등
- 평균적인 경우 또는 소수의 극단적인 경우를 분석하여 대처
성능 기술
부하가 증가할 때 어떤 일이 일어날지 예측하려면 성능 수치가 필요함
처리량
응답 시간 (분포 → 중앙값 또는 상위 백분위값으로 보통 판단함)
백분위 모니터링
상위 백분위는 여러번 호출되는 백엔드 서비스에서 특히 중요함.
병렬로 호출해도 최종 사용자 요청은 병렬 호출 중 가장 느린 호출이 완료되길 기다려야 함 → 작은 비율의 호출만 느려도 최종 사용자 요청이 여러 번 백엔드를 호출하면 느린 호출이 발생할 가능성이 증가함. ⇒ 꼬리 지연 증폭
- 지속적으로 백분위를 효율적으로 계산
1분마다 구간 내 중앙값과 기타 백분위를 계산해 각 지표를 그래프에 그리기
forward decay
t-digest
Hdr Histogram
백분위 평균은 수학적으로 의미가 없음
- 히스토그램을 이용하여 응답 시간 데이터 집계
부하 대응 접근 방식
- 아키텍처 결정 요소
- 읽기의 양, 쓰기의 양, 저장할 데이터의 양, 데이터의 복잡도, 응답 시간 요구사항, 접근 패턴 등
- 애플리케이션의 주요 동작이 무엇이고, 잘 하지 않는 동작은 무엇인지에 대한 가정을 바탕으로 구축 → 부하 매개변수
유지보수성
- 소프트웨어 비용의 대부분은 유지보수에 들어감
- 버그 수정, 시스템 운영 유지, 장애 조사, 새로운 플랫폼 적응, 새 사용 사례를 위한 변경, 기술 부채 상환, 새로운 기능 추가 등
- 레거시 소프트웨어를 만들지 않게끔 설계하기 위한 설계 원칙
- 운용성 (operability)
- 운영팀이 시스템을 원할하게 운영할 수 있게 쉽게 만들기
- 단순성 (simplicity)
- 복잡도를 최대한 제거해 새로운 엔지니어가 시스템을 이해하기 쉽게 만들기
- 발전성 (evolvability)
엔지니어가 이후에 시스템을 쉽게 변경할 수 있게 만들기
유연성, 수정 가능성, 적응성
- 운용성 (operability)
운용성
시스템 상태 모니터링 및 빠른 복원
시스템 장애, 성능 저하 등의 문제 원인 추적
보안 패치 등 소프트웨어와 플랫폼을 최신 상태로 유지
다른 시스템이 서로 어떻게 영향을 주는지 확인 → 문제가 생길 수 있는 변경 사항 차단
발생 가능한 문제를 예측해 문제가 발생하기 전 해결
배포, 설정 관리 등 도구 마련
설정 변경으로 생기는 시스템 보안 유지보수
예측 가능한 운영과 안정적인 서비스 환경을 유지하기 위한 절차 정의
단순성
- 복잡도를 줄이기 위한 도구 ⇒ 추상화
많은 세부 구현을 숨길 수 있음
다른 애플리케이션에도 사용 가능
비슷한 기능을 여러번 재구현하지 않아도 됨