이 글은 'Fundamentals of Database Engineering'에 관한 아래 유데미 강의를 보고, 공부한 내용을 정리하였습니다.
https://www.udemy.com/course/database-engines-crash-course
파티셔닝
파티셔닝이란?
- 파티셔닝: 거대 테이블을 여러 개의 테이블로 분할하고, WHERE 절에 따라 어떤 테이블 또는 파티션에 접근할지 결정하는 기술
- 실제 데이터가 담기는 테이블을 TEMP_100K, TEMP_200K, TEMP_300K... 이런 식으로 나누고, TEMP(master table) 테이블은 실제 데이터는 갖고 있지 않음.
- ex) TEMP로 id = 210,001에 대한 조회 쿼리가 오면 DB는 TEMP_200K에서 찾아서 주는 방식
사용법
- 아래와 같은 방식으로 파티셔닝 된 table 생성, grades_parts로 INSERT되면 DB는 g 값에 따라 알아서 row가 속하는 파티션을 결정해 줌.
CREATE TABLE grades_parts (id serial not null, g int not null) partition by range(g);
CREATE TABLE g0035 (like grades_parts including indexes);
CREATE TABLE g3560 (like grades_parts including indexes);
...
ALTER TABLE grades_parts attach partition g0035 fro values from (0) to (35);
...
- index를 걸고 싶으면 각 파티션 테이블에 거는 게 아니라, master(leader) 테이블에만 만들어주면 각 파티션 테이블에 인덱스가 걸림(^postgres12)
- 파티셔닝 해서 인덱스 걸면, row가 많아져도 각 테이블의 index 크기가 작아지기 때문에 속도 측면에서도 유리함
- 기본적으로 켜져 있겠지만 'partition pruning' 옵션이 켜져 있는지 확인해야 함.
수평 파티셔닝 vs 수직 파티셔닝
수평 파티셔닝: 행 단위로 나누는 것(range or list로 파티션을 나눌 수 있음)
수평 파티셔닝: 열 단위로 파티션을 나눈 것
ㄴ Blob(binary large object)과 같은 large column 일 때, 그 blob 문서를 거의 쿼리 하지 않을 때 유용함
ㄴ 이런 상황에서 Blob table은 slow access drive에 넣고, 나머지는 SSD에 넣으면 공간과 액세스 속도를 절약할 수 있음
파티셔닝 유형
- By Range: 연도 등 이용 아카이브 lifecycle에도 이용
- By List: 이산적인(discrete) 값 사용, ex_나라명 등
- By Hash: 해시 함수 이용
파티셔닝 vs 샤딩
수평 파티셔닝
- 동일한 DB 내에 여러 테이블로 분할하며, DB가 분할의 관리를 담당, client 입장에서는 추상화되어 있어서 알 필요 없음
- 테이블 명이 변경됨
샤딩
- 큰 테이블을 여러 개의 테이블로 분할 후 다른 서버에 배치, 본질적으로 분산 처리를 위함.(레이턴시 절감 등), client 입장에서 인지하고 있어야 함
- 테이블 명은 유지됨, 쿼리를 실행하는 서버가 변경될 뿐
파티셔닝 장단점
장점
- 쿼리 성능 개선(특정 상황에서 순차 스캔 대신 분산된 인덱스 스캔)
- 쉬운 대량 로딩 가능
- easy attach partition(일례로 mysql에서는 수억 개의 csv 파일을 파티션으로 이용하고, DB에서 CSV를 가리키는 테이블을 만들 수 있음)
- old data 아카이브(테이블 별 HDD/SSD 구분 등)
단점
- 다른 파티션으로 이동시키는 업데이트는 느림(값이 바뀌어서 다른 파티션으로 옮겨가는 경우)
- 비효율적 쿼리는 모든 파티션을 조회할 수 있음. 단일 테이블보다 성능 하락
- 스키마 변경이 어려움
샤딩
샤딩이란?
- 필요성: 하나의 DB에서 데이터가 많아질수록 쿼리가 느려짐
- 샤딩: 데이터를 여러 DB 인스턴스에 분산하여 파티션으로 세분화하는 프로세스, 시스템의 쿼리 속도 향상 및 확장성 확보 목적
- 테이블을 분할해서 다른 DB 인스턴스에 넣는데, 특정 필드나 열을 파티션 키(단축키)로 하여 이를 기반으로 여러 테이블에 넣음
Consistent Hashing(일관된 해싱)
- 입력을 일관되게 해싱하여 서버를 결정 -> 동일한 입력 쿼리에 대해 항상 같은 서버로 보낼 것을 보장하는 것
- ex) 문자열이면 아스키코드로 변환 후 모듈러 연산, Hash("Input1") % n
수평 파티셔닝 vs 샤딩
수평 파티셔닝: 테이블 이름은 다른 곳에 저장되지만 client가 알 필요 없음
샤딩: 모든 것이 동일하지만 다른 서버에 저장됨
장단점
장점
- 확장성을 얻을 수 있음, data & memory
- 보안 수준 제어 가능, 데이터 분산
- index 크기가 줄어들어 최적화됨
단점
- 클라이언트가 복잡해짐
- 샤드 간 트랜잭션에 대한 문제.. 서버가 달라지면 별개의 원자성을 갖기 때문
- 롤백이 어려워짐
- 스키마 변경이 어려워짐
- 조인 수행의 어려움
- 키와 상관없는 column을 조회할 때의 어려움
DB 샤딩을 하는 시점
- 다른 방법을 다 사용하고 최대한 마지막에 사용
- 복잡한 작업과 아키텍처를 요구함
- 인덱스, 파티셔닝, 레플리카, 캐싱 등을 사용하고 최후에 사용... 오버 엔지니어링하지 않도록 주의
- 샤딩은 클라이언트 단에서도 지식이 있어야 하지만, 파티셔닝은 최근 DB에서는 활성화만 하면, 클라이언트는 알 필요 없도록 자동으로 동작함
- 요즘은 vitesse와 같은 미들웨어가 샤딩을 도와주긴 함. (하지만 정말 필요한가에 대해서는 한번 더 고민해 볼 것)