관리 메뉴

피터의 개발이야기

[MySQL] MySQL의 샤딩이란 본문

Database/MySQL

[MySQL] MySQL의 샤딩이란

기록하는 백앤드개발자 2025. 6. 4. 16:38
반응형

ㅁ 들어가며

ㅇ 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)

Sharded MySQL Cluster 도입 배경과 개발기 (부제: 우당탕탕 좌충우돌 개발기)

DB분산처리를 위한 sharding

반응형
Comments