Be-Developer

[대규모 시스템 설계 기초] 01 사용자 수에 따른 규모 확장성

01. 사용자 수에 따른 규모 확장성

정리

  1. 웹 계층은 무상태(statelesS) 계층으로
  2. 모든 계층에 다중화 도입.
  3. 가능한 많은 데이터 캐싱
  4. 여러 데이터 센터 지원
  5. 정적 콘텐츠는 (css, img) CDN으로 서비스
  6. 데이터 계층은 샤딩을 통해 규모 확장
  7. 각 계층은 독립적 서비스로 분할할 것.
  8. 시스템을 지속적으로 모니터링하고 자동화 도구들을 활용할 것.

DB

언제 NoSQL이 좋은가

  • 아주 낮은 응답 지연시간이 요구됨
  • 데이터가 비정형, 관계형이 아님
  • 데이터를 serialize/deserialize 할수있음
  • 아주많은 데이터를 저장할 필요가 있음

    Scale up/ Scale out

  • Scale up : 서버에 고사양 자원(CPU,RAM)등 추가 (수직적 확장)
  • Scale out : 더 많은 서버 추가 (수평적 확장 = 샤딩)
    • 샤드에 보관되는 데이터 사이에는 중복이 없다.
    • 샤딩되고나면 조인이 어려워져서 비정규화하여 하나의 테이블에서 질의가 수행될 수 있도록 해야한다.

      Cache

      애플리케이션의 성능은 DB를 얼마나 자주 호출하느냐에 크게 좌우되는데, 캐시가 완화가능.

  • 데이터 갱신은 자주 일어나지 않지만 참조는 빈번하면 고려해볼만 함.
  • 휘발성 메모리에 저장됨을 기억해야함. 만료되면 삭제되어야함.
  • 저장소의 원본을 갱신하는 연산과 캐시를 갱신하는 연산이 단일 트랜잭션으로 처리되지 않는 경우 이 일관성은 깨질 수 있다.

    stateless 웹 계층

  • 상태정보(사용자 세션 데이터같은 정보)를 웹 계층에서 제거하고, DB등 지속성 저장소에 저장해야한다.
  • 상태 의존적인 서버는 같은 클라의 요청은 같은 서버로 가야하고, 이는 로드밸런서에 부담이 된다. & 장애처리가 힘들다.

    메시지 큐

  • 메시지의 무손실,비동기 통신을 지원한다. (메시지큐에 일단 보관된 메시지는 소비자가 꺼낼때까지 안전)
  • 비동기통신으로 서버간 결합이 느슨해져 규모확장성이 보장되어야하는 안정적인 애플리케이션 구성에 좋다. ##

서적

  • 가상 면접 사례로 배우는 대규모 시스템 설계 기초