[DB] 파티셔닝(Partitioning)이란? 샤딩(Sharding)이란? 파티셔닝과 샤딩의 차이점

파티셔닝(Partitioning)이란?

파티셔닝이란 데이터베이스를 여러 부분으로 분할하는 것이다. VLDB(Very Large DBMS)와 같은 하나의 DBMS에 너무 큰 테이블이 들어가면서 용량과 성능 측면에서 많은 이슈가 발생할 때 파티셔닝 기법을 이용해 해결할 수 있다. 

즉, 파티셔닝은 큰 테이블이나 인덱스를 작은 파티션(Partition) 단위로 나누어 관리하는 기법을 뜻한다.

 

파티셔닝은 데이터베이스에서 중요한 튜닝 기법으로, 데이터가 너무 커져서 조회하는 시간이 길어질 때 또는 관리 용이성, 성능, 가용성 등의 향상을 이유로 행해지게 된다. 

 

 

이러한 파티셔닝을 이용하면 다음과 같은 이점을 얻을 수 있다. 

 

1. 성능 (Performance)

  • 특정 Query의 성능을 향상시킬 수 있다. 
  • 대용량 Data Write 환경에서 효율적이다
  • 필요한 데이터만 빠르게 조회할 수 있으므로 쿼리가 가벼워진다.
  • Full Scan에서 데이터 접근의 범위를 줄여 성능을 향상할 수 있다.

2. 가용성 (Availability)

  • 물리적인 파티셔닝으로 전체 데이터의 훼손 가능성이 줄어들고 데이터 가용성이 향상된다.
  • 파티션 별로 독립적으로 백업하고 복구할 수 있다.
  • 테이블의 파티션 단위로 Disk I/O를 분산하여 경합을 줄이므로 UPDATE 성능을 향상할 수 있다.

3. 관리용이성 (Manageability)

  • 큰 테이블들을 제거하여 관리를 쉽게 할 수 있다.

 

하지만 파티셔닝은 테이블을 여러 파티션으로 쪼개기 때문에 테이블 간의 Join 비용이 증가한다. 또한 테이블과 인덱스를 별도로 파티셔닝 할 수 없기 때문에 테이블과 인덱스를 같이 파티셔닝해야 한다는 단점도 존재한다.

 

 

파티셔닝의 종류

1. 수평 파티셔닝 (Horizontal Partitioning)

수평 파티셔닝
[그림 1] 수평 파티셔닝

수평 파티셔닝은 하나의 테이블의 각 행을 다른 테이블에 분산시키는 것이다. 예를 들어 [그림 1]과 같이 5개의 행이 있는 테이블을 각각 3개, 2개의 행을 가진 테이블로 쪼갤 수 있다.

 

장점

  • 데이터의 개수를 기준으로 나누어 파티셔닝한다.
  • 데이터의 개수와 인덱스의 개수가 줄어들어 성능이 향상된다.

단점

  • 데이터를 찾는 과정이 기존보다 복잡하므로 Latency가 증가한다.

 

참고 : 샤딩(Sharding)이란?

 

샤딩은 같은 테이블 스키마를 가진 데이터를 다수의 데이터베이스에 분산하여 저장하는 기법을 뜻한다. 종종 샤딩과 수평 파티셔닝이 같은 의미로 사용되곤 하지만, 사실 둘은 조금 다르다. 

 

샤딩(Sharding)
[그림 2] 샤딩(Sharding)

수평 파티셔닝은 같은 데이터베이스 내에서 하나의 큰 테이블을 쪼개 분산 저장하는 기법이다.

반면, 샤딩은 하나의 큰 테이블을 쪼개 각각 다른 데이터베이스에 분산 저장하는 기법이다.

 

이러한 샤딩은 수평 파티셔닝의 장점을 모두 갖는다. 

 

샤딩은 데이터베이스 서버 간의 연결 과정이 많아져 비용이 증가할 수 있다. 또한 하나의 서버가 고장 나면 데이터의 무결성이 깨질 수 있다는 단점도 있다.

 

2. 수직 파티셔닝 (Vertical Partitioning)

수직 파티셔닝
[그림 3] 수직 파티셔닝

수직 파티셔닝은 테이블의 일부 열을 빼내는 형태로 분할한다. 즉, 테이블의 칼럼을 기준으로 나누어 파티셔닝 한다.

정규화도 수직 파티셔닝과 관련된 과정이라고 할 수 있다. 하지만 수직 파티셔닝은 이미 정규화된 데이터를 분리하는 과정이라고 생각해야 한다.

 

장점

  • 자주 사용하는 칼럼을 분리하여 성능을 향상할 수 있다.
  • 같은 타입의 데이터가 저장되어 데이터 압축률을 높일 수 있다.
  • 조회 시 필요 없는 칼럼을 조회하지 않아도 되므로 성능상의 이점이 있다.

단점

 

  • 데이터를 찾는 과정이 기존보다 복잡하므로 Latency가 증가한다.

 

 

파티셔닝 범위

1. 범위 분할 (range partitioning)

  • 연속적인 숫자나 날짜를 기준으로 파티셔닝 한다.
  • 분할 키 값이 범위 내에 있는지 여부로 구분한다.
  • 우편 번호, 날짜 등의 데이터에 적합하다.

 

2. 목록 분할 (list partitioning)

  • 값 목록에 파티션을 할당 분할 키 값을 그 목록에 비추어 파티션을 선택한다.
  • 특정 파티션에 저장될 데이터에 대한 명시적 제어가 가능하다.
  • 분포도가 비슷하며, 많은 SQL에서 해당 칼럼의 조건이 많이 들어오는 경우 유용하다.

 

3. 해시 분할 (hash partitioning)

  • 파티션 키(Key)의 해시 값에 의한 파티셔닝이 이루어진다.
  • 균등한 데이터 분할이 가능하다.
  • 특정 데이터가 어느 Hash 파티션에 있는지 판단하기 어렵다.
  • 해시 함수의 값에 따라 파티션에 포함할지 여부를 결정한다.
  • 파티션을 위한 범위가 없는 데이터에 적합하다.

 

4. 합성 분할 (composite partitioning)

  • 상기 기술을 결합하는 것을 의미한다. 즉, 파티션의 sub-partitioning을 뜻한다.
  • 큰 파티션에 대한 I/O 요청을 여러 파티션으로 분산할 수 있다.
  • 예를 들면 먼저 범위 분할하고, 다음에 해시 분할 같은 것을 생각할 수 있다. 

 

 


참고

1.https://ko.wikipedia.org/wiki/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4_%EB%B6%84%ED%95%A0

2. https://gmlwjd9405.github.io/2018/09/24/db-partitioning.html

3. https://nesoy.github.io/articles/2018-02/Database-Partitioning

4. https://seokbeomkim.github.io/posts/partition-and-sharding/#hphorizontal-partitioning%EA%B3%BC-%EC%83%A4%EB%94%A9sharding-%EB%B9%84%EA%B5%90

 

반응형

댓글

Designed by JB FACTORY