샤딩이란
Sharding이란
샤딩(Sharding)이란 데이터베이스를 여러 개의 작은 데이터베이스(샤드, Shard)로 분할하여 저장하고 관리하는 기술 대량의 데이터를 효율적으로 처리하고 읽기/쓰기 성능을 향상시키는 데 사용
샤딩을 사용하는 이유
- 성능 향상: 데이터가 분산되어 각 샤드에 대한 부하가 감소하여 쿼리 속도가 빨라짐
- 확장성(Scalability) 증가: 수직 확장(하드웨어 업그레이드) 대신 수평 확장(샤드 추가) 가능
- 병렬 처리: 여러 샤드에서 동시에 읽기/쓰기 작업을 수행하여 처리량 증가
- 장애 격리(Fault Isolation): 특정 샤드에 장애가 발생해도 다른 샤드는 영향을 받지 않음
- 비용 절감: 고성능 서버를 사용하지 않고 여러 개의 저비용 서버를 사용하여 성능을 유지할 수 있음
샤딩을 사용하면 좋은 경우
샤딩은 대량의 데이터와 높은 트래픽을 처리해야 하는 시스템에서 사용
| 사용 사례 | 설명 |
|---|---|
| SNS (Facebook, Twitter, Instagram 등) | 사용자 수가 많고, 게시물/댓글/좋아요 등의 데이터가 많음 |
| 온라인 쇼핑몰 (Amazon, eBay, Coupang 등) | 제품, 주문, 사용자 정보가 많고, 트랜잭션이 빈번하게 발생함 |
| 게임 서버 | 수백만 명의 사용자 데이터를 빠르게 처리해야 함 |
| 로그 저장 시스템 (ElasticSearch, Splunk 등) | 대량의 로그 데이터를 분산하여 저장 및 검색해야 함 |
| 금융 시스템 (은행, 주식 거래 등) | 트랜잭션 데이터가 많고, 빠른 검색과 처리가 필요함 |
| 사물 인터넷(IoT) 플랫폼 | 수많은 디바이스에서 지속적으로 데이터를 수집해야 함 |
샤딩 동작 원리
샤딩의 기본 개념은 데이터를 특정 기준(Sharding Key)에 따라 여러 개의 샤드로 나누어 저장하는 것
샤딩 과정
- 샤딩 키(Sharding Key) 선택: 데이터를 나눌 기준(예: 사용자 ID, 지역, 해시 값 등)을 정함
- 샤드(Shard) 생성: 여러 개의 데이터베이스(서버 또는 테이블)를 준비
- 데이터 분배: 샤딩 키를 기준으로 데이터를 특정 샤드에 저장
- 쿼리 라우팅(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) 사용 |