본문 바로가기

SearchDeveloper/데이터 중심 애플리케이션 설계

[6] 파티셔닝 하는 방법, 리밸런싱 전략, 요청 라우팅 전략

파티셔닝 하는 방법, 리밸런싱 전략, 요청 라우팅 전략을 알려줄게

데이터셋이 매우 크거나 질의 처리량이 높다면 데이터를 파티션으로 쪼갤 필요가 있다. 파티션으로 쪼개는 작업을 샤딩이라고 부른다.

※ 파티션 = 샤드 (몽고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.문서 기준 보조 색인 (=지역 색인)

문서ID 0~49는 0번 파티션에, 50~99는 1번 파티션에 할당하는 방식

해당 파티션에 있는 문서들로만 색인을 구성한다. 그래서 color:red 를 검색하면 나오는 결과 문서(191, 306)들도 다 같은 파티션안에 있다.

특징

각 파티션이 완전히 독립적으로 동작(그래서 지역 색인)하기 때문에 color:red 인 문서를 검색하려면 모든 파티션을 방문하고 조건에 맞는 문서만 찾아 모으는 스캐터/게더(scatter/gather) 방식을 사용한다.

단점

그래서 질의가 느리다.

사용처

ElasticSearch, 몽고DB 등

2.용어 기준 보조 색인 (=전역 색인)

용어 단위로 파티션 되어 있다. ex. color 가 a~s면 0번 파티션에, t~z면 1번 파티션에 넣음

용어 기준이기 때문에 문서 기준 처럼 색인에 있는 문서가 항상 같은 파티션에 있는 건 아니다.

장점

질의가 빠르다. 용어가 있는 파티션으로만 요청 보내면 되니까.

단점

쓰기가 느리고 복잡하다. 용어 하나하나 찾아서 써야 하고 문서에 있는 용어가 다른 노드의 파티션에 속할 수 있기 때문이다.

샤드 리밸런싱(파티션 재균형화)

장비 스펙업하거나, 노드 장애나서 다른 노드로 옮겨야할 때 파티션을 옮기는 과정을 재균형화라고 한다.

노드 수 기준으로 나눠 키를 파티션에 할당하는 모드 N 연산은 쓰면 안됨!

노드 개수 N 이 바뀔 때마다 대부분의 키가 노드를 옮겨갈 것이기 때문에 비용이 크기 때문

파티션 재균형화 전략

① 파티션 개수는 생성 시 설정할 수 있고 고정적이며 후에 변경할 수 없다.

  • 엘라스틱서치

② 동적 파티셔닝: 데이터 용량에 따라 파티션 수를 동적으로 조절한다.

  • HBase, RethinkDB

③ 노드 수에 비례하게 파티션 수 를 조절한다. (노드 당 할당되는 파티션 수를 고정한다.)

  • 카산드라, Ketama

클라의 요청을 여러 개 노드에 라우팅하는 방법

① 클라가 아무 노드에 일단 요청한다. 원하는 값이 있으면 반환하고 없으면 노드가 다른 노드에 요청을 전달해서 응답 받고 클라에게 전달한다.

② 클라는 라우팅 계층으로 요청보내고, 값이 있는 노드를 찾아 요청 보내는 건 라우팅 계층이 해준다. 라우팅 계층은 요청 처리 하지않는 로드밸런서일 뿐이다.

  • zookeeper, 몽고DB(mongos 데몬을 라우팅 계층으로 사용)

③ 클라가 직접 노드에게 요청을 보낸다.

 

레퍼런스

데이터 중심 애플리케이션 설계