본문 바로가기

Studying/Data System Design

신뢰성, 확장성, 유지보수성 [데이터 중심 애플리케이션 설계 1장]

  1. 신뢰성: 하드웨어나 소프트웨어 결함, 심지어 인적 오류(human error) 같은 역경에 직면하더라도 시스템은 지속적으로 올바르게 동적(원하는 성능 수준에서 정확한 기능을 수행)해야 한다.
    1. 올바르게 동작이라는 것은 “무언가 잘못되더라도 지속적으로 올바르게 동작함”을 의미한다.
    2. 잘못될 수 있는 일은 결함(fault)라고 부른다. 결함에 대처할 수 있는 시스템을 내결함성(fault-tolerant) 또는 탄력성(resilient)를 지녔다고 말한다.
    3. 결함은 장애와 다르다. 장애는 서비스 자체가 멈추는 것이고 결함이 발생해도 장애는 발생하지 않도록 해야 한다.
  2. 확장성: 시스템의 데이터 양, 트래픽 양, 복잡도가 증가하면서 이를 처리할 수 있는 적절한 방법이 있어야 한다.
    1. 트위터 홈 타임라인 구현 방식
      1. 모든 트윗을 한 곳에 저장하고 사용자 별로 팔로우한 유저를 찾고 그 유저들의 모든 트윗을 가져오는 방식
        1. 읽을 때마다 질의가 발생하므로 부하가 커진다.
      2. 개별 사용자 별로 홈 타임라인 캐시를 갖고 있어서 사용자가 트윗을 작성하면 팔로우한 모든 사용자의 타임라인에 저장한다. (쓰기 비용을 늘려 읽기 비용을 낮춘다.)
        1. 읽는 비용이 줄어들어 평균적으로 부하가 작아진다.
        2. 쓰기 비용이 늘어난 것으로 유명인의 트윗의 경우엔 한 번 쓸 때마다 쓰기 비용이 커져서 오히려 힘들다.
    2. 성능을 기술할 때는 단순 평균보다는 분포나 백분위 등을 사용해야 한다.
    3. 부하의 대응 방식에는 수평 확장과 수직 확장이 있는데, 일부 시스템에서는 탄력적(elastic)이다. 탄력적이면 부하 예측이 힘들 때 유용하지만, 복잡하고 운영상 예상치 못 한 일이 발생한다.
    4. 크기가 1KB인 초당 100,000 건의 요청을 처리하는 것과 2GB인 분당 3건의 요청을 처리하는 건 같은 처리량이여도 설계는 매우 다르다.
  3. 유지보수성: 시간이 지남에 따라 여러 다양한 사람들이 시스템 상에서 작업할 것이기 때문에 모든 사요자가 시스템 상에서 생산적으로 작업할 수 있게 해야 한다.
    1. 레거시를 줄이는 시스템 설계 원칙
      1. 운용성
        1. 상태 복원
        2. 자동화
      2. 단순성: 강한 커플링, 의존성, 일관성 없는 명명법, 성능 해결을 위한 해킹 등이 증상
        1. 추상화
      3. 발전성