파티셔닝 하는 방법, 리밸런싱 전략, 요청 라우팅 전략을 알려줄게
데이터셋이 매우 크거나 질의 처리량이 높다면 데이터를 파티션으로 쪼갤 필요가 있다. 파티션으로 쪼개는 작업을 샤딩이라고 부른다.
※ 파티션 = 샤드 (몽고DB, ES, 솔라클라우드) = 리전 (HBase) = 태블릿 (빅테이블) = 브이노드 (카산드라, 브이악) = 브이버켓(카우치베이스)
파티션의 단위: 데이터 단위 (레코드, 문서, 로우)
파티션 장점: 확장성 -> 각 파티션에서 독립적인 질의 처리가 가능하므로 질의 처리량을 늘릴 수 있다.
어떤 파티션에 어떤 데이터를 넣을 것인가? (파티셔닝 하는 방법)
파티션의 목적은 데이터와 질의 부하를 노드에 고르게 분산시키는 것이다. 데이터를 고르게 분산시킬 수 있도록 기준을 잡아야 한다.
키-값 데이터라고 가정한다.
용어정리
파티션 분배가 고르게 이뤄지지 않아 데이터나 질의 처리가 다른 파티션보다 많은 파티션이 있으면 쏠렸다(skewed) 라고 한다.
불균형하게 부하가 높은 파티션을 핫스팟(hotspot) 이라고 한다.
1.키 값 기준 파티셔닝
한 파티션에 키의 연속된 범위를 할당하는 방법. ex. 1~12 키는 1번 파티션에
장점
각 파티션 내에서는 키를 정렬해서 저장할 수 있다. -> 범위 스캔이 쉬움
단점
키 범위 설정 잘못하면 핫스팟 유발함 ex. 키가 timestamp 1일치라면 하루에 들어오는 모든 데이터는 한 파티션이 담당하고 다른 파티션은 모두 유휴상태가 됨
사용처
몽고DB 2.4버전 이하, HBase, RethinkDB, 빅테이블
2.키 해시값 기준 파티셔닝
키를 인풋으로 해서 해시함수를 통해 해시값을 구하고 파티션에는 키 값 대신 해시값의 연속된 범위를 할당하고 그 해시값안에 속하는 키의 데이터를 파티션에 할당하는 방법
장점
해시값을 사용하면 균일하게 분산되기 때문에 많은 데이터스토어에서 사용하는 파티셔닝 방법이다.
단점
키 기준 파티셔닝을 했던 키 범의 질의를 효율적으로 할 수 없게 된다. 해시값 기준이라 키가 이리저리 흩어지기 때문이다.
한 키로 대용량 작업 쏠릴 때 핫스팟 완화하는 법
ex. 인스타에서 사용자가 하나의 키고, 어떤 유명인이 뭐가 한다면 한 key로만 작업 부하가 엄청나게 쏠릴 수 있다.
현 데이터 시스템은 이를 해결하지 못해 앺단에서 처리해줘야 한다.
가장 간단한 방법은 key_1, key_2 처럼 키에 임의의 숫자를 붙여 다른 해시값의 파티션으로 분산시켜주는 방법이다.
다른 키로 쪼개서 쓰면 읽기할 때 추가 작업이 필요하기 때문에 소수의 키에서만 적용하는게 좋다.
보조 색인 파티셔닝
※ 보조 색인: 레코드 식별 용도가 아닌 특정 값을 검색하는 수단
파티셔닝은 키 값 기준 뿐 아니라 보조 색인 기준으로도 파티셔닝할 수 있다. (문서 기반, 용어 기반)
1.문서 기준 보조 색인 (=지역 색인)
해당 파티션에 있는 문서들로만 색인을 구성한다. 그래서 color:red 를 검색하면 나오는 결과 문서(191, 306)들도 다 같은 파티션안에 있다.
특징
각 파티션이 완전히 독립적으로 동작(그래서 지역 색인)하기 때문에 color:red 인 문서를 검색하려면 모든 파티션을 방문하고 조건에 맞는 문서만 찾아 모으는 스캐터/게더(scatter/gather) 방식을 사용한다.
단점
그래서 질의가 느리다.
사용처
ElasticSearch, 몽고DB 등
2.용어 기준 보조 색인 (=전역 색인)
용어 기준이기 때문에 문서 기준 처럼 색인에 있는 문서가 항상 같은 파티션에 있는 건 아니다.
장점
질의가 빠르다. 용어가 있는 파티션으로만 요청 보내면 되니까.
단점
쓰기가 느리고 복잡하다. 용어 하나하나 찾아서 써야 하고 문서에 있는 용어가 다른 노드의 파티션에 속할 수 있기 때문이다.
샤드 리밸런싱(파티션 재균형화)
장비 스펙업하거나, 노드 장애나서 다른 노드로 옮겨야할 때 파티션을 옮기는 과정을 재균형화라고 한다.
노드 수 기준으로 나눠 키를 파티션에 할당하는 모드 N 연산은 쓰면 안됨!
노드 개수 N 이 바뀔 때마다 대부분의 키가 노드를 옮겨갈 것이기 때문에 비용이 크기 때문
파티션 재균형화 전략
① 파티션 개수는 생성 시 설정할 수 있고 고정적이며 후에 변경할 수 없다.
- 엘라스틱서치
② 동적 파티셔닝: 데이터 용량에 따라 파티션 수를 동적으로 조절한다.
- HBase, RethinkDB
③ 노드 수에 비례하게 파티션 수 를 조절한다. (노드 당 할당되는 파티션 수를 고정한다.)
- 카산드라, Ketama
클라의 요청을 여러 개 노드에 라우팅하는 방법
① 클라가 아무 노드에 일단 요청한다. 원하는 값이 있으면 반환하고 없으면 노드가 다른 노드에 요청을 전달해서 응답 받고 클라에게 전달한다.
② 클라는 라우팅 계층으로 요청보내고, 값이 있는 노드를 찾아 요청 보내는 건 라우팅 계층이 해준다. 라우팅 계층은 요청 처리 하지않는 로드밸런서일 뿐이다.
- zookeeper, 몽고DB(mongos 데몬을 라우팅 계층으로 사용)
③ 클라가 직접 노드에게 요청을 보낸다.
레퍼런스
데이터 중심 애플리케이션 설계
'SearchDeveloper > 데이터 중심 애플리케이션 설계' 카테고리의 다른 글
[8] 분산 시스템의 골칫거리 3가지 (0) | 2023.08.06 |
---|---|
[7] 트랜잭션 (0) | 2023.07.22 |
[5] 복제를 구성하는 방법과 동기화를 위한 노력 (0) | 2023.06.25 |
[4] 데이터를 다른 시스템에 전송하기 위한 부호화 (인코딩) 와 호환성 (0) | 2023.06.15 |
[3] DB가 데이터를 어떻게 저장하고, 질의하면 데이터를 어떻게 찾을까? (1) | 2023.05.31 |