database partitioning

database sharding

파티셔닝과 샤딩 차이

파티셔닝/샤딩 도구

database partitioning

하나의 큰 데이터베이스 테이블을 작고 가능한 단위(파티션)로 나누는 기술

논리적 분할(logical partitioning)으로 데이터는 동일한 데이터베이스 인스턴스 내에 유지된다

파티셔닝 유형

범위 파티셔닝

특정 열의 값 범위에 따라 데이터를 분할하는 방법

범위 쿼리에 최적화되지만 특정 파티션에 데이터가 몰릴 위험이 있다 (hotspot)

e.g 고객 테이블에서 가입일을 기준으로 2023, 2024 등 연도별로 데이터를 나눈다

리스트 파티셔닝

열의 특정 값에 따라 데이터를 분할하는 방법

데이터 그룹화를 명확히 정의할 수 있지만 새로운 값이 추가되면 파티션 재구성이 필요하다

e.g 지역 별로 데이터를 분할한다 (서울, 부산, 대구 등)

해시 파티셔닝

특정 열의 해시 값을 사용하여 데이터를 균등하게 분산하는 방법

데이터가 균등하게 분산되어 hotspot을 방지할 수 있으나 범위 쿼리에는 비효율적이다

e.g 사용자 id를 해시 함수로 계산해 4개의 파티션에 분산한다

복합 파티셔닝

여러 파티셔닝 유형을 조합한 방법

복잡한 데이터 구조를 효과적으로 관리할 수 있으나 설계와 관리가 복잡하다

e.g 범위 파티셔닝 적용 후 각 범위에 해시 파티셔닝 추가

파티셔닝 장단점

장점 단점
특정 파티션에만 액세스하여 쿼리 성능을 향상시킬 수 있다 파티셔닝 설계가 복잡하며 역효과가 발생할 수 있다
대용량 데이터를 분산해 데이터베이스 부하를 감소시킬 수 있다 관리 및 유지보수 작업이 증가한다
특정 파티션 단위로 백업, 복구가 가능하다 파티션 간 데이터 이동 시 성능 저하가 발생할 수 있다
데이터 삭제 및 아카이빙에 용이하다 분산된 데이터로 인해 조인 쿼리가 느려질 수 있다

파티셔닝과 동시성 문제 해결

데이터 분산을 통한 트래픽 감소

데이터를 여러 파티션으으로 나누면 각각의 파티션에 독립적인 락이 걸린다

특정 파티션에만 데이터가 조회/수정되므로 파티션을 나누기 전보다 트랜잭션 간의 충돌 가능성이 감소한다 (락 경합 감소)

e.g 고객 데이터를 가입 연도 기준으로 나누면, 특정 연도의 데이터만 액세스하는 쿼리가 다른 연도 데이터(파티션)와 충돌하지 않는다

쿼리 부하 분산

파티션별로 독립적인 쿼리가 실행되기 때문에 단일 테이블에 집중되던 부하를 완화시킬 수 있다

인덱스 크기가 작아져 쿼리 성능이 향상되고 락이 걸리는 범위가 줄어든다

database sharding

데이터베이스를 여러 개의 독립적인 샤드(shard)로 분할하여 물리적으로 다른 서버나 노드에 저장하는 기술

분산 데이터베이스의 일종으로 각 샤드는 독립적인 데이터베이스 시스템이다

샤딩 구성 요소

샤드 키 (shard key)

데이터를 샤드로 분배하기 위한 기준

사용자 id, 주문 번호 등

샤드

각 샤드는 별도의 데이터베이스 인스턴스이며 특정 데이터의 하위 집합을 저장한다

라우터

샤드 키를 기준으로 요청을 올바른 샤드로 라우팅한다

샤딩 전략

범위 샤딩

샤드 키의 범위 따라 데이터를 분할하는 방식

간단하고 구현이 쉽지만 특정 샤드에 데이터가 몰릴 수 있다

해시 샤딩

샤드 키의 해시 값을 기준으로 데이터를 분배하는 방식

데이터가 균등하게 분산되지만 범위 쿼리에 비효율적이다

지리적 샤딩

데이터의 물리적 위치를 기준으로 샤드를 분할하는 방식

지리적 근접성으로 네트워크 지연을 최소화하지만 지역 간 데이터 이동 시 복잡성이 증가한다

e.g 아시아 데이터를 샤드 1, 유럽 데이터를 샤드 2에 저장

샤딩 장단점

장점 단점
수평적 확장 가능 샤드 간 조인 쿼리가 어렵다 (복잡한 쿼리 설계 필요)
특정 샤드에만 액세스하여 성능을 향상시킬 수 있다 샤드 키 설계가 잘못되면 데이터 불균형 문제가 발생한다
장애 시 특정 샤드만 복구할 수 있다 샤드가 많아지면 관리 및 모니터링에 대한 부담이 증가한다
데이터베이스의 물리적 한계를 극복한다 샤드 수 증가로 네트워크 비용과 복잡성이 증가한다

샤딩과 동시성 문제 해결

수평적 확장을 통한 트래픽 분산

샤딩은 데이터를 여러 물리적 데이터베이스 인스턴스로 분리하므로 특정 샤드에서만 요청이 처리된다

병렬 처리가 가능해지고 단일 데이터베이스의 부하를 줄일 수 있다

독립적인 트랜잭션 처리로 락 경합 및 데드락 발생 가능성 감소

각 샤드의 트랜잭션이 다른 샤드에 영향을 주지 않는다

이는 락 경합과 데드락 발생 가능성을 크게 줄인다

파티셔닝과 샤딩의 차이

특징 파티셔닝 샤딩
분할 기준 논리적 분할 (단일 DB 인스턴스) 물리적 분할 (다중 DB 인스턴스)
목적 성능 최적화, 데이터 관리 용이성 수평적 확장, 대규모 데이터 처리
쿼리 성능 동일 DB 내에서 빠른 쿼리 처리 가능 샤드 간 데이터가 분산되어 조인 쿼리 비효율 발생 가능
구성 복잡성 상대적으로 쉽다 상대적으로 복잡하다
사용 사례 대규모 데이터 분석, 범위 쿼리 글로벌 서비스, 대용량 트래픽 처리

파티셔닝/샤딩 도구

mysql partitioning

mysql에서 제공하는 파티셔닝 기능

범위, 리스트, 해시 파티셔닝 지원

vitess

mysql 기반 분산 데이터베이스 플랫폼

샤딩, 쿼리, 라우팅, 장애 조치 등 지원

apache cassandra

분산 nosql 데이터베이스

샤딩 및 분산 데이터 처리 지원

cockroachdb

분산형 sql 데이터베이스로 자동 샤딩 및 복제를 지원한다