본문 바로가기

인프라,데이터

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

어떻게 많은 데이터를 잘 보관할 것인가?

보관된 데이터는 어떻게 효율적으로 사용할 수 있는가?

성숙한 오픈소스와 훌륭한 개발자들이 작성한 코드가 모든 작업 부하에 잘 작동한다는 보장이 없기 때문에 시스템 설계와 솔루션 선택은 사람의 직관에 의존할 수밖에 없다.

- 역자 서문

 

데이터 중심적

  • 데이터 양, 데이터 복잡성, 데이터가 변하는 속도 등 데이터가 주요 과제인 애플리케이션
  • 오늘날 많은 애플리케이션은 데이터 중심적이다.

 

계산 중심적(compute-intensive)

  • CPU 사이클이 병목인 경우

 

샤딩

  • "조각내다." 라는 뜻의 데이터베이스 저장 기법. 네트워크를 분할하고, 트랜젝션을 영역별로 저장하고, 병렬 처리한다.

 

ACID : 데이터베이스 트랜잭션이 안전하게 수행된다는 것을 보장하기 위한 성질을 가리키는 약어

  • Atomicity 원자성 : 트랜잭션과 관련된 작업들이 부분적으로 실행되다가 중단되지 않는 것을 보장하는 능력
  • Consistency 일관성 : 트랜잭션이 실행을 성공적으로 완료하면 언제나 일관성 있는 데이터베이스 상태로 유지하는 것
  • Isolation 독립성 : 트랜잭션을 수행 시 다른 트랜잭션의 연산 작업이 끼어들지 못하도록 보장하는 것
  • Durability 지속성 : 성공적으로 수행된 트랜잭션은 영원히 반영되어야 함. 

 

CAP 정리

  • Consistency 일관성 : 어떤 노드에 연결되었는지와 무관하게 모든 클라이언트가 동시에 동일 데이터를 볼 수 있음
  • Availability 가용성 : 하나 이상의 노드가 작동 중지된 경우에도 데이터를 요청하는 클라이언트가 응답을 받음
  • Partition tolerance 파티션 허용 : 노드 간의 다수의 통신 단절에도 불구하고 클러스터가 계속해서 작동해야 함

-> 분산 시스템은 위 3개의 특성 중 원하는 2개만 제공할 수 있음


 

1. 데이터 시스템의 기초

  • 내부적으로 문제가 있어도 데이터를 정확하고 완전하게 유지하려면 어떻게 해야 할까?
  • 시스템의 일부 성능이 저하되더라도 클라이언트에 일관되게 좋은 성능을 어떻게 제공할 수 있을까?
  • 부하 증가를 다루기 위해 어떻게 규모를 확장할까?
  • 서비스를 위해 좋은 API는 어떤 모습일까?

 

신뢰성

  • 하드웨어나 소프트웨어 결함, 사람의 에러가 있더라도 시스템은 지속적으로 올바르게 동작해야 한다.
  • 내결함성/탄력성 : 결함을 예측하고 대처할 수 있는 시스템. 결함으로 인해 장애가 발생하지 않게끔 내결함성 구조를 설계하는 것이 가장 좋다. 
  • 소프트웨어 내결함성 기술을 사용하거나, 하드웨어 중복성을 추가해 전체 장비의 손실을 견딜 수 있는 시스템으로 점점 옮겨가고 있다.

확장성

  • 시스템의 데이터 양, 트래픽 양, 복잡도가 증가해도 이를 적절하게 처리할 수 있어야 한다.

유지보수성

  • 시간이 지남에 따라 새로운 사용자도 시스템 상에서 생산적으로 작업할 수 있게 해야 한다. 

 


성능 기술 - 지연 시간

  • 평균보다는 백분위(percentile)을 사용하는 편이 더 좋다.
  • 사용자가 보통 얼마나 오랫동안 기다려야 하는지 알고 싶다면 중간 지점인 중앙값(median)이 좋은 지표다.
  • 일반적으로 99분위 - 요청 1,000개 중 1개만 영향이 있는 상황에서 최적화가 필요하다.
  • 응답 시간이 가장 느린 요청을 경험한 고객들은 많은 구매를 해서 고객 중에서 계정에 가장 많은 데이터를 갖고 있기 때문이다. 
  • 응답 시간이 100밀리초 증가하면 판매량이 1% 줄어들고, 1초가 느려지면 고객 만족도 지표는 16% 줄어든다. 

 

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

시스템이 지속해서 원활하게 작동하려면 운영팀이 필수다. 좋은 운영팀은 일반적으로 다음과 같은 작업 등을 책임진다.

  • 시스템 상태를 모니터링하고 상태가 좋지 않다면 빠르게 서비스를 복원
  • 시스템 장애, 성능 저하 등의 문제의 원인을 추적
  • 보안 패치를 포함해 소프트웨어와 플랫폼을 최신 상태로 유지
  • 다른 시스템이 서로 어떻게 영향을 주는지 확인해 문제가 생길 수 있는 변경 사항을 손상을 입히기 전에 차단
  • 미래에 발생 가능한 문제를 예측해 문제가 발생하기 전에 해결

좋은 운영성이란 동일하게 반복되는 태스크를 쉽게 수행하게끔 만들어 운영팀이 고부가가치 활동에 노력을 집중한다는 의미다.

  • 모니터링 툴, 표준 도구를 이용해 자동화, 개별 장비 의존성 회피

 

추상화

  • 고수준 프로그래밍 언어는 기계 언어, CPU 레지스터, 시스템 호출을 숨긴 추상화다.
  • SQL은 디스크에 기록하고 메모리에 저장한 복잡한 데이터 구조와 다른 클라이언트의 동시 요청과 고장 후 불일치를 숨긴 추상화다.