Back to writing

데이터 중심 애플리케이션 설계 - 파티셔닝

데이터 중심 애플리케이션 설계 - 파티셔닝
  • 데이터셋이 매우 크거나 질의 처리량이 높다면 복제만으로는 부족하고 데이터를 파티션으로 쪼갤 필요가 있다. 이 작업을 샤딩이라고도 한다.
  • 파티셔닝을 원한느 주된 이유는 확장성이다. 비공유 클러스터에서 다른 파티션을 다른 노드에 저장될 수 있다.
  • 각 노드에서 자신의 파티션에 해당하는 질의를 독립적으로 실행할 수 있으므로 노드를 추가함으로써 질의 처리량을 늘릴 수 있다.
  • 크고 복잡한 질의는 훨씬 더 어렵긴 하지만 여러 노드에서 병렬 실행이 가능하다.

파티셔닝과 복제

보통 복제와 파티셔닝을 함께 적용해 각 파티션의 복사복은 여러 노드에 저장한다. 각 레코드는 정확히 한 파티션에 속하더라도 이를 여러 다른 노드에 저장해서 내결함성을 보장할 수 있다는 의미다.

key-value partitioning

대량의 데이터를 파티셔닝할 경우 어떤 레코드를 어느 노드에 저장해야할까?

  • 파티셔닝의 목적은 데이터와 질의 부하를 노드 사이에 고르게 분산시키는 것이다.
  • 불균형하게 부하가 높은 파티션(핫스팟)을 회피하는 가장 단순한 방법은 레코드를 할당할 노드를 무작위로 선택하는 것이다.
  • 하지만 이렇게 하면 특정 파티션에 속하는 레코드를 찾기 위해 모든 노드를 검색해야 한다.
  • 단순한 키-값 데이터 모델을 사용한다고 하면 항상 기본키를 통해 레코드에 접근한다.

key-range partitioning

  • 파티셔닝을 하는 방법중 하나는 각 파티션에 연속된 범위의 키를 할당하는 것이다.
  • 키 범위 기준 파티셔닝은 특정한 접근 패턴이 핫스팟을 유발하는 단점이 있다.

hash-based partitioning

  • 쏠림과 핫스팟의 위험 때문에 많은 분산 데이터스토어는 키의 파티션을 정하는 데 해시 함수를 사용한다.
  • 좋은 해시 함수는 쏠린 데이터를 입력으로 받아 균일하게 분산되게 한다.
  • 파티셔닝에 키의 해시값을 사용하면 키 범위 파티셔닝의 좋은 속성인 범위 질의를 효율적으로 실행할 수 있는 능력을 잃는다.
  • 카산드라는 두 가지 파티셔닝 전략 사이에서 타협한다. 카산드라에서 테이블을 선언할 때 여러 칼럼을 포함하는 복합 기본키를 지정할 수 있다.
  • 키의 첫 부분에만 해싱을 적용해 파티션 결정에 사용하고 남은 컬럼은 카산드라의 SSTable에서 데이터를 정렬하는 연쇄된 색인으로 사용한다.
  • 연쇄된 색인을 사용하면 일대다 관계를 표현하는 우아한 데이터 모델을 만들 수 있다.

Mitigating Skewed Workloads and Hot Spots

  • 동일한 키를 읽고 쓰는 극단적인 상황이 전혀 없지는 않다.
  • 현대 데이터 시스템은 대부분 크게 쏠린 워크로드를 자동으로 처리할 수 없으므로 애플리케이션이 이를 처리해야 한다.
  • 예를 들어, 요청이 매우 많이 쏠리는 키를 발견했을 때 간단한 해결책은 각 키에 시작이나 끝에 임의의 숫자를 붙여서 여러 키로 분산시키는 것이다.
  • 그러나 이렇게 하면 애플리케이션이 여러 키를 검색해야 하므로 복잡성이 증가한다.

Partitioning and Secondary Indexes