티스토리 뷰
1. 파티셔닝이란?
파티셔닝은 데이터를 여러 파티션 또는 샤드로으로 나누어 저장하는 방법입니다. 각 파티션은 독립적인 저장소이자 처리 단위가 되어, 분산 시스템에서 데이터 작업을 병렬로 수행할 수 있게 해준다.
예:
- 트위터는 유저 ID 기준으로 트윗을 파티셔닝하여 수억 명의 사용자 트윗을 분산 저장
- MySQL의 샤딩된 테이블은 서로 다른 서버에 분산되어 트래픽을 나눔
2. 파티셔닝 키 (Partitioning Key) 선택
파티셔닝에서 가장 중요한 결정은 어떤 필드를 기준으로 데이터를 나눌 것인지입니다. 이 필드를 샤딩 키라고 부른다.
좋은 파티셔닝 키의 조건:
- 균등 분산: 특정 키에 데이터가 몰리지 않아야 함
- 쿼리 효율성: 자주 조회되는 쿼리가 해당 키로 빠르게 조회 가능해야 함
- 불변성: 파티셔닝 키는 한 번 저장된 후 바뀌지 않는 것이 좋음
나쁜 키 예시:
- 가입일: 초기에 가입한 사용자에만 데이터가 몰릴 수 있음
- 성별: 파티션이 두 개뿐이라면 분산이 제대로 되지 않음
3. 주요 파티셔닝 전략
1) 해시 파티셔닝 (Hash Partitioning)
파티셔닝 키에 해시 함수를 적용해 파티션을 결정.
- 장점
- 데이터가 고르게 분산됨
- 단점
- 파티션 수가 바뀌면 대부분의 데이터가 이동해야 함
- 범위 쿼리에 적합하지 않음
- 사용 예시
- MongoDB의 기본 샤딩
- Cassandra의 consistent hashing
2) 범위 파티셔닝 (Range Partitioning)
파티셔닝 키의 값 범위로 파티션을 나눈다.
예: 1
1000, 1001
2000...
- 장점
- 범위 기반 쿼리에 유리 (예: 날짜 검색)
- 단점
- 특정 범위에 데이터가 몰릴 경우, 핫 파티션 발생 가능
- 사용 예시
- 시계열 데이터 저장소 (예: Prometheus, InfluxDB)
- 로그 수집 시스템
- 시계열 데이터 저장소 (예: Prometheus, InfluxDB)
3) 리스트 파티셔닝 (List Partitioning)
- 파티션 키의 특정 값 집합에 따라 파티션을 정의
- 예: 국가 = KR → 파티션1, US → 파티션2
- 장점
- 카테고리 분류가 명확한 경우 유용
- 단점
- 범주가 너무 많아지면 파티션 관리 어려움
- 사용 예시
- 멀티테넌시 SaaS 시스템 (테넌트 ID 기준)
4. 파티셔닝 쿼리의 동작
- 단일 파티션 쿼리
- 파티션 키를 명시한 조회
- 효율적이며 빠름
- 다중 파티션 쿼리
- 범위 또는 보조 인덱스를 사용하는 쿼리
- 파티션 전체를 탐색하거나 병렬 조회 + 병합 필요 → 느림
5. 파티션 재조정 (Rebalancing)
운영 중인 시스템에서 파티션 수를 변경해야 할 때, 기존 데이터를 재배치하는 과정을 재조정이라고 한다.
어려운 점:
- 대량의 데이터를 이동해야 하므로 비용이 큼
- 시스템의 일관성과 가용성을 유지하면서 재조정해야 함
대표적인 해결책:
- Consistent Hashing
- 전체 데이터의 일부만 재배치되도록 설계
- 미들웨어 라우터 사용
- 실제 파티션 수와 관계없이 라우팅 테이블에서 처리
6. 파티셔닝과 트랜잭션
단일 파티션 트랜잭션:
- 한 파티션 내에서만 이루어짐
- 간단하고 빠름
다중 파티션 트랜잭션:
- 2PC(2단계 커밋) 같은 분산 트랜잭션 필요
- 실패 가능성, 성능 저하 등 위험 존재
- 전략
- 트랜잭션 범위가 파티션을 넘지 않도록 데이터 모델링
- 카산드라, DynamoDB 등은 아예 다중 파티션 트랜잭션을 지원하지 않음
7. 보조 인덱스와 파티셔닝
- 전역 보조 인덱스(Global Secondary Index)는 모든 파티션을 참조해야 하므로 비용이 큼
- 로컬 인덱스(Local Index)는 파티션 안에서만 동작 → 빠르지만 제약 있음
- 트레이드오프
- 전역 인덱스: 검색은 빠르나 업데이트와 확장성이 떨어짐
- 로컬 인덱스: 확장성은 좋지만 검색 제약
회고
파티셔닝 학습 정리
파티셔닝의 개념
- 데이터를 여러 파티션(또는 샤드)으로 나눠 분산 저장
- 확장성과 처리 성능 확보에 유리
좋은 파티셔닝 키의 조건
- 균등 분산
- 자주 조회되는 쿼리에 적합
- 변경되지 않는 값일 것
파티셔닝 전략
- 해시 파티셔닝: 균등 분산은 잘 되지만 범위 쿼리에 불리
- 범위 파티셔닝: 범위 기반 쿼리에 유리하나 핫 파티션 우려
- 리스트 파티셔닝: 명확한 범주가 있을 때 유용, 범주가 많아지면 관리 어려움
쿼리와 파티션
- 단일 파티션 쿼리는 빠름
- 다중 파티션 쿼리는 느리고 비용이 큼
파티션 재조정
- 파티션 수 변경 시 데이터 이동 필요
- Consistent Hashing이나 라우팅 테이블로 일부만 이동하는 구조 필요
트랜잭션 처리
- 단일 파티션 트랜잭션은 단순하고 빠름
- 다중 파티션 트랜잭션은 복잡하고 실패 가능성 있음
보조 인덱스
- 전역 인덱스: 쿼리는 빠르지만 확장성 떨어짐
- 로컬 인덱스: 확장성 좋지만 쿼리에 제약 있음
댓글
