Be-Developer

데이터 중심 아키텍처 : 6.파티셔닝

06. 파티셔닝

  • 파티셔닝의 주된 목적은 확장성, 데이터 질의 부하가 분산될 수 있다.

    파티셔닝과 복제

  • 데이터는 한 파티션에 속하더라도, 여러 노드에 복제하여 내결함성을 보장한다.

    키-값 데이터 파티셔닝

  • 핫스팟 : 데이터 쏠림(skew)현상으로 불균형하게 부하가 높은 파티션.
  • 키-값 데이터모델을 사용하면, 키로 파티셔닝을 하여 병렬질의시 파티션을 찾아갈 수 있다.

    키 범위 기준 파티셔닝

  • 키 범위가 동일하면 오히려 쏠림현상이 있을수 있다.
  • 타임스탬프를 키로 가지는 범위 파티셔닝을 한다면, 과거 데이터를 저장한 데이터는 최신데이터를 쌓는 노드보다 놀고있을 수 있다.

    키의 해시값 기준 파티셔닝

  • 파티셔닝용 해시함수는 암호적으로 강력할 필요는 없다.
  • 파티션에 균일하게 분산하는데 좋아 일반적으로 사용되는 방법.
  • 일관성 해싱 : 중앙제어가 필요하지않도록 파티션 경계를 무작위로 선택하는것, DB에서는 잘 동작하지않아 거의 사용되지 않음.
  • 범위 질의가 모든 파티션에 전송되어야하므로 효율적이지 않다.
    • 카산드라는 복합 기본키를 사용하여 보완한다. : 키의 첫부분만 해싱하여 파티션분배, 다른컬럼은 데이터 정렬용 인덱스로 사용.
      • 첫번째 컬럼에 고정값을 지정하면, 다른컬럼에 대해서는 범위스캔을 효율적으로 할수있다.
      • ex) 특정 사용자가 시간구간동안 수정한 문서를 정렬하여 쿼리 (user_id : 고정, update_at : 정렬 인덱스)

        쏠린 작업부하와 핫스팟 완화

  • 애플리케이션에서 쏠림완화 : 쏠리는 키의 시작이나 끝에 임의 숫자 붙이기 -> 쿼리시 추가작업이 필요해진다.

    파티셔닝과 보조 색인

  • 보조색인 : 특정한 값이 발생한 항목을 검색하는 수단, 솔라나 ES 같은 검색서버의 존재이유

    문서기준 보조 색인 파티셔닝 local index

  • 각 파티션은 해당 파티션의 데이터 보조색인을 유지하며, 다른 파티션의 데이터는 관여하지않는다.
  • p.207 그림 6-4 참고
  • 질의는 모든 파티션에 보내져서 결과를 모아야한다. = scatter/gather

    용어기준 보조색인 파티셔닝 global index / term-partitioned

  • 모든 파티션의 데이터를 담당하는 전역 인덱스를 만들어서, 인덱스를 용어기준으로 파티셔닝한다.
  • p.207 그림 6-5 참고
  • 질의는 용어기준으로 인덱스가 있는 파티션에만 요청하면된다.
  • 쓰기요청을 할때 다른 파티션에 있는 인덱스까지 업데이트되어야하므로 느리고 복잡해질 수 있다. 보통 비동기로 인덱스 갱신을 한다.

    파티션 재균형화 rebalancing

  • 노드가 추가되거나, 제외되어야할때 일어날 수 있다.

    재균형화 전략

    쓰면 안되는 방법 : 해시값에 모든 N연산을 실행

  • hash % N(partition size) = partiton Number
  • N이 바뀌면 대부분의 키가 노드사이에 옮겨져야해서 리밸런싱 비용이 지나치게 커진다.

    파티션 갯수 고정

  • 노드 10대에 파티션을 처음부터 1000개로 쪼개서 저장하면, 노드가 추가되어도 파티션은 이동하면된다.
  • 데이터 전송이 진행중인 동안에 읽기나 쓰기가 실행되면 기존에 할당된 파티션을 사용하면된다.
  • 고정파티션을 사용하는 DB는 파티션 분할을 지원하지 않는 경우가 많다.

    동적 파티셔닝

  • 키범위 파티셔닝을 사용하면, 파티션 경계와 갯수가 고정되어있는경우 쏠림현상이 있을 수 있는데 일부 DB는 파티션을 동적으로 만들어준다.
  • 파티션 분할, 병합, 파티션 크기가 데이터셋 크기에 비례한다.
  • Hbase (HDFS), 리싱크 DB
  • 비어있는 DB면 파티션 경계가 없을 수 있으므로, Hbase와 몽고DB는 사전분할을 해둔다.

    노드 비례 파티셔닝

  • 노드당 할당되는 파티션 갯수를 고정, 노드 대수를 늘리면 파티션의 크기가 작아지므로, 노드가 많을수록 파티션 크기가 안정적으로 유지된다.
  • 새 노드가 추가되면 랜덤 파티션을 분할하여 절반을 새노드에 할당한다. 평균적으로는 균등한 부하를 할당받게된다.
  • 파티션 경계 랜덤 선택을 위해서는, 해시기반 범위 파티셔닝을 해야한다.

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

  • 완전 자동 처리보다 느릴수는 있지만, 모니터링과 장애방지를 위해서 사람이 개입하는게 좋다.

    요청라우팅

    1. 노드에 요청 -> 노드가 해당 파티션을 알려줌
    • 카산드라 : gossip protocol을 사용하여 1번 방식으로
      1. 라우팅 계층에 요청 -> 파티션이 있는 노드를 알려줌.
    • mongoDB - mongos : 변경사항을 주키퍼에서 인지하고, 별도의 라우팅계층에서 주키퍼 정보를 기반으로 라우팅.
      1. 클라이언트가 직접 요청.

병렬 질의실행