280. 샤딩 (Sharding)

핵심 인사이트 (3줄 요약)

  1. 본질: 샤딩은 데이터를 여러 노드에 분산 저장하는 기법으로, 샤드 키(Shard Key)를 기반으로 데이터를 파티셔닝하여 각 노드가 전체 데이터의 일부를 담당하게 한다.
  2. 가치: 대용량 데이터 처리, 읽기/쓰기 부하 분산, 수평적 확장성, 고가용성 등을 제공하며, 대규모 애플리케이션에 필수적이다.
  3. 융합: 해시 샤딩, 레인지 샤딩, 일관된 해싱, 몽고DB, Cassandra, 수평 확장과 밀접하게 연관된다.

Ⅰ. 개요 및 필요성 (Context & Necessity)

개념 정의

샤딩(Sharding)은 데이터를 물리적으로 분리된 여러 노드(샤드)에 분산 저장하는 수평 파티셔닝 기법이다. 샤드 키(Shard Key)를 기반으로 데이터를 분할하며, 각 샤드는 전체 데이터의 일부를 담당한다.

필요성

단일 데이터베이스服务器的 용량과 처리능력에는 한계가 있다. 데이터量가 증가하면 저장 공간이 부족해지고, 동시 요청이 증가하면 성능이 저하된다. 샤딩을 통해 데이터를 분산 저장하면 이러한 한계를 극복할 수 있다.

배경

샤딩은 2000년대 후반 대규모 웹 애플리케이션(MongoDB, MySQL, PostgreSQL 등)에서 널리 사용되기 시작했다. 현재는 대부분의 분산 데이터베이스에서 지원하는 핵심 기능이다.

비유

샤딩은大型도서관의 분관과 같다. 모든 책을 한 건물에 두지 않고, 분야별로 여러 분관에分散配置한다. 찾는 책의 분야를 알면 해당 분관만 방문하면 되어 효율적이다.

📢 섹션 요약: 샤딩은 데이터를 여러 노드에 분산 저장하는 수평 파티셔닝 기법으로, 대규모 데이터 처리에 필수적이다.


Ⅱ. 아키텍처 및 핵심 원리 (Deep Dive)

샤딩 동작 구조

┌─────────────────────────────────────────────────────────────────────────────┐
│                    샤딩 동작 구조                                              │
├─────────────────────────────────────────────────────────────────────────────┤
│                                                                             │
│  [샤딩 전]                                                                 │
│                                                                             │
│       ┌─────────────────────────────────────────────────────────────┐      │
│       │                  단일 데이터베이스                              │      │
│       │                                                              │      │
│       │  customers: [C001, C002, C003, C004, C005, ...]            │      │
│       │                                                              │      │
│       │  ※ 모든 읽기/쓰기가 단일 서버로 집중                         │      │
│       └─────────────────────────────────────────────────────────────┘      │
│                                                                             │
│  [샤딩 후]                                                                 │
│                                                                             │
│       ┌──────────────┐   ┌──────────────┐   ┌──────────────┐           │
│       │   Shard 1    │   │   Shard 2    │   │   Shard 3    │           │
│       │  (서울 DC)   │   │  (부산 DC)   │   │ (인천 DC)    │           │
│       │              │   │              │   │              │           │
│       │ C001, C004  │   │ C002, C005   │   │ C003, C006   │           │
│       │              │   │              │   │              │           │
│       │ 고객 1, 4   │   │ 고객 2, 5   │   │ 고객 3, 6   │           │
│       └──────────────┘   └──────────────┘   └──────────────┘           │
│                                                                             │
│       ※ 사용자는 단일 데이터베이스로 보임 (투명성)                          │
│       ※ 시스템이 자동으로 올바른 샤드로 라우팅                                │
│                                                                             │
└─────────────────────────────────────────────────────────────────────────────┘

샤딩 전략

┌─────────────────────────────────────────────────────────────────────────────┐
│                    샤딩 전략 비교                                              │
├─────────────────────────────────────────────────────────────────────────────┤
│                                                                             │
│  1. 해시 샤딩 (Hash Sharding)                                              │
│  ──────────────────────────                                              │
│  • 샤드 키의 해시 값을 기반으로 데이터 분배                                   │
│  • 균등 분배에 유리                                                          │
│  • 특정 키 범위 查询에 불리                                                    │
│                                                                             │
│  ┌─────────────────────────────────────────────────────────────────────┐  │
│  │ Shard Key: customer_id                                             │  │
│  │ HASH(customer_id) MOD 3                                            │  │
│  │                                                                      │  │
│  │ C001 → HASH(C001) MOD 3 = 1 → Shard 1                             │  │
│  │ C002 → HASH(C002) MOD 3 = 2 → Shard 2                             │  │
│  │ C003 → HASH(C003) MOD 3 = 0 → Shard 3                             │  │
│  │ C004 → HASH(C004) MOD 3 = 1 → Shard 1                             │  │
│  └─────────────────────────────────────────────────────────────────────┘  │
│                                                                             │
│  2. 레인지 샤딩 (Range Sharding)                                            │
│  ────────────────────────────                                             │
│  • 샤드 키의 값 범위로 데이터 분배                                           │
│  • 범위 查询에 유리                                                          │
│  • 핫스팟(불균형 분배) 발생 가능                                             │
│                                                                             │
│  ┌─────────────────────────────────────────────────────────────────────┐  │
│  │  Shard Key: order_date                                            │  │
│  │                                                                      │  │
│  │  Shard 1: 2024-01 ~ 2024-03                                        │  │
│  │  Shard 2: 2024-04 ~ 2024-06                                        │  │
│  │  Shard 3: 2024-07 ~ 2024-09                                        │  │
│  │  Shard 4: 2024-10 ~ 2024-12                                        │  │
│  └─────────────────────────────────────────────────────────────────────┘  │
│                                                                             │
│  3. 일관된 해싱 (Consistent Hashing)                                        │
│  ─────────────────────────────────                                        │
│  • 해시 링(Hash Ring)을 기반으로 데이터 분배                                 │
│  • 노드 추가/제거 시 재배치 최소화                                            │
│  • Cassandra에서 사용                                                        │
│                                                                             │
│       ┌─────────────────────────────────────────────────────────────────┐ │
│       │                    해시 링                                         │ │
│       │                                                                  │ │
│       │   0 ───────────────────────────────▶ 2^32                     │ │
│       │        │                │                │                     │ │
│       │        │                │                │                     │ │
│       │      Node A          Node B          Node C                   │ │
│       │   (해시 값 1000)   (해시 값 2000)   (해시 값 3000)         │ │
│       │                                                                  │ │
│       │   Key X의 해시 값이 1500 → Node B에 저장                        │ │
│       └─────────────────────────────────────────────────────────────────┘ │
│                                                                             │
└─────────────────────────────────────────────────────────────────────────────┘

