프로젝트

[DB] 분산 처리를 위한 샤딩(Sharding)

욘아리 2025. 2. 25. 11:50

이전 포스팅에서 대규모 시스템을 보다 효율적으로 운영하기 위해 사용되는 MSA를 선택했다고 설명했다. 대규모 시스템에서는 데이터베이스 관리 또한 중요한 과제로, MSA를 활용하는 시스템에서는 이에 맞춰 확장 가능하도록 설계되어야 한다. 따라서 분산 관계형 데이터베이스 개념과 그중에서도 샤딩 기법에 대해 알아보자.

 

대규모 데이터베이스에서의 확장성 문제

서비스가 활성화됨에 따라 단일 데이터베이스에서 모든 요청을 처리하기에는 부담이 커진다. 확장성을 고려할 때 다음 두 가지 방법이 있다.

  • Scale-Up (수직 확장): 서버의 성능을 높여 더 많은 요청을 처리하도록 하는 방법이다. 하지만 하드웨어적인 한계로 인해 무한정 확장이 어렵고 비용이 많이 든다.
  • Scale-Out (수평 확장): 여러 개의 서버를 사용하여 부하를 분산하는 방법이다. 이를 통해 확장성을 보다 유연하게 확보할 수 있다.

Scale-Out 방식의 한 가지 방법이 바로 샤딩(Sharding)이다. 샤딩을 통해 데이터를 여러 개의 DB로 분산 저장함으로써, 데이터 처리 속도를 높이고 시스템 부하를 줄일 수 있다.

 

샤딩(Sharding)

데이터를 작은 단위로 나누어 여러 개의 데이터베이스 서버에 분산 저장하는 기법이다. 이를 통해 데이터베이스의 부하를 줄이고 성능을 향상시킬 수 있다.

 

샤딩의 종류

샤딩은 크게 수직 샤딩(Vertical Sharding)과 수평 샤딩(Horizontal Sharding)으로 나뉜다.

  • 수직 샤딩: 테이블을 기능별로 분할하여 각 샤드가 서로 다른 테이블을 담당하는 방식
    • 예: 사용자 정보 A DB에, 주문 정보는 B DB에 저장
    • 장점: 특정 서비스나 테이블의 부하를 줄일 수 있음
    • 단점: 특정 샤드의 데이터가 많아질 경우 다시 샤딩이 필요함
  • 수평 샤딩: 동일한 테이블을 특정 기준(예: ID 범위)에 따라 여러 샤드로 나누어 저장하는 방식
    • 예: 사용자 ID 1 ~ 1000은 A DB, 1001 ~ 2000은 B DB에 저장
    • 장점: 특정 테이블의 데이터가 증가해도 수평 확장이 가능
    • 단점: 샤딩 키(Sharding Key)를 잘못 설정하면 데이터 분배가 고르지 않을 수 있음

 

샤딩 전략

샤딩을 구현할 때는 시스템 특성에 맞는 적절한 샤딩 전략을 선택하는 것이 중요하다.

  1. 범위 기반 샤딩(Range-based Sharding)
    • 특정 값의 범위를 기준으로 데이터를 나눔
    • 예: ID 1 ~ 1000은 샤드 1, 1001 ~ 2000은 샤드 2
    • 단점: 특정 샤드에 부하가 집중될 가능성이 있음 (Hotspot 문제)
  2. 해시 기반 샤딩(Hash-based Sharding)
    • 데이터를 해시 함수를 사용해 분배
    • 예: ID를 특정 해시 값으로 변환 후 샤드에 저장
    • 장점: 데이터가 고르게 분산
    • 단점: 샤드 수가 변경될 경우 데이터 재배치 필요
  3. 디렉토리 기반 샤딩 (Directory-based Sharding)
    • 별도의 매핑 테이블을 사용하여 특정 데이터를 특정 샤드에 저장
    • 장점: 유연한 샤딩 가능
    • 단점: 매핑 테이블 관리의 부담 증가

 

샤드(Shard)

샤딩된 데이터베이스를 구성하는 개별적인 단위로, 크게 물리적 샤드(Physical Shard)와 논리적 샤드(Logical Shard)로 구분된다.

  • 물리적 샤드: 실제로 운영되는 개별적인 데이터베이스 인스턴스
  • 논리적 샤드: 애플리케이션 레벨에서 데이터가 분산되어 저장되는 개념

논리적 샤드는 물리적 샤드 위에서 동작하며, 필요에 따라 물리적 샤드의 수를 조정하여 확장성을 높일 수 있다.

 

샤딩 적용 시 고려할 사항

  • 샤딩 키(Sharding Key)의 적절한 선택: 샤딩 키를 잘못 설정하면 특정 샤드에 데이터가 집중되는 문제가 발생할 수 있음
  • Cross-Shard Query 문제: 샤딩된 데이터 간 조인이 어려워질 수 있음 → 애플리케이션 레벨에서 해결 필요
  • 데이터 일관성 관리: 분산 환경에서는 트랜잭션을 관리하기 어려움 → 분산 트랜잭션 방식(Saga 패턴 등) 고려
  • 운영 및 모니터링: 샤드의 상태를 지속적으로 모니터링하고 장애 발생 시 대응할 수 있는 시스템 필요

 

👉 샤딩은 대규모 시스템에서 데이터베이스의 부하를 줄이고 성능을 높이는 핵심 기술이다. Scale-Up 방식으로는 확장성에 한계가 있기 때문에, Scale-Out 전략을 고려해야 하며, 그중에서도 샤딩은 가장 효과정인 방법 중 하나이다.

 

현재 프로젝트에서는 단일 MySQL을 사용하지만, 향후 분산 환경을 고려하여 설계하는 것이 중요하다. 적절한 샤딩 전략을 선택하고, 데이터 일관성 유지 및 쿼리 최적화 등을 고려한 설계를 한다면, 보다 확장성이 높은 데이터베이스 시스템을 구축할 수 있을 것이다.