데이터베이스

[DB] Sharding과 Horizontal Partitioning의 차이점 및 개념 정리

ioh'sDeveloper 2025. 1. 5. 16:34

Sharding과 Horizontal Partitioning의 차이점 및 개념 정리

Sharding이란?

Sharding은 대규모 데이터베이스 시스템에서 데이터 부하 분산을 목적으로 데이터를 여러 개의 **독립적인 데이터베이스 인스턴스(DB 서버)**에 분할 저장하는 기술이다. 이는 시스템의 **확장성(scalability)**을 확보하고, **고가용성(high availability)**을 보장하기 위해 사용된다.

Sharding은 기본적으로 **수평 파티셔닝(horizontal partitioning)**과 유사한 방식으로 작동하지만, 주요 차이점은 각 파티션(partition)이 서로 다른 DB 서버에 저장된다는 점이다. 이를 통해 하나의 데이터베이스 서버에 모든 데이터를 저장하는 방식보다 더 효율적인 **부하 분산(load balancing)**이 가능해진다.


Horizontal Partitioning과의 비교

Horizontal Partitioning이란?

Horizontal partitioning은 데이터베이스의 테이블을 행(row) 단위로 분할하여 각각의 파티션을 동일한 DB 서버에 저장하는 방식이다. 이 방식은 테이블의 데이터를 논리적으로 구분하여 관리하는 데 유용하지만, 모든 파티션이 **단일 DB 서버의 리소스(CPU, 메모리, 디스크 I/O)**를 공유하기 때문에 서버에 과부하가 발생할 수 있다.

Horizontal Partitioning의 문제점

단일 DB 서버에 모든 파티션을 저장하는 horizontal partitioning은 다음과 같은 문제를 야기한다:

  • 단일 장애점(Single Point of Failure, SPOF) 문제: DB 서버가 장애를 일으킬 경우 모든 파티션에 접근할 수 없게 된다.
  • 하드웨어 자원 소모: 백엔드 서버에서 다수의 요청이 밀려오면 단일 DB 서버가 모든 트래픽을 처리해야 하므로, CPU와 메모리 등의 리소스가 빠르게 소진된다.
  • 확장성 제한: 단일 DB 서버의 하드웨어 업그레이드만으로는 시스템의 성능을 무한정 향상시키기 어렵다.

Sharding의 특징과 이점

Sharding은 위 문제들을 해결하기 위해, 각 파티션을 독립된 DB 서버에 분산 저장하는 방법이다. 이때 데이터 분할의 기준이 되는 키를 Shard Key라고 부르며, 각 분할된 파티션을 Shard라고 한다.

Sharding의 주요 특징

  • 부하 분산: 서로 다른 DB 서버에 데이터를 분산 저장함으로써, 백엔드 요청이 많아지더라도 트래픽이 특정 서버에 집중되지 않고 분산된다.
  • 확장성 확보: 필요에 따라 새로운 DB 서버를 추가하여 시스템을 수평적으로 확장할 수 있다. 이를 **수평 확장(horizontal scaling)**이라고 한다.
  • 고가용성: 특정 Shard가 장애를 일으키더라도, 다른 Shard는 정상적으로 작동하기 때문에 시스템 전체가 중단되지 않는다.

Sharding의 작동 방식

Sharding에서는 데이터베이스의 테이블을 특정 기준(Shard Key)에 따라 분할하여 각 Shard에 데이터를 저장한다. 예를 들어:

  • Shard 1: 사용자 ID가 1~1000인 데이터를 저장하는 DB 서버
  • Shard 2: 사용자 ID가 1001~2000인 데이터를 저장하는 DB 서버
  • Shard 3: 사용자 ID가 2001~3000인 데이터를 저장하는 DB 서버

각 Shard는 독립적인 DB 인스턴스로 운영되며, 서로 다른 물리적 서버에 저장된다. 이를 통해 특정 Shard에 장애가 발생하더라도, 다른 Shard는 영향을 받지 않으므로 시스템의 안정성이 높아진다.


Shard Key의 중요성

Shard Key는 데이터를 어떻게 분산할지를 결정하는 핵심 요소이다. 올바른 Shard Key를 선택하지 않으면 다음과 같은 문제가 발생할 수 있다:

  • 데이터 불균형: 특정 Shard에 데이터가 집중되면 부하가 고르게 분산되지 않는다. 이를 Hot Spot 문제라고 한다.
  • 복잡한 쿼리 처리: 잘못된 Shard Key를 선택하면, 특정 쿼리를 처리하기 위해 여러 Shard에 접근해야 하는 상황이 발생할 수 있다. 이를 Cross-Shard Query라고 한다.

Shard Key는 일반적으로 고유 식별자(unique identifier) 또는 자주 조회되는 데이터 필드를 기준으로 설정한다. 예를 들어 사용자 기반의 시스템에서는 User ID를 Shard Key로 설정하는 것이 일반적이다.


Sharding의 장단점

장점

  • 확장성: DB 서버를 추가하여 트래픽을 효율적으로 분산할 수 있다.
  • 고가용성: 특정 Shard 장애 시에도 전체 시스템 가용성이 유지된다.
  • 성능 향상: 데이터 부하를 분산하여 DB 서버의 리소스 사용을 최적화할 수 있다.

단점

  • 복잡성 증가: Sharding은 시스템 설계 및 관리가 복잡해지며, Cross-Shard Query와 같은 이슈를 해결해야 한다.
  • 데이터 재분배: Shard Key를 변경하거나 Shard를 추가할 때, 기존 데이터를 재분배해야 하는 문제가 발생할 수 있다.
  • 트랜잭션 관리 어려움: Shard 간 트랜잭션 처리가 어려워질 수 있으며, 이를 위해 분산 트랜잭션(distributed transaction) 관리 기술이 필요하다.

결론

Sharding은 대규모 데이터베이스 시스템의 확장성고가용성을 확보하기 위한 핵심 기술이다. Horizontal Partitioning과 유사하게 데이터를 행(row) 단위로 분할하지만, 각 파티션을 독립된 DB 서버에 분산 저장함으로써 시스템의 부하를 효과적으로 분산할 수 있다는 차이점이 있다.

Sharding을 도입할 때는 적절한 Shard Key를 선택하고, 데이터 불균형 및 Cross-Shard Query 문제를 고려하여 시스템을 설계해야 한다. 이를 통해 효율적인 데이터베이스 확장과 안정적인 서비스 운영이 가능해진다.