샤딩

기술노트

🔪 샤딩 (Sharding)

샤딩은 매우 큰 데이터베이스 테이블을 수평으로 분할하여 여러 개의 작은 테이블(샤드, Shard)로 나누어 저장하는 기술입니다. 각 샤드는 동일한 스키마를 가지지만, 서로 다른 데이터를 담고 있습니다. 이를 통해 단일 데이터베이스의 저장 용량 및 성능 한계를 극복할 수 있습니다.

데이터베이스 복제가 읽기 성능을 높이는 데 중점을 둔다면, 샤딩은 쓰기 성능과 저장 용량을 수평적으로 확장하는 데 더 큰 목적이 있습니다.


🤔 샤딩은 왜 필요한가?

하나의 데이터베이스 서버가 감당할 수 있는 데이터의 양과 처리량에는 한계가 있습니다. 서버의 사양을 높이는 '수직 확장(Scale-up)'은 비용이 비싸고 언젠가는 한계에 도달합니다.

샤딩은 여러 대의 서버에 데이터를 분산 저장(수평 확장, Scale-out)함으로써, 시스템 전체의 용량과 쓰기 성능을 거의 무한정으로 확장할 수 있게 해줍니다.


⚙️ 샤딩 키 (Shard Key)

데이터를 어떤 기준으로 나누어 어떤 샤드에 저장할지를 결정하는 분할 기준을 '샤딩 키'라고 합니다. 샤딩 키를 어떻게 설계하느냐가 전체 시스템의 성능과 효율을 좌우합니다.

  • 해시 샤딩 (Hash Sharding) : 샤딩 키의 해시 값을 계산하여 데이터를 분산시키는 방식입니다. 데이터가 비교적 균등하게 분배되지만, 서버 증설 시 데이터 재분배가 복잡합니다.
  • 레인지 샤딩 (Range Sharding) : 샤딩 키의 범위를 기준으로 데이터를 분산시키는 방식입니다. 특정 범위의 데이터를 함께 조회하기 좋지만, 데이터가 특정 샤드에 몰리는 현상이 발생할 수 있습니다.
  • 디렉토리 샤딩 (Directory Sharding) : 샤딩 키와 샤드의 위치를 매핑하는 별도의 조회 테이블을 두는 방식입니다. 유연하지만, 조회 테이블에 병목이 발생할 수 있습니다.

💡 개발자 핵심 Point

  • 샤딩은 수십억 건 이상의 매우 큰 데이터를 다루어야 하는 대규모 서비스(예: 소셜 미디어, 대규모 이커머스)에서 사용되는 고급 데이터베이스 아키텍처입니다.
  • 샤딩을 도입하면 여러 테이블이나 서버에 걸쳐 있는 데이터를 JOIN하거나 트랜잭션을 처리하는 것이 매우 복잡해집니다. 따라서 설계 단계에서부터 신중한 고려가 필요합니다.
  • 구현이 매우 복잡하기 때문에, 애플리케이션 레벨에서 직접 구현하기보다는 데이터베이스 자체가 샤딩을 지원하거나(예: MongoDB, Vitess), 클라우드 서비스를 이용하는 것이 일반적입니다.
  • 샤딩은 데이터베이스 아키텍처의 '최후의 무기' 중 하나로 불립니다. 복잡도가 매우 높으므로, 복제나 캐싱 등 다른 방법으로 성능 개선이 불가능할 때 고려해야 합니다.