상세 컨텐츠

본문 제목

Chapter 6. Partitioning(파티셔닝)

Log.Develop/DDIA

by bluayer 2022. 6. 10. 10:22

본문

소개

본 글은 데이터 중심 어플리케이션(마틴 클레프만)으로 스터디하며 해당 책의 내용을 요약 정리한 내용입니다.

https://github.com/ddia-study/ddia-study

 

GitHub - ddia-study/ddia-study: 데이터 중심 어플리케이션 설계

데이터 중심 어플리케이션 설계. Contribute to ddia-study/ddia-study development by creating an account on GitHub.

github.com

 

서론

데이터셋이 매우 크거나 질의 처리량이 매우 높다면 복제만으로는 부족하고 데이터를 파티션을 쪼갤 필요가 있다.

이 작업을 샤딩이라고도 한다.

데이터 파티셔닝을 원하는 주된 이유는 확장성이다.

 

파티셔닝과 복제

보통 복제와 파티셔닝을 함께 적용해 각 파티션의 복사본을 여러 노드에 저장한다.

각 레코드는 정확히 한 파티션에 속하더라도 이를 여러 다른 노드에 저장해서 내결함성을 보장할 수 있다.

 

key-value 데이터 파티셔닝

파티셔닝의 목적은 데이터와 질의 부하를 노드 사이에 고르게 분산시키는 것이다.

파티셔닝이 고르게 이뤄지지 않아 다른 파티션보다 데이터가 많거나 질의를 많이 받는 파티션이 있다면 *쏠렸다(skewed)고 말한다.

불균형하게 부하가 높은 파티션을 핫스팟이라고 한다.

레코드를 어떻게 할당하는 것이 좋을까?

  • 랜덤 파티셔닝 : 데이터는 고르게 분배되지만, 모든 노드에 병렬 질의를 해야 한다.
  • 키 범위 기준 파티셔닝 : 범위 스캔이 유용하지만, 타임스탬프가 키라면 핫스팟을 유발할 수 있다.
  • 키 해시값 기준 파티셔닝 : 쏠림, 핫스팟을 방지할 수 있지만, 범위 질의를 효율적으로 실행할 수 없다.

 

관련 내용

키 범위 기준 예시로, 센서 데이터베이스 이야기가 나왔다.

센서 데이터베이스에서 이문제를 회피하려면 키의 첫 번째 요소로 타임스탬프가 아닌 다른 것을 사용해야 한다.

실제로 IoT 분야에서 비슷한 방법으로 데이터를 운용하곤 한다.

 

파티셔닝과 보조 색인

보조 색인은 보통 레코드를 유일하게 식별하는 용도가 아니라 특정한 값이 발생한 항목을 검색하는 수단이다.

사용자 123이 실행한 액션을 모두 찾거나 hogwash라는 단어를 포함하는 글을 모두 찾거나 빨간색 자동차를 모두 찾는 등의 작업에 쓰인다.

  • 문서 기준 : Document ID 기준으로 파티셔닝 하고, scatter/gather 형식으로 질의. 쓰기가 효율적.
  • 용어 기준 : 모든 파티션의 데이터를 담당하는 전역 색인이 파티셔닝 되어 있음. 읽기가 효율적, 원하는 용어 포함 파티션으로만 요청을 보내면 됨.

 

파티션 재균형화

시간이 지나면 DB에 변화가 생긴다.

  • CPU 추가 원한다!
  • Disk, Ram 추가 원한다!
  • 장비에 장애가 발생해서 다른 장비가 그 역할을 받아야 한다!

클러스터에서 한 노드가 담당하던 부하를 다른 노드로 옮기는 과정을 rebalancing이라고 한다.

재균형화 전략

  • 해시값에 모드 N 연산을 실행(쓰면 안 된다!) : 대부분의 키가 노드를 옮겨야 할 수 있다. 비용이 지나치게 크다.
  • 파티션 개수 고정 : 처음부터 파티션을 더 많이 만든다. 새 노드가 추가되면 파티션이 분배될 때까지 기존 노드에서 파티션을 뻇어온다. 파티션은 노드 사이에서 통째로 이동하기만 하면 된다. 단, 변동이 심해 수를 정하기 어려운 환경이라면 해당 방법을 채택하기 어렵다.
  • 동적 파티셔닝 : 파티션 크기가 설정 값을 넘으면 파티션을 두 개로 쪼개 각각에 원래 파티션의 절반 정도의 데이터가 포함되게 한다. 반대로 합쳐질 수도 있다. 빈 데이터베이스는 파티션 경계를 어디로 정해야 하는지 사전 정보가 없으므로, 시작할 때는 파티션이 하나라는 함정이 있다. 따라서 pre-splitting을 지원하기도 한다.
  • 노드 비례 파티셔닝 : 노드당 할당하는 파티션 개수를 고정한다. 새 노드가 추가되면 고정 개수의 파티션을 무작위 선택해 분할하고 각 분할된 파티션의 절반은 그대로 두고 절반은 새 노드에 할당한다.

 

운영 : 자동 재균형화와 수동 재균형화

재균형화는 자동으로 실행될까, 수동으로 실행될까?

적절히 조합해보는 방법도 있다.

 

요청 라우팅

클라이언트에서 요청을 보내려고 할 때 어느 노드로 접속해야 하는지 어떻게 알 수 있을까?

"foo 키를 읽거나 쓰려면 어떤 IP 주소와 포트 번호로 접속해야 할까?"

이 문제는 DB에 국한되지 않은 Service Discovery의 일종이다.

  • 클라이언트가 Round-Robin LB를 통해 접속하게 한다.
  • 모든 요청을 라우팅 계층으로 먼저 보내고, 라우팅 계층에서는 노드를 알아내 요청을 전달한다.
  • 클라이언트가 파티셔닝 방법과 파티션이 어떤 노드에 할당됐는지를 알고 있게 한다.

Gosship Protocol : https://medium.com/@heonjang.lee96/gossip-%ED%94%84%EB%A1%9C%ED%86%A0%EC%BD%9C%EC%9D%B4%EB%9E%80-906500c3de4b

 

Gossip 프로토콜이란?

소문과 전염병의 공통점은 뭘까?

medium.com

 

병렬 질의 실행

대규모 병렬 처리(massively parallel processing, MPP)는 훨씬 복잡한 질의를 지원한다.

MPP Query Optimizer는 복잡한 질의를 여러 실행 단계와 파티션으로 분해하며 이들 중 다수는 데이터베이스 클러스터 내의 서로 다른 노드에서 병렬적으로 실행될 수 있다.

(참고로 10장에서도 나온다)

관련글 더보기

댓글 영역