728x90
반응형
5장 리뷰 작성을 미루다가 6장을 먼저 공부해버렸다. 이후에 5장도 마저 작성하도록한다...
6장 preview
- 파티셔닝 방법
- 인덱스와 파티셔닝 간의 상호 작용
- 재균형화
- 데이터베이스가 올바른 파티션을 찾아 요청을 전달하고 질의를 실행하는 방법
파티셔닝
데이터 셋이 크거나, 질의 처리량이 매우 높은 경우 데이터를 작은 단위[파티션]으로 쪼개는 작업 (≒ 샤딩)
ex)
- 샤드(MongoDB, Elasticsearch, Solr), 리전 (Hbase), 태블릿 (Bigtable)
- 브이노드 (Cassandra, Riak), 브이버켓 (Couchbase)
- 파티션은 보통 각 데이터 단위(record, row, document)가 하나의 파티션에 속함
물론 파티셔닝과 샤딩의 정확한 의미의 차이는 존재합니다.
파티셔닝 : 하나의 DB 인스턴스 내에 여러 테이블로 나누어 저장하는 기법
샤딩 : 여러 DB 인스턴스에 여러 데이터 서브셋으로 저장하는 기법
파티셔닝의 목적
- 확장성 - 비공유 클러스터에서 다른 파티션은 다른 노드에 저장 가능
- 부하 분산 (디스크 분산, 질의 처리량 부하 감소[여러 노드에서 병렬 실행 가능])
- 용도에 따른 차이(파티셔닝 지원 데이터베이스의 용도 2가지 - 트랜잭션 작업부하 or 분석)는 시스템 튜닝의 차이일뿐,
파티셔닝의 기본 원칙은 동일하게 적용
파티셔닝과 복제
- 복제와 파티셔닝은 보통 함께 적용되어 각 파티션의 replica를 여러 노드에 저장 - 내결함성 보장
- 이 때 primary 파티션(리더)는 하나의 노드에 할당된다.
key-value 데이터 파티셔닝
- 부하 분산이 안되었을 때 = 쏠렸다(skew)라고 표현하며, 부하가 쏠린 파티션 = 핫스팟
- 핫스팟을 회피하는 가장 단순한 방법 : 할당 노드를 무작위 선택
- 장점 : 데이터 고르게 분산
- 단점 : 어느 노드에 해당 데이터가 저장되어있는 지 trace hard (모든 노드에 병렬 질의)
이어서 책에서는 더 나은 파티셔닝 방법에 대해 소개한다.
키 범위 기준 파티셔닝
- 각 파티션에 연속된 범위(temp_min ~ temp_max) 의 키를 할당
- 각 범위들의 경계값을 통해 어떠한 key가 어느 파티션에 속하는 지 알 수 있음
- 이를 통해 어떤 파티션이 어느 노드에 있는 지만 알면 적절한 질의 가능
- 키 범위 크기는 반드시 동일할 필요 X ( ∵ 데이터가 고르게 분포하지 않을 수 있음)
- 키의 범위는 수동 / 자동 선택 가능
ex) Bigtable, HBase, RethinkDB, MongoDB(<2.4)
key의 hash 값 기준 파티셔닝
앞서 설명한 쏠림현상과 핫스팟의 위험 때문에 많은 분산 데이터스토어는 해시 함수 사용
- 좋은 해시함수 : 유사한 데이터가 들어와도 균일 분산
- 프로그래밍 언어의 내장 해시 함수는 파티셔닝에 적합하지 않을 수도 (ex. Java의 Object.hashCode())
파티셔닝용 해시 함수는 암호적으로 강할 필요 X
ex) 카산드라, MongoDB - MD5 / 볼드모트 - Fowler-Noll-Vo 함수
장점 :
- 키를 파티션 사이에 균일하게 분산시키기 좋음
- 파티션 경계는 크기가 동일하도록 나누기 가능 / 무작위에 가깝게 선택 가능
- 이런 기법을 일관성 해싱이라 칭하기도 함
단점 :
- 범위 질의 효율성 ↓
- 정렬 순서 유지 x
ex)
- Riak, Couchbase, Voldmort (기본 키에 대한 범위 질의가 지원 X)
- MongoDB - 해시기반샤딩모드 : 범위 질의가 모든 파티션에 전송
- Cassandra : 해시값 + 범위 기준 파티셔닝 전략 타협안 사용 (복합 기본키 지정)
- 키의 첫 부분 해싱 : 파티션 지정
- 남은 칼럼 SS Table에서 데이터 정렬하는 연쇄된 색인으로 사용 (연쇄 색인을 통한 일대다 관계 표현 good)
- ex) (user_id, update_timestamp) : 특정 사용자가 특정 시간 구간에서 수정한 문서를 정렬하여 읽어오기 가능
쏠림 및 핫스팟 완화
앞서 설명한 것처럼 키 해싱을 통해 파티션 지정시, 핫스팟을 줄일 수 있지만, 완벽히 제거는 불가
- ex) 특정 key request 쏠림현상
현대 데이터 시스템은 쏠림 현상에 대한 자동 보정이 어렵다
따라서 대부분 어플리케이션 level 에서 완화
더보기
책에서 소개되는 어플리케이션 레벨에서의 쏠림 키 완화 방법
요청이 많은 키에 대해서는 key의 시작 or 끝에 임의의 숫자를 붙인다.
ex_ 임의의 10진수 두 개를 붙일 떄 : 키에 대한 쓰기 작업이 100개의 다른 키로 균등하게 분산, 그 키들은 다른 파티션으로 분산
but 트레이드오프로 다른 키에 쪼개서 쓰면 읽기 실행시, 추가적인 작업 필요
- 100 개 키에 해당하는 데이터를 읽어서 조합
- 추가적으로 저장해야할 메타데이터 발생
또한 쓰기 처리량이 낮은 키에 적용시, 불필요한 오버헤드가 발생. 따라서 어떤 키가 쪼개졌는지 trace 할 방법도 있어야함
728x90
반응형
'책 > 데이터중심 애플리케이션 설계' 카테고리의 다른 글
데이터중심 애플리케이션 설계 - 6장 [파티셔닝] 리뷰 - 3 (0) | 2022.10.22 |
---|---|
데이터중심 애플리케이션 설계 - 6장 [파티셔닝] 리뷰 - 2 (0) | 2022.10.21 |
데이터중심 애플리케이션 설계 - 4장 [부호화와 발전] 리뷰 (1) | 2022.09.25 |
데이터중심 애플리케이션 설계 - 3장 [저장소와 검색] 리뷰 - 3 : 트랜잭션 처리 / 분석 (0) | 2022.09.13 |
데이터중심 애플리케이션 설계 - 3장 [저장소와 검색] 리뷰 - 2 (0) | 2022.09.09 |