728x90
반응형
SMALL
DB Partitioning
서비스의 크기, DB에 저장하는 데이터의 규모가 대용량이 되면서, 기존에 사용하는 DB 시스템의 용량(Storage)의 한계와 성능(Performance)의 저하가 발생했다.
즉, VLDB(Very Large DBMS)와 같이 하나의 DBMS에 너무 큰 Table이 들어가면 용량과 성능 측면에서 이슈가 발생했고, 이를 해결하기 위해 Table을 Partition이라는 작은 단위로 물리적 분할하여 관리하는 기법이 탄생했다.
논리적인 데이터 element들을 다수의 entity로 쪼개는 행위, 큰 Table이나 index를 관리하기 쉬운 단위로 분리하는 방법이다.
장점
성능 (Performance)
- 특정 DML과 Query의 성능을 향상시킨다.
- 대용량 Data Write 환경에서 효율적이다.
- 데이터 전체 검색 시 필요한 부분만 탐색해 성능이 증가한다. 즉, Full Scan에서 Data Access 범위를 줄여 성능 향상을 가져온다.
- 필요한 데이터만 빠르게 조회할 수 있기 때문에 Query 자체가 가볍다.
- 많은 Insert가 있는 OLTP 시스템에서 Insert 작업을 작은 단위인 partition들로 분산시켜 경합을 줄인다.
- OLTP : Online Transaction Processing 온라인 트랜잭션 처리를 말하며, 네트워크 상의 온라인 사용자들의 데이터베이스에 대한 일괄 트랜잭션 처리를 의미
- OLAP : Online Analytical Processing 데이터베이스 자체적으로 운용되는 시스템이라기보다는 데이터 웨어하우스 등의 시스템과 연관되어 데이터를 분석하고 의미 있는 정보로 치환하거나 분석하는 방법
가용성 (Availability)
- 물리적인 partitioning으로 인해 전체 데이터의 훼손 가능성이 줄어들고 데이터 가용성이 향상된다.
- 각 분할 영역(partition 별로)을 독립적으로 백업하고 복구할 수 있다.
- table의 partition 단위로 Disk I/O를 분산하여 경합을 줄이기 때문에 Update 성능을 향상시킨다.
관리용이성 (Manageability)
- 큰 table들을 제거하여 관리를 쉽게 해준다.
단점
table 간 JOIN에 대한 비용이 증가한다.
table과 index를 별도로 partitioning 할 수 없고 table과 index를 같이 partitioning 해야 한다.
Partitioning 종류
수평(horiziontal) 파티셔닝
- 샤딩과 동일한 개념
- 스키마(schema)를 복제한 후 샤드 키를 기준으로 데이터를 나누는 것, 즉 스키마가 같은 데이터를 두 개 이상의 테이블에 나누어 저장하는 것
- 퍼포먼스, 가용성을 위해 KEY 기반으로 여러 곳에 분산 저장한다.
- 일반적으로 분산 저장 기술에서 파티셔닝은 수평 분할을 의미한다.
Sharding
같은 테이블 스키마를 가진 데이터를 다수의 데이터베이스에 분산하여 저장하는 방법, 수평 파티셔닝과 동일한 개념이다.
수평 분할 파티셔닝은 스키마가 같은 두 개 이상의 테이블에 나누어 저장하는 방법, 즉 하나의 데이터베이스 안에서 이루어진다.
이와 다르게, 샤딩은 물리적으로 다른 데이터베이스에 데이터를 수평 분할 방식으로 분산 저장하고 조회하는 방법이다.
그렇기에 두 개 이상의 샤드에 대한 JOIN이 불가능하다.
장점
- 데이터 개수가 작아지고 따라서 index의 개수도 작아져 성능 향상
단점
- 서버 간 연결과정이 많아진다.
- 데이터를 찾는 과정이 기존보다 복잡하기에 지연시간(latency)이 증가한다.
- 하나의 서버가 고장 나게 되면 데이터의 무결성이 깨질 수 있다.
수직(Vertical) 파티셔닝
- 모든 컬럼들 중 특정 컬럼들을 쪼개서 따로 저장하는 형태를 의미한다.
- 스키마를 나누고 데이터가 따라 옮겨가는 것을 의미한다.
- 정규화하는 과정과 비슷하지만 수직 파티셔닝은 이미 정규화된 데이터를 분리하는 과정이다.
장점
- 자주 사용하는 컬럼등을 분리시켜 성능을 향상시킬 수 있다.
- 필요한 컬럼만 메모리에 올려서 Select 하기에 성능상 이점이 있다.
- 같은 타입의 데이터가 저장되기 때문에 저장 시 데이터 압축률을 높일 수 있다.
Partitioning 분할 기준
범위 분할 (range partitioning)
- 분할 키 값이 범위 내에 있는지 여부로 구분한다.
- ex) 우편번호, 일별, 월별, 분기별 데이터
목록 분할 (list partitioning)
- 목록에 파티션을 할당하고 분할 키 값을 그 목록에 비추어 파티션을 선택한다.
- ex) 한국, 일본, 중국 → 아시아 / 노르웨이, 스웨덴, 핀란드 → 북유럽
해시 분할 (hash partitioning)
- 해시 함수의 값에 따라 파티션에 포함할지 여부 결정한다.
- ex) 4개의 파티션으로 분할하는 경우 해시 함수는 0,1,2,3의 정수를 돌려준다.
합성 분할 (composite partitioning)
- 큰 파티션에 대한 I/O를 여러 partition으로 분산할 수 있다.
- 서브 파티셔닝을 의미한다. 예를 들어 먼저 범위 분할을 하고, 이후 해시 분할 같은 것을 생각할 수 있다.
Reference
- https://nesoy.github.io/articles/2018-02/Database-Partitioning
- https://gmlwjd9405.github.io/2018/09/24/db-partitioning.html
- https://seokbeomkim.github.io/2019/05/%ED%8C%8C%ED%8B%B0%EC%85%94%EB%8B%9Dpartitioning%EA%B3%BC-%EC%83%A4%EB%94%A9sharding/#hp-horizontal-partitioning-%EA%B3%BC-%EC%83%A4%EB%94%A9-sharding-%EB%B9%84%EA%B5%90
- https://nesoy.github.io/articles/2018-05/Database-Shard
728x90
반응형
LIST
'Develope > Database' 카테고리의 다른 글
[DB] Database Index 인덱스 개념 (0) | 2022.08.31 |
---|---|
[JPA Test] JPA 연동 Test (0) | 2022.07.30 |
[Spring-Data-JPA] Auditing - Entity 공통 요소 자동 맵핑하기 (0) | 2022.07.30 |
[MySQL Explain] 쿼리의 실행 계획 살펴보기 (0) | 2021.01.28 |
[MyBatis] RDB MyBatis란? 기본 설정 및 동적 쿼리 (0) | 2020.03.17 |