대규모 시스템 설계를 해본적이 없으니.. 궁금해서 해당 책을 읽어봤습니다.

책의 전반적인 내용은 어렵지 않습니다. 왜냐하면 내용이 깊게 들어가지 않고 말그대로 설계를 하기 때문에 생각보다 읽는데는 쉽다고 느껴졌습니다.

깊게 들어가면 어렵겠지만 책에서는 아주 깊게 들어가지는 않은 것 같아요.

책의 챕터는 12장 정도로 돼어 있으며, 챕터마다 설계해야 하는 서비스가 다릅니다.
책의 내용은 가상 면접을 하는 것처럼 면접관이 프로젝트에 대해 설계를 요청하면, 면접자는 해당 프로젝트의 서비스의 목적과 규모 등에 맞게 질문과 답변을 하는 방식입니다.

책을 읽으면서 인상적인 몇몇 키워드 및 조금 더 알아봐야 겠다고 정리한 것은 아래의 항목입니다.

  • DB 데이터 다중화와 샤딩(안정 해시를 통한 키 재배치 방법)
  • API 처리율 제한(Dos 공격 및 자원 방지, 비용 절감, 서버 과부하 방지)
  • Redis 효율적으로 사용하기(선착순 이벤트, SNS 좋아요, 방문자 수 count 등)
  • AWS S3 업로드 시 이어올리기 및 데이터 압축 등으로 비용 감소
  • 메시지 큐를 이용하여 컴포넌트 사이의 결합도 낮추기
  • 검색어 자동완성 구조 및 원리
  • 트라이 자료구조에 대해서
  • 서비스될 프로젝트의 사용자 유입량 계산
  • 서비스될 프로젝트의 하드웨어 스팩 계산

이중 몇가지는 실제로 구현(API 처리율 제한, AWS S3, 메시지 큐 등) 해봤지만.. 어디선가 한번쯤 들어봤는데 제대로 모르는 샤딩에 대해 정리했습니다.

실제로 써보진 않았지만 써야할 때가 되면 그래도 도움이 되지 않을까라는 생각으로 찾아보다보니 쓸 일이 있을까라는 생각도 드네요.. 그래도 알아두면 좋을 것 같아 정리했습니다.

데이터 다중화와 샤딩

서비스가 점점 커지면 데이터베이스를 증설이 필요할 때가 있습니다. 이럴 때 데이터 다중화와 샤딩은 대규모 데이터베이스 시스템에서 성능 및 확장성을 향상시킬 수 있습니다.

데이터 다중화는 동일한 데이터를 여러 위치에 중복 저장하는 것을 의미합니다. 이는 데이터의 가용성을 향상시키고 장애 시 복구를 용이하게 합니다.

  1. 데이터 다중화(Data Replication)

    장점

    • 고가용성(High Availability): 복제된 데이터는 여러 노드에 분산되어 있기 때문에 하나의 노드가 다운되더라도 다른 노드에서 데이터를 제공할 수 있습니다.
    • 읽기 성능 향상: 복제된 노드 중 하나를 읽기 전용으로 사용하여 읽기 성능을 향상시킬 수 있습니다.

    단점

    • 쓰기 지연성(Write Latency): 모든 복제본을 일관되게 유지하려면 쓰기 작업이 모든 복제본에 반영되어야 하므로 쓰기 지연이 발생할 수 있습니다.
    • 일관성 유지 어려움: 여러 복제본 간의 일관성을 유지하기 위해 복잡한 동기화 및 복제 알고리즘이 필요합니다.
  2. 샤딩(Sharding)

    샤딩은 대량의 데이터를 분할하여 샤드(shard)라고 불리는 작은 단위로 분할하는 기술을 의미합니다. 각 샤드는 고유한 데이터 서브셋을 관리하며, 모든 샤드의 조합이 전체 데이터 세트를 형성합니다. 샤딩 전략을 쓸 때는 샤딩 키를 어떻게 분산할지가 중요하다고 합니다.
    여러 데이터베이스에 골고루 데이터를 분산하기 위해 안정 해시 기법을 이용하여 해당 문제를 해결할 수 있습니다.
    이외에도 유명인사(celebrity) 문제로 여러 유명인사가 특정 샤드에 집중되어 있으면 해당 샤드에서만 데이터의 과부하가 걸릴 수 있습니다.

    장점

    • 수평 확장성(Horizontal Scalability): 데이터베이스의 용량을 늘리려면 단순히 더 많은 샤드를 추가하면 됩니다.
    • 높은 읽기 및 쓰기 처리량: 각 샤드는 독립적으로 작동하므로 동시에 여러 샤드에서 읽기 및 쓰기 작업이 가능합니다.

    단점

    • 쿼리 복잡성: 데이터가 여러 샤드에 분산되어 있기 때문에 쿼리가 여러 샤드에서 실행되어야 하는 경우 데이터를 조합하는 추가적인 작업이 필요할 수 있습니다.
    • 일부 샤드 다운 영향: 특정 샤드에 장애가 발생하면 해당 샤드에 속한 데이터에 액세스하는 부분에서 문제가 발생할 수 있습니다.

참조