샤딩 (sharding)
대규모 데이터베이스 시스템에서 데이터를 수평적으로 분할하여 여러 서버에 분산 저장하는 기술.
각각의 분할된 데이터 조각을 ‘샤드(shard)‘라고 부른다.
이 기술은 데이터베이스의 성능, 확장성, 가용성을 향상시키는 데 중요한 역할을 한다.
예를 들어 전자상거래 사이트의 사용자 데이터를 지역별로 나누어 관리한다고 가정해보자.
서울 지역 사용자의 데이터는 샤드 A에, 부산 지역 사용자의 데이터는 샤드 B에 저장하는 식. 이렇게 하면 각 지역의 서버가 해당 지역 사용자의 데이터만 처리하면 되므로 시스템 부하를 분산할 수 있다.
특징:
- 수평 분할: 샤딩은 데이터를 동일한 스키마를 가진 여러 개의 작은 데이터베이스(샤드)로 나눈다.
- 분산 저장: 각 샤드는 독립적인 서버에 저장되어 운영된다.
- 샤드 키: 데이터를 분할하고 분산 저장하는 기준이 되는 키를 사용한다.
- 사용자 ID, 지역 코드, 시간대 등이 샤딩 키로 자주 사용된다.
- 이 키의 선택은 시스템의 성능과 확장성에 직접적인 영향을 미친다.
- 라우팅: 샤드 서버에는 각 샤드에 작업을 분배하는 라우팅 기능이 있다.
장점:
- 성능 향상: 데이터를 여러 서버에 분산함으로써 처리 속도가 향상된다.
- 확장성: 데이터 양이 증가해도 새로운 샤드를 추가하여 시스템을 확장할 수 있다.
- 가용성: 한 샤드에 문제가 발생해도 다른 샤드는 정상 작동하여 전체 시스템의 가용성이 향상된다.
- 부하 분산: 데이터와 트래픽이 여러 샤드에 균등하게 분산되어 처리된다.
- 비용 효율성: 고성능 하드웨어 대신 여러 대의 저렴한 서버를 사용할 수 있다.
단점:
- 복잡성: 데이터가 여러 곳에 분산되어 있어 관리와 조회가 복잡해질 수 있다.
- 데이터 일관성: 여러 샤드에 걸친 데이터의 일관성을 유지하기 어려울 수 있다.
- 조인 연산의 어려움: 여러 샤드에 걸친 데이터를 조인하는 것이 어렵다.
- 데이터 불균형: 특정 샤드에 데이터가 집중될 경우 성능 저하가 발생할 수 있다.
- 관리 복잡성: 여러 샤드를 관리하고 모니터링하는 것이 단일 데이터베이스보다 복잡하다.
샤딩 방식
범위 기반 샤딩 (Range Based Sharding)
범위 기반 샤딩은 데이터를 연속된 범위로 나누어 각 샤드에 할당하는 방식.
예를 들어, 고객 ID가 1-1000번까지는 첫 번째 샤드에, 1001-2000번까지는 두 번째 샤드에 저장하는 식.이 방식은 구현이 비교적 간단하고 이해하기 쉽다.
특정 범위의 데이터가 다른 범위보다 더 자주 접근되는 경우, 해당 샤드에 과도한 부하가 발생할 수 있다.
예를 들어 최근에 가입한 사용자들의 활동이 더 많다면, 높은 ID 범위를 담당하는 샤드에 트래픽이 집중될 수 있다.해시 기반 샤딩 (Hash Based Sharding)
해시 기반 샤딩은 샤딩 키를 해시 함수에 통과시켜 나온 값을 기준으로 데이터를 분산하는 방식.해시 함수는 입력값을 고르게 분산시키는 특성이 있어, 데이터를 여러 샤드에 균등하게 분배할 수 있다.
예를 들어, 사용자 ID를 해시 함수에 넣어 나온 값을 샤드 수로 나눈 나머지를 기준으로 샤드를 결정할 수 있다:1
shard_id = hash(user_id) % number_of_shards
이 방식의 장점은 데이터가 고르게 분산된다.
하지만 샤드의 수를 변경하면 대부분의 데이터가 재배치되어야 하는 단점이 있다.
디렉토리 기반 샤딩 (Directory Based Sharding)
디렉토리 기반 샤딩은 별도의 조회 테이블을 사용하여 각 데이터가 어느 샤드에 있는지를 추적하는 방식.
이 방식은 가장 유연한 샤딩 방식으로, 동적으로 샤드 매핑을 변경할 수 있다.예를 들어, 다음과 같은 매핑 테이블을 유지할 수 있습니다:
이 방식의 장점은 매우 세밀한 제어가 가능하다.
특정 데이터를 다른 샤드로 이동시키기 쉽고, 샤드 간의 데이터 균형을 동적으로 조정할 수 있다.하지만 조회 테이블이 단일 실패 지점이 될 수 있으며, 모든 쿼리가 이 테이블을 먼저 조회해야 하므로 약간의 성능 오버헤드가 발생한다.
지리적 샤딩 (Geographic Sharding)
지리적 샤딩은 사용자의 물리적 위치를 기준으로 데이터를 분산하는 방식.
예를 들어, 아시아 지역 사용자의 데이터는 아시아에 위치한 서버에, 유럽 사용자의 데이터는 유럽 서버에 저장하는 식.이 방식의 큰 장점은 사용자와 가까운 곳에서 데이터를 제공할 수 있어 지연 시간을 크게 줄일 수 있다는 것.
또한 데이터 관련 규제(예: GDPR)를 준수하기 쉽다.하지만 사용자가 여행을 가는 등 위치가 변경될 때 성능이 저하될 수 있으며, 지역 간 데이터 동기화가 필요한 경우 복잡성이 증가한다.
기능 기반 샤딩 (Feature Based Sharding)
기능 기반 샤딩은 애플리케이션의 특정 기능이나 모듈별로 데이터를 분리하는 방식.
예를 들어, 전자상거래 플랫폼에서 주문 관련 데이터는 한 샤드 그룹에, 제품 카탈로그는 다른 샤드 그룹에 저장하는 식.이 방식은 각 기능별로 최적화된 데이터베이스 구성을 사용할 수 있다.
또한 특정 기능의 트래픽 증가가 다른 기능에 영향을 미치지 않는다.하지만 기능 간의 데이터 조인이 필요한 경우 복잡성이 크게 증가할 수 있다.
샤딩 방식을 선택할 때는 다음과 같은 요소들을 고려해야 한다.
- 데이터의 성격과 접근 패턴
- 확장성 요구사항
- 데이터 일관성 요구사항
- 운영 복잡성 관리 능력
- 애플리케이션의 쿼리 패턴
- 데이터 지역성 요구사항