콘텐츠로 이동

샤딩이란

Sharding이란

샤딩(Sharding)이란 데이터베이스를 여러 개의 작은 데이터베이스(샤드, Shard)로 분할하여 저장하고 관리하는 기술 대량의 데이터를 효율적으로 처리하고 읽기/쓰기 성능을 향상시키는 데 사용

샤딩을 사용하는 이유

  • 성능 향상: 데이터가 분산되어 각 샤드에 대한 부하가 감소하여 쿼리 속도가 빨라짐
  • 확장성(Scalability) 증가: 수직 확장(하드웨어 업그레이드) 대신 수평 확장(샤드 추가) 가능
  • 병렬 처리: 여러 샤드에서 동시에 읽기/쓰기 작업을 수행하여 처리량 증가
  • 장애 격리(Fault Isolation): 특정 샤드에 장애가 발생해도 다른 샤드는 영향을 받지 않음
  • 비용 절감: 고성능 서버를 사용하지 않고 여러 개의 저비용 서버를 사용하여 성능을 유지할 수 있음

샤딩을 사용하면 좋은 경우

샤딩은 대량의 데이터와 높은 트래픽을 처리해야 하는 시스템에서 사용

사용 사례 설명
SNS (Facebook, Twitter, Instagram 등) 사용자 수가 많고, 게시물/댓글/좋아요 등의 데이터가 많음
온라인 쇼핑몰 (Amazon, eBay, Coupang 등) 제품, 주문, 사용자 정보가 많고, 트랜잭션이 빈번하게 발생함
게임 서버 수백만 명의 사용자 데이터를 빠르게 처리해야 함
로그 저장 시스템 (ElasticSearch, Splunk 등) 대량의 로그 데이터를 분산하여 저장 및 검색해야 함
금융 시스템 (은행, 주식 거래 등) 트랜잭션 데이터가 많고, 빠른 검색과 처리가 필요함
사물 인터넷(IoT) 플랫폼 수많은 디바이스에서 지속적으로 데이터를 수집해야 함

샤딩 동작 원리

샤딩의 기본 개념은 데이터를 특정 기준(Sharding Key)에 따라 여러 개의 샤드로 나누어 저장하는 것

샤딩 과정

  1. 샤딩 키(Sharding Key) 선택: 데이터를 나눌 기준(예: 사용자 ID, 지역, 해시 값 등)을 정함
  2. 샤드(Shard) 생성: 여러 개의 데이터베이스(서버 또는 테이블)를 준비
  3. 데이터 분배: 샤딩 키를 기준으로 데이터를 특정 샤드에 저장
  4. 쿼리 라우팅(Query Routing): 클라이언트가 요청할 때 적절한 샤드로 라우팅하여 처리
  +-----------+        +----------+      +------------+
  | User 101  | -----> | Shard 1  | ----> | DB Server 1 |
  | User 202  | -----> | Shard 2  | ----> | DB Server 2 |
  | User 303  | -----> | Shard 3  | ----> | DB Server 3 |
  +-----------+        +----------+      +------------+

샤딩 전략

샤딩 방식 설명 장점 단점
범위 기반 샤딩 (Range-based Sharding) 특정 범위를 기준으로 데이터를 샤드에 분배 (예: 사용자 ID 1~1000 -> Shard 1) 특정 범위 내에서 조회 성능이 빠름 데이터 불균형(Hotspot) 발생 가능
해시 기반 샤딩 (Hash-based Sharding) 해시 함수를 사용하여 샤드를 정함 (예: hash(user_id) % num_shards) 데이터 균등 분배 가능, 특정 샤드 부하 방지 범위 조회가 어려움 (Range Query 비효율적)
지역 기반 샤딩 (Geographical Sharding) 지역(예: 한국, 미국, 유럽 등)에 따라 샤드를 나눔 지역 간 네트워크 지연 감소, 로컬 트래픽 최적화 특정 지역에 데이터가 몰릴 경우 성능 저하 가능
동적 샤딩 (Dynamic Sharding) 필요할 때마다 샤드 추가 유연한 확장 가능 구현 난이도 높음
하이브리드 샤딩 (Hybrid Sharding) 여러 샤딩 방식을 조합하여 사용 다양한 시나리오 적용 가능 복잡한 설계 필요

샤딩 시 발생하는 문제 및 해결 전략

문제 설명 해결 방법
핫존(Hotspot) 문제 특정 샤드에 데이터가 몰려 부하가 집중됨 해시 기반 샤딩 사용, 샤드 동적 분할(Dynamic Resharding) 적용
Cross-Shard Join 문제 여러 샤드에 걸친 조인이 비효율적 애플리케이션 레벨에서 조인 처리 또는 중간 캐싱 활용
데이터 불균형 특정 샤드가 다른 샤드보다 많은 데이터를 가짐 샤딩 키 재설계, 일정 기준으로 샤드 분할 및 병합
트랜잭션 관리 어려움 다중 샤드에서 ACID 트랜잭션을 보장하기 어려움 분산 트랜잭션(DBMS 지원 기능 활용) 또는 SAGA 패턴 적용
샤드 추가 시 데이터 재배치 문제 새로운 샤드를 추가할 때 기존 데이터 이동 필요 일관된 해싱(Consistent Hashing) 사용