큰 데이터베이스를 같은 스키마를 가진 여러 조각(샤드)으로 나눠 서로 다른 서버에 두는 수평 확장 방법. 샤드끼리는 데이터가 겹치지 않는다.
- 샤딩 키(Sharding Key, 파티션 키)가 가장 중요한 결정이다. 어떤 칼럼으로 데이터를 나눌지 정하며, 데이터가 고르게 퍼지는 키를 골라야 한다. 예:
user_id % 4로 네 샤드에 나누기
샤딩이 부르는 문제
- 재샤딩(Resharding): 데이터가 늘어 한 샤드로 감당이 안 되거나 분포가 한쪽으로 쏠리면 다시 나눠야 한다. 단순 나머지 연산은 샤드 수가 바뀌면 거의 모든 데이터가 이동하므로, 이동량을 줄이는 안정 해시(Consistent Hashing)를 쓴다
- 핫스팟(유명인 문제)(Hotspot, Celebrity Problem): 특정 키에 요청이 몰려 한 샤드만 과부하가 걸린다. 그 키만 따로 샤드를 주는 식으로 대응한다
- 조인과 비정규화(Denormalization): 여러 샤드에 걸친 조인이 어려워, 한 테이블에서 질의가 끝나도록 비정규화하는 경우가 많다(정규화 (1NF~5NF))
- 샤드를 넘는 트랜잭션도 어렵다. ACID를 한 샤드 안으로 한정하고 나머지는 최종 일관성으로 받아들이게 된다
샤딩은 운영 복잡도가 크다. 그 전에 인덱스, 캐시, 읽기 복제, 수직 확장으로 버틸 수 있는지 먼저 본다. 테넌트별로 데이터를 나누는 멀티테넌시 데이터 격리도 비슷한 고민을 한다.
출처: 『가상 면접 사례로 배우는 대규모 시스템 설계 기초』 알렉스 쉬 (원서 System Design Interview – An Insider's Guide) 1장