[sql] 샤딩 전략

분산 데이터베이스 환경에서 데이터를 효율적으로 분산 저장하고 조회하기 위해 샤딩(sharding) 전략을 사용할 수 있습니다. 샤딩은 대용량의 데이터를 여러 개의 노드에 분산하여 저장함으로써 성능 및 확장성을 향상시킬 수 있는 기술입니다.

수평 분할과 수직 분할

데이터베이스 샤딩은 크게 수평 분할과 수직 분할로 나눌 수 있습니다.

  1. 수평 분할: 수평 분할은 특정 기준에 따라 데이터를 동등하게 나누는 것을 의미합니다. 예를 들어, 사용자 ID를 기준으로 데이터를 여러 파티션으로 나누는 것이 있습니다.이러한 방식은 데이터의 분산을 균등하게 할 수 있어 확장성을 높일 수 있습니다.

  2. 수직 분할: 수직 분할은 열 단위로 데이터를 나누는 것을 의미합니다. 예를 들어, 자주 사용되는 열을 한 테이블에 저장하고, 나머지 열을 다른 테이블에 저장하는 것입니다. 이를 통해 복잡성을 줄이고 성능을 향상시킬 수 있습니다.

해싱과 라우팅

데이터를 분할하는 방법으로는 해싱(hashing)과 라우팅(routing)이 주로 사용됩니다.

  1. 해싱: 데이터의 고유한 식별자를 해싱하여 특정 규칙에 따라 분산된 노드 중 하나에 할당하는 방식입니다. 이를 통해 균일한 분산을 유지할 수 있으나, 블록 단위의 범위 검색이 어려운 단점이 있습니다.

     # 해싱 예시 (Python)
     shard_key = 'user_id_123'
     shard_id = hash(shard_key) % num_shards
    
  2. 라우팅: 데이터베이스 클라이언트나 프록시 레이어를 이용하여 데이터를 적절한 샤드로 라우팅하는 방식입니다. 이를 통해 유연한 조인 및 범위 검색이 가능하지만, 라우팅 오버헤드가 발생할 수 있습니다.

주의사항

데이터 샤딩은 데이터 관리의 복잡성을 증가시킬 수 있고, 노드간 데이터 불일치 문제를 유발할 수 있습니다. 따라서 신중한 설계와 효율적인 관리가 필요합니다.

참고 자료

  1. “Effective MySQL Sharding Strategies” - Peter Zaitsev, 2014
  2. “Scalability Rules: 50 Principles for Scaling Web Sites” - Martin L. Abbott, Michael T. Fisher, 2011