280. 샤딩 (Sharding)
핵심 인사이트 (3줄 요약)
- 본질: 샤딩은 데이터를 여러 노드에 분산 저장하는 기법으로, 샤드 키(Shard Key)를 기반으로 데이터를 파티셔닝하여 각 노드가 전체 데이터의 일부를 담당하게 한다.
- 가치: 대용량 데이터 처리, 읽기/쓰기 부하 분산, 수평적 확장성, 고가용성 등을 제공하며, 대규모 애플리케이션에 필수적이다.
- 융합: 해시 샤딩, 레인지 샤딩, 일관된 해싱, 몽고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에서 지원된다.