파티셔닝 : DB 테이블을 열에 대해서 수직으로 혹은 행에 대해 수평으로 나누는 두 가지 방법으로 작은 부분으로 여러 개 나누는 것
샤딩 : 동일한 스키마를 가지고 있는 여러대의 데이터베이스 서버들에 데이터를 작은 단위로 나누어 분산 저장하는 기법
-
Vertical Partitioning
(수직) : Column 기준 장점- 자주 사용하는 칼럼을 분리하여 성능을 향상할 수 있다.
- 같은 타입의 데이터가 저장되어 데이터 압축률을 높일 수 있다.
- 조회 시 필요 없는 칼럼을 조회하지 않아도 되므로 성능상의 이점이 있다.
단점
- 데이터를 찾는 과정이 기존보다 복잡하므로 Latency 증가
-
Horizontal Partioning
(수평) : Row 기준 장점- 데이터의 개수를 기준으로 나누어 파티셔닝한다.
- 데이터의 개수와 인덱스의 개수가 줄어들어 성능이 향상된다.
단점
- 데이터를 찾는 과정이 기존보다 복잡하므로 Latency 증가
- 별개로! 정규화는 중복된 데이터를 분리하기 위해 사용, 수직 파티셔닝은 이 테이블에 대해 정규화가 다 끝나고 성능상 이점을 보기 위해 그 때 분리함.
- 파티셔닝은 모든 데이터를 동일한 컴퓨터에 저장하지만, 샤딩은 데이터를 서로 다른 컴퓨터에 분산한다는 점에서
- 장점 : 부하가 분산됩니다.
- 단점
- 서버를 나눈 것 == 분산된 서버마다 연결해야하므로 수평 파티셔닝보다 접근시간이 더 오래 걸립니다.
- 하나의 서버가 고장났을 때, 문제에 대한 대처가 복잡하다. 데이터 무결성이 지켜지지 않는다.
-
샤딩이란 작은 단위로 나누어 분산 저장하는 기법, 이 때 작은 단위 : 샤드
-
Hash Sharding
- PK값의 모듈러 연산 결과를 통해 샤드를 결정하는 방식
- 데이터 개수가 변경될 때 해시 함수도 변경해야하고, 따라서 데이터의 재 정렬이 필요
- 총 데이터베이스 수가 정해져있을 때 유용
-
Range Sharding
- PK 값을 범위로 지정하여 샤드를 지정하는 방식
- Hash Sharding 대비 데이터베이스 증설 작업에 큰 리소스가 소요되지 않는다.
- 특정한 데이터베이스에만 부하가 몰릴 수 있다는 단점
- 조회 시 필요없는 칼럼이 있는 경우, 칼럼을 제외해도 되므로 칼럼별로 분류할 때 사용 가능
- 필요없는 칼럼이 없는 경우, 구할 때 마다 메모리에 값을 올리는 게 부담이 있으므로 자주 사용하는 컬럼만 파티셔닝하여 메모리에 올릴 때 유용유용
- 데이터베이스에 들어온 양이 어마무시하게 많을 때
List Partitioning 리스트 파티셔닝
- 관리자가 직접 지정하는 방식으로 잘 설정한 경우에는 빠른 성능이 보장되지만, 잘못 설정된 경우에는 성능 저하됨. (ex 지역별)
- 많은 SQL에서 해당 칼럼의 조건이 많이 들어오는 경우 유용
Range Partitioning 범위 파티셔닝
- 데이터 내의 특정 범위 내역을 정하여 파티셔닝 해주는 방법
- 장점 : 사용하기 쉬움
- 단점 : 데이터가 균일하게 분포되지 못해서 성능 저하가 생길 수 있다 (ex) 우편 번호, 날짜 등의 데이터에 적합)
Hash Partitioning 해시 파티셔닝
- 파티션 키(Key)의 해시 값에 의한 파티셔닝
- range 파티션에서 범위 분포에 대한 단점을 보완
- hash 함수가 데이터를 균등하게 분포시켜 성능 하락을 방지
- 데이터의 관리가 어렵다는 단점
Composite Partitioning 복합 파티셔닝
- 위 파티셔닝 종류 중 두개 이상을 사용하는 방식
- 큰 파티션에 대한 I/O 요청을 여러 파티션으로 분산할 수 있다.
- 예를 들면 먼저 범위 분할하고, 다음에 해시 분할 같은 것을 생각할 수 있다.
Q-1) 파티셔닝을 사용한다는 것은 데이터를 분리해서 조회 속도를 향상시키기 위함인데, 해시 파티셔닝은 결국 어떤 파티션에 어떤 데이터가 있는 지 모르니 모든 테이블을 찾는 경우가 생길 것 같습니다. 그럼 해시분할은 왜 사용할까요?
- 해시 분할의 경우 mod를 사용하기때문에 mod를 이용해서 값을 찾을 수 있고 키를 문자나 날짜로 설정할 수도 있는데 이럴 경우에는 숫자화를 해준다음 mod를 적절하게 사용해서 찾을 수 있습니다.
- 테이블 분산을 통해, 쓰기 작업 시 작업이 분산돼 성능이 향상됩니다.
- 물리적으로 여러 테이블로 분산하여 저장되지만, 사용자는 마치 하나의 테이블에 접근하는 것과 같이 사용
- 큰 테이블을 나눠 사용하므로, 관리하기 쉽습니다.