샤딩의 과제

┌─────────────────────────────────────────────────────────────────────────────┐
│                    샤딩의 과제 및 해결방안                                      │
├─────────────────────────────────────────────────────────────────────────────┤
│                                                                             │
│  1. 샤드 키 선택                                                             │
│  ─────────────                                                             │
│  • 불균형 분배 발생 가능 → 충분히 분포되는 키 선택                           │
│  • 특정 쿼리에 불리 → 대부분의 쿼리 패턴을 고려한 키 선택                    │
│  • 해결: 복합 샤드 키, 샤드 키 재선택 (리샤딩)                               │
│                                                                             │
│  2. 크로스 샤드 조인                                                        │
│  ────────────────                                                          │
│  • 여러 샤드에 걸친 조인이 필요한 경우 성능 저하                               │
│  • 해결: 정규화 지양, 조인 대상 데이터를同一 샤드에 배치                         │
│                                                                             │
│  3. 리샤딩 (Resharding)                                                    │
│  ──────────────────                                                        │
│  • 샤드 수 변경 시 전체 데이터 재분배 필요                                   │
│  • 서비스 중단 가능성                                                        │
│  • 해결: 일관된 해싱, 온라인 리샤딩 도구                                     │
│                                                                             │
│  4. 글로벌 보조 인덱스 (GSI)                                                │
│  ───────────────────────                                                   │
│  • 샤드 키 외의 필드로 查询 시 모든 샤드 스캔 필요                            │
│  • 해결: 각 샤드에 보조 인덱스, 또는 별도 GSI 스토어                         │
│                                                                             │
└─────────────────────────────────────────────────────────────────────────────┘

[다이어그램 해설] 샤딩의 핵심 과제는 샤드 키 선택이다. 불균형 분배는 성능 병목을 야기하고, 크로스 샤드 연산은 성능 저하를 유발한다. 일관된 해싱은 노드 추가/제거 시 재배치를 최소화하여 리샤딩 부담을 줄인다.

📢 섹션 요약: 샤딩은 대규모 데이터 처리에 필수적이지만, 샤드 키 선택, 크로스 샤드 조인, 리샤딩, GSI 등의 과제가 있으므로 신중한 설계가 필요하다.


Ⅲ. 결론

샤딩은 대규모 데이터 처리와 수평 확장에 필수적인 기법이다. 해시 샤딩, 레인지 샤딩, 일관된 해싱 등 다양한 전략이 있으며, 샤드 키 선택과 크로스 샤드 연산 등의 과제를 고려해야 한다.

📢 섹션 요약: 샤딩은 수평 확장의 핵심 기법으로, 다양한 전략이 있고 샤드 키 선택과 운영상의 과제가 있으므로 신중한 설계가 필요하다.


핵심 인사이트 ASCII 다이어그램 (Concept Map)

┌─────────────────────────────────────────────────────────────────────────────┐
│                    Sharding Concept Map                                       │
│                                                                             │
│              ┌───────────────────────────┐                                   │
│              │      Sharding            │                                   │
│              │      (샤딩)              │                                   │
│              └───────────┬───────────────┘                                   │
│                          │                                                  │
│       ┌──────────────────┼──────────────────┐                             │
│       ▼                  ▼                  ▼                              │
│  ┌─────────┐       ┌─────────┐       ┌─────────┐                       │
│  │ Hash    │       │ Range   │       │Consistent│                       │
│  │Sharding │       │Sharding │       │ Hashing  │                       │
│  │(해시샤딩)│       │(레인지샤딩)│     │(일관된해싱)│                     │
│  └─────────┘       └─────────┘       └─────────┘                       │
│                                                                             │
│  과제: 샤드키선택 | 크로스샤드조인 | 리샤딩 | GSI                          │
│                                                                             │
└─────────────────────────────────────────────────────────────────────────────┘

참고

  • 샤딩은 데이터를 여러 노드에 분산 저장하는 수평 파티셔닝 기법이다.
  • 해시 샤딩, 레인지 샤딩, 일관된 해싱 등의 전략이 있다.
  • 샤드 키 선택, 크로스 샤드 조인, 리샤딩 등의 과제가 있다.
  • MongoDB, Cassandra 등 대부분의 분산 DB에서 지원된다.