파티셔닝과 샤딩(MySQL)

민선규·2024년 5월 28일

데이터베이스

목록 보기
9/11
post-thumbnail

이번에는 데이터베이스의 파티셔닝과 샤딩에 대해서 학습한 내용을 정리해보겠습니다. 파티셔닝과 샤딩에 대해서 '그냥 테이블을 나누는거 아니야?' 정도로만 알고있었지만 이번 기회에 자세하게 학습해보았습니다.

등장배경

앞서 말했듯이 파티셔닝과 샤딩을 단순명료하게만 설명하면 테이블을 나누는 것입니다. 그렇다면 대체 테이블을 나누는 이유가 무엇일까요?

테이블을 나누는 이유는 예시로 한 번 설명해보겠습니다. '만약 하나의 데이터를 가져오는데 해당 테이블에 너무 많은 데이터가 있는 경우' 또는 '하나의 데이터를 가져오는데 불필요한 컬럼이 많이 포함되있는 경우' 이러한 경우들은 성능적으로도 관리적으로도 마이너스인 경우입니다.

이러한 상황을 개선하기 위해 테이블을 나누는 기법인 파티셔닝과 샤딩이라는 개념이 등장하게되었습니다.

파티셔닝

파티셔닝에 대해서 정리해보겠습니다. 파티셔닝은 하나의 테이블을 여러개의 테이블로 분할하는 작업입니다. 특징으로는 물리적으로는 테이블이 나뉘어졌지만 사용자는 하나의 테이블에 접근하는 것처럼 사용할 수 있는 점이 특징입니다.

기존 테이블

idnameprice
1nameprice
2nameprice
...nameprice
99999nameprice
100000nameprice

종류

수평 파티셔닝

먼저 수평 파티셔닝입니다. 수평 파티셔닝은 테이블을 기준으로 가로로 분리하는 것을 의미합니다. 데이터가 많이 저장된 테이블을 분리함으로써 성능적인 이점을 가져오는데 목적이 있습니다.

수평 파티셔닝 적용

idnameprice
1nameprice
2nameprice
...nameprice
49999nameprice
50000nameprice

idnameprice
50001nameprice
50002nameprice
...nameprice
99999nameprice
100000nameprice

수직 파티셔닝

다음으로는 수직 파티셔닝입니다. 수직 파티셔닝은 테이블을 기준으로 세로로 분리하는 것을 의미합니다. 자주 사용하는 컬럼만 관리할 수 있는 이점이 있습니다.

수직 파티셔닝 적용

idname
1name
2name
...name
99999name
100000name

idprice
1price
2price
...price
99999price
100000price

분할 기준

파티셔닝을 하기 위해서 가장 먼저 파티셔닝 키를 정해야합니다. 파티셔닝 키는 테이블의 컬럼 중에 하나를 목적에 맞게 택하면 됩니다. 그리고 그 키를 기준으로 범위, 리스트, 해시 방식으로 분할할 수 있습니다.

범위 : 범위 방식은 숫자/날짜 데이터에 적합합니다. 연속된 숫자/날짜를 구간을 기준으로 데이터를 분할하는 방법입니다.

예시)
Key 값이 1~30 : 테이블_0
Key 값이 31~60 : 테이블_1
Key 값이 61~90 : 테이블_2

리스트 : 리스트 방식은 각 테이블에 기준값이 존재하며 해당 키가 기준값에 존재여부에 따라 분할하는 방법입니다.

예시)
Key 값이 "OO고등학교" : 테이블_0
Key 값이 "OO중학교" : 테이블_1
Key 값이 "OO초등학교" : 테이블_2

해시 : 해시 방식은 해당 키를 해싱한 값으로 분할하는 방법입니다.

예시)
Key를 해싱한 값이 0 : 테이블_0
Key를 해싱한 값이 1 : 테이블_1
Key를 해싱한 값이 2 : 테이블_2

샤딩

다음으로는 샤딩입니다. 샤딩은 위에서 학습했던 수평 파티셔닝과 비슷한 기법입니다. 하지만 결정적으로 큰 차이점이 있는데 바로 테이블이 저장되는 위치입니다.

파티셔닝의 경우 테이블을 나누었지만 결국에는 하나의 데이터베이스에 저장이 되는 방식입니다. 하지만 샤딩의 경우 나눠진 테이블을 각각의 데이터베이스에 저장하는 방식입니다. 이로 인해 부하가 분산되는 이점까지 있습니다.

다시 정리하면 샤딩은 동일한 스키마를 가지고 있는 여러대의 데이터베이스 서버들에 데이터를 작은 단위로 나누어 분산 저장하는 기법이다. 이때, 작은 단위를 샤드(shard)라고 부른다.

분할 기준

샤딩은 PK를 기준으로 테이블을 분할하고 있습니다. 테이블을 분할하는 방식 중에 대표적인 모듈러와 범위 방식에 대해서 설명해보겠습니다.

모듈러 : 모듈러는 나머지 연산을 사용하여 분할하는 방법입니다. 데이터베이스의 개수가 고정되어있을 때 효율적이며 만약 데이터베이스 수가 변경되면 분할 로직과 데이터의 재정렬이 필요합니다.

예시)
PK % 3 가 0 일때 : 데이터베이스_0
PK % 3 가 1 일때 : 데이터베이스_1
PK % 3 가 2 일때 : 데이터베이스_2

범위 : 범위는 PK 값을 범위를 통해 분할하는 방법입니다. 데이터베이스의 수가 변경되어도 크게 변경할 내용이 없는 장점이 있지만 특정 데이터베이스에 몰릴 수 있는 단점이 있습니다.

PK 값이 1~30 : 데이터베이스_0
PK 값이 31~60 : 데이터베이스_1
PK 값이 61~90 : 데이터베이스_2

참고 문서 및 링크

0개의 댓글