| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
- 오블완
- tucker의 go 언어 프로그래밍
- 바이브코딩
- CKA 기출문제
- AWS EKS
- golang
- 공부
- 코틀린 코루틴의 정석
- Spring
- CKA
- PETERICA
- minikube
- SRE
- 정보처리기사 실기 기출문제
- Kubernetes
- CloudWatch
- LLM
- Java
- Linux
- 컨텍스트 엔지니어링
- aws
- go
- kotlin
- 기록으로 실력을 쌓자
- MySQL
- APM
- Pinpoint
- 티스토리챌린지
- AI
- kotlin coroutine
- Today
- Total
피터의 개발이야기
[MySQL] MySQL의 샤딩이란 본문
ㅁ 들어가며
ㅇ MySQL의 분산처리를 위한 샤딩(Sharding)에 대해서 정리하였다.
ㅁ MySQL 샤딩(Sharding)이란?
MySQL 샤딩은 대용량 데이터를 여러 개의 데이터베이스(샤드, shard)에 수평 분산 저장하는 방법이다. 즉, 하나의 거대한 데이터베이스에 모든 데이터를 넣지 않고, 여러 서버에 데이터를 나눠 저장함으로써 성능과 확장성을 높인다.
ㅁ 샤딩 방식
| 방식 | 설명 | 장점/단점 |
| Modular(모듈러) 샤딩 | 샤딩 키(예: user_id)의 해시값을 샤드 개수로 나눈 나머지로 샤드 결정 |
데이터 분포가 균등, 샤드 추가/제거 시 데이터 이동 필요
|
| 범위 기반 샤딩 | 샤딩 키의 값 범위로 샤드 결정 (예: ID 1~99999 → A, 100000~199999 → B 등) |
구현이 쉽고 직관적, 데이터 쏠림 발생 가능
|
| 목록 기반 샤딩 | 특정 값 목록(예: 국가별, 지역별 등)로 샤드 결정 |
특정 그룹에 최적화, 유연성 제한
|
| Hash 샤딩 | 해시 함수를 사용해 샤드키를 분배 |
데이터 분포가 고르게 됨, 증설 시 재분배 필요
|
| 디렉터리 기반 샤딩 | 별도 디렉터리(메타데이터) 서비스가 샤드 위치를 관리 |
유연성 높음, 디렉터리 서비스 장애 시 위험
|
ㅁ 샤딩 구현 절차
ㅇ 샤드키(Sharding Key) 선정
- 데이터 분산의 기준이 되는 컬럼(예: user_id, order_id 등)을 선정
- 샤드키는 데이터 접근 패턴을 고려해 고르게 분포되는 값을 선택
ㅇ 샤딩 전략 결정
- 데이터의 특성과 서비스 요구사항에 따라 Modular, Range, List, Hash 중에서 선택
ㅇ 샤드 DB/테이블 생성
- 동일한 스키마로 여러 DB 인스턴스 또는 테이블을 생성
ㅇ 애플리케이션에 샤딩 로직 구현
- 샤드키에 따라 어떤 DB/테이블에 접근할지 라우팅 로직을 구현
// 예시 (Modular 샤딩)
def get_shard(user_id, shard_count):
return user_id % shard_count
// 예시 (Range 샤딩)
def get_shard(user_id):
if user_id <= 10000:
return 0
elif user_id <= 20000:
return 1
else:
return 2
ㅇ 샤딩 설정 관리
- YAML, 환경변수, DB 등에서 샤드 정보와 룰을 관리할 수 있다.
ㅇ 운영 및 확장
- 샤드 증설/축소 시 데이터 재분배(특히 Modular/Hash 샤딩의 경우)가 필요하다.
- Range 샤딩은 새로운 범위만 추가하면 되므로 증설이 비교적 쉽다.
ㅁ 샤딩의 장점과 단점
| 장점 | - 대용량 데이터 처리 성능 향상 - 트래픽 분산 및 확장성 확보 - 장애 격리(한 샤드 장애 시 전체 서비스 영향 최소화) |
| 단점 | - 샤딩 키 선정이 어렵고, 잘못 고르면 데이터 쏠림 발생 - 샤드 추가/제거 시 데이터 재분배 필요(운영 복잡성) - 조인, 트랜잭션 등 일부 SQL 연산이 복잡해짐 |
ㅁ MySQL 샤딩 적용
ㅇ 일반적으로 애플리케이션 코드 레벨에서 라우팅 로직을 구현한다.
ㅇ 샤딩 구조 설계 시 데이터 분포, 확장 계획, 장애 대응 등을 충분히 고려해야 한다.
ㅇ 파티셔닝(Partitioning)과는 달리, 샤딩은 물리적으로 다른 DB 서버에 데이터가 저장된다.
ㅁ 샤딩(Sharding)과 파티셔닝(Partitioning)의 차이점
ㅇ MySQL에서 샤딩과 파티셔닝은 모두 대용량 데이터를 여러 부분으로 나누어 관리하는 기술이지만, 데이터가 저장되는 위치와 운영 목적에서 중요한 차이가 있다.
| 구분 | 파티셔닝 (Partitioning) |
샤딩 (Sharding)
|
| 저장 위치 | 하나의 DB 인스턴스(서버) 내 여러 파티션(테이블) |
여러 DB 인스턴스(서버)에 분산 저장
|
| 분할 단위 | 테이블 내 파티션(논리적/물리적 구분, 같은 서버) |
샤드(Shard)라는 별도 DB 인스턴스(물리적 분산)
|
| 관리 주체 | DBMS(내장 기능, MySQL 파티션 기능 등) |
주로 애플리케이션 또는 미들웨어(ShardingSphere 등)
|
| 목적 | 단일 서버 내 성능/관리 최적화, 인덱스/쿼리 효율 개선 |
대규모 트래픽 분산, 수평적 확장, 장애 격리
|
| 조인/트랜잭션 | 파티션 간 조인/트랜잭션 가능(같은 인스턴스) |
샤드 간 조인/트랜잭션 복잡(여러 인스턴스)
|
| 확장성 | 서버 한계까지(Scale-up) |
서버 추가로 무한 확장(Scale-out)
|
ㅇ 파티셔닝
- 하나의 서버(인스턴스) 내에서 테이블을 여러 파티션으로 분할
- 단일 서버 내에서 데이터 관리와 성능 최적화에 적합
ㅇ 샤딩
- 여러 서버(인스턴스)에 데이터를 분산 저장
- 대규모 트래픽 분산과 수평 확장, 장애 격리에 적합
ㅇ 소결: 둘 다 데이터 분할이라는 공통점이 있지만, 확장성과 인프라 구조에서 근본적인 차이가 있다.
ㅁ 함께 보면 좋은 사이트
ㅇ MySQL 데이터베이스 파티셔닝(Partitioning) 과 샤딩(Sharding)
'Database > MySQL' 카테고리의 다른 글
| [MySQL] Elasticsearch vs MySQL: 샤딩 구조와 Read-Only Replica 실무 활용법 (1) | 2025.08.12 |
|---|---|
| [MySQL] 중복체크를 위한 Count vs Limit vs Exists (0) | 2024.06.30 |
| [MySQL] MySQL과 Java의 SSL 연결 방법 (0) | 2024.06.17 |
| MySQL과 PostgreSQL의 차이점 (0) | 2024.04.15 |
| MySQL 콘솔 접속 방법 (0) | 2024.01.18 |