책너두 (데이터 중심 애플리케이션 설계) 17일차 (~208p)

요약

  • 파티셔닝에 대한 내용을 알게됨.
    • 데이터를 파티셔닝 한다 (=샤딩)
    • 확장성 때문에 파티셔닝함.
  • 파티셔닝과 복제에 대한 내용을 이해하게 됨.
    • 한 노드에 여러 파티션이 있을 수 있음.
    • 파티션도 5장에서 말한 복제와 같은 방식으로 복제됨.
  • 키-값 기준 데이터 파티셔닝을 이해하게 됨.
    • 데이터와 질의 부하를 노드 사이에 고르게 분산시키기 위해 파티션을 잘 나눠야 함.
      • 키 범위 기준 파티셔닝
      • 키의 해시값 기준 파티셔닝
      • 쏠린 작업부하와 핫스팟 완화
        • 애플리케이션 처리가 필요
  • 파티셔닝과 보조 색인에 대한 내용을 이해하게 됨.
    • 보조 색인은 모델링에 매우 유용함.
    • 보조 색인이 포함된 데이터베이스를 파티셔닝 하는 방법이 있음.
      • 문서 기주

메모

6장. 파티셔닝

  • 데이터셋이 매우 크거나 질의 처리량이 매우 높다면 복제만으로 부족함
    • 데이터를 파티션으로 쪼갤 필요가 있다.
    • 이 작업을 샤딩이라고도 함.
  • 파티셔닝은 대용량 데이터베이스를 의도적으로 작은 단위로 쪼개는 방법을 뜻함.
    • 노드 사이의 네트워크애서 발생하는 결함의 일종인 네트워크 분단, 네트워크 분리와 무관함
    • 각 파티션은 그 자체로 작은 데이터베이스가 된다.
  • 데이터 파티셔닝 이유는 확장성이다.
    • 비공유 클러스터에서 다른 파티션은 다른 노드에 저장될 수 있음.
      • 따라서, 대용량 데이터셋이 여러 디스크에 분산될 수 있고, 질의 부하는 여러 프로세서에 분산될 수 있음.

파티셔닝과 복제

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

  • 한 노드에 여러 파티션을 저장할 수도 있음.
    • 리더 팔로워 복제 모델을 사용하면 파티셔닝과 복제본이 위와 같은 그림의 형태가 됨.
    • 각 파티션의 리더는 하나의 노드에 할당되고, 팔로워들은 다른 노드에 할당됨.
  • 5장에서 설명한 데이터베이스 복제에 관한 모든 내용은 파티션의 복제에도 동일하게 적용됨.

키-값 데이터 파티셔닝

  • 파티셔닝의 목적은 데이터와 질의 부하를 노드 사이에 고르게 분산시키는 것임.
    • 모든 노드가 동일한 분량을 담당한다고 가정할 때, 10대의 노드를 사용하면, 한 대를 사용할 때보다 이론상으로 10배의 데이터를 저장하고, 10배의 읽기, 쓰기 요청을 처리할 수 있음. (복제는 일단 무시)
  • 파티셔닝이 고르게 이뤄지지 않아, 한 쪽 파티션에 데이터가 많거나, 질의를 많이 받는 파티션이 있다면 쏠렸다(skewed)고 말함.
    • 쏠림이 있으면 파티셔닝 효과가 매우 떨어짐.
    • 불균형하게 부하가 높은 파티션을 핫스팟이라고 함.
      • 핫스팟을 회피하는 가장 단순한 방법은 레코드를 할당할 노드를 무작위로 선택하는 것임.
        • 이는 데이터가 노드들 사이에 고르게 분산되지만 큰 단점이 있음.
          • 어떤 레코드를 읽으려고할 때 해당 레코드가 어느 노드에 저장됐는지 알 수 없으므로 모든 노드에서 병렬적으로 질의를 실행해야 함.
      • 더 좋은 방법으로 키-값 데이터 모델을 사용한다.
        • 항상 기본키를 통해 레코드에 접근한다.

키 범위 기준 파티셔닝

  • 파티셔닝 방법 중 하나로, 종이 백과사전처럼 각 파티션에 연속된 범위의 키를 할당하는 것임.
    • 각 범위들의 경계 사이를 알면, 어떤 키가 어느 파티션에 속하는지 쉽게 찾을 수 있음.
    • 또, 어떤 파티션이 어떤 노드에 할당됐는지 알면 적절한 노드로 요청을 직접 보낼 수 있음.
    • 키 범위가 반드시 동일할 필요는 없음.
      • 데이터가 고르게 분포하지 않을 수도 있기 때문임.
      • 데이터를 고르게 분산시키려면 파티션 경계를 데이터에 맞춰 조정해야 함.
  • 각 파티션 내에서는 키를 정렬된 순서로 저장할 수 있음.
    • 범위 스캔이 쉬워지고, 키를 연쇄된 색인으로 간주해서 질의 하나로 관련 레코드 여러 개를 읽어오는 데 사용할 수 있음.
  • 키 범위 기준 파티셔닝은 특정 접근 패턴이 핫스팟을 유발하는 단점이 있음.
    • ex) 타임스탬프 키라면, 파티션은 시간 범위에 대응됨.
      • 즉, 1일치의 데이터를 파티션 하나가 담당한다면, 그 날짜에 해당되는 파티션만 과부하가 걸리고, 나머지 파티션은 유휴 상태로 남아 있게됨.
      • 이 문제를 해결하려면, 키의 첫번째 요소로 타임스탬프가 아닌 다른 것을 사용해야 함.

키의 해시값 기준 파티셔닝

  • 쏠림과 핫스팟 위험때문에 많은 분산 데이터스토어는 키의 파티션을 정하는 데 해시 함수를 사용함.
  • 좋은 해시 함수는 쏠린 데이터를 입력으로 받아서 균일하게 분산되게 함.
  • 파티셔닝용 해시 함수는 암호적으로 강력할 필요는 없음.

  • 키에 적합한 해시 함수를 구했다면, 각 파티션에 해시값 범위를 할당하고, 해시값이 파티션의 범위에 속하는 모든 키를 그 파티션에 할당하면 됨.
    • 이 기법은 키를 파티션 사이에 균일하게 분산시키는데 좋음.
    • 파티션 경계는 크기가 동일하도록 나눌 수도 있고, 무작위로 선택할 수도 있음.
      • 이 기법을 일관성 해싱이라고 부르기도 함.
    • 하지만, 파티셔닝에 키의 해시값을 사용하면 범위 질의를 효율적으로 실행할 수 없다.
      • 인접했던 키들이 이제 모든 파티션에 흩어져서 정렬 순서가 유지되지 않기 때문임.
  • 카산드라는 두 가지 파티셔닝 전략 사이에서 타협함.
    • 카산드라에서 테이블 선언 시, 여러 칼럼을 포함하는 복합 기본키를 지정할 수 있음.
    • 키의 첫 부분만 해싱을 적용하여 파티션 결정에 사용하고, 남은 칼럼은 카산드라의 SS테이블에서 데이터를 정렬하는 연쇄 색인으로 사용함.

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

  • 키를 해싱해서 파티션을 정하면 핫스팟을 줄이는 데 도움이 됨.
    • 하지만 핫스팟을 완벽히 제거할 수는 없음.
      • ex) 동일한 키를 읽고 쓰는 극단적인 상황은 모든 요청이 동일한 파티션에 쏠림.
  • 현대 데이터 시스템은 대부분 크게 쏠린 작업부하를 자동으로 보정하지 못함.
    • 애플리케이션에서 쏠림을 완화해야 함.
    • ex) 요청이 매우 많이 쏠리는 키의 시작이나 끝에 임의의 숫자를 붙인다.
      • 대신, 읽기를 실행할 때 추가적인 작업이 필요해짐.
      • 이 기법은 요청이 몰리는 소수의 키에만 적용하는게 타당함.

파티셔닝과 보조 색인

  • 보조 색인은 레코드를 유일하게 식별하는 용도가 아니고 특정 값이 발생한 항목을 검색하는 수단임.
  • 보조 색인은 관계형 데이터베이스의 핵심 요소이며, 문서 데이터베이스에서도 흔함.
  • 키-값 저장소에서는 구현 복잡도가 추가되는 것을 피하기 위해 보조 색인을 지원하지 않음.
    • 하지만, 보조 색인은 데이터 모델링에 매우 유용하므로 일부 저장소에서는 이를 추가하기 시작함.
    • 보조 색인은 솔라나 엘라스틱서치 같은 검색 서버에게는 존재의 이유임.
  • 보조 색인은 파티션에 깔끔하게 대응되지 않는 문제점이 있음.
  • 보조 색인이 있는 데이터베이스를 파티셔닝하는 방법은 두 가지임.
    • 문서 기반 파티셔닝
    • 용어 기반 파티셔닝

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

  • 문서 ID(document ID)라고 부르는 고유 ID가 있고, 데이터베이스를 문서 ID 기준으로 파티셔닝 한다.
    • ex) ID 0~499 = 파티션 0 / ID 500~999 = 파티션 1 
  • 검색 필터링을 위해서는 보조 색인이 필요함.
    • 색인을 선언하면, 자동으로 데이터베이스가 색인을 생성한다.
    • 이때, 데이터베이스 파티션은 자동으로 색인을 문서에 추가함.
      • 이 방식을 사용하면 각 파티션이 완전히 독립적으로 동작한다.
      • 다른 파티션에 어떤 데이터가 저장되는지 신경쓰지 않음.
      • 따라서, 문서 파티셔닝 색인은 지역 색인(local index) 이라고도 함.
  • 문서 기준 파티셔닝 색인은 읽을 때 주의 해야 함.
    • 내가 특정 기준으로 찾고자하는 데이터가 반드시 하나의 파티션에 있다는 보장이 없음
    • 내가 찾고자 하는 데이터를 완전히 다 조회하고 싶다면, 모든 파티션으로 질의를 보내서 결과를 모두 모아야 함.
      • 파티셔닝된 데이터베이스에 이런 식으로 질의를 보내는 방법을 스캐터/개더(scatter/gather)라고 함.
        • 보조 색인을 써서 읽는 질의는 큰 비용이 들 수 있음.

용어 기준 보조 색인 파티셔닝

  • 각 파티션이 자신만의 보조 색인을 갖게 하는 대신, 모든 파티션의 데이터를 담당하는 전역 색인을 만들 수도 있음.
    • 하지만, 한 노드에만 색인을 저장할 수는 없음.
    • 해당 노드가 병목이 되어 파티셔닝의 목적을 해칠 수 있기 때문.
    • 즉, 전역 색인도 파티셔닝해야 하지만, 기본키 색인과는 다른식으로 할 수 있음.
  • ex) 빨간 자동차를 찾고 싶다면 해당 색인인 color:red 에서, 색깔 색인이 a~r 까지 파티션 0 / s~z 까지 파티션1에 저장됨.
    • 이런 식으로 색인을 용어 기준으로 파티셔닝됐다(term-partitioned)라고 함.
  • 색인을 용어 자체로 쓸 수도 있고, 용어의 해시값을 사용할 수도 있음.
    • 용어 자체로 파티셔닝하면 범위 스캔에 유용함.
    • 용어 해시값을 사용해 파티셔닝하면 부하가 좀 더 고르게 분산됨.
  • 문서 파티셔닝 색인에 비해 전역 색인이 갖는 이점은 읽기가 효율적임.
    • 클라이언트가 모든 파티션에 스캐터/개더를 실행할 필요 없음.
    • 원하는 용어를 포함하는 파티션으로만 요청하면 됨.
      • 하지만, 전역 색인은 쓰기가 느리고 복잡함.
  • 색인은 항상 최신 상태여야 하고, 데이터베이스에 기록된 모든 문서는 바로 색인에 반영돼야 함.
    • 용어 파티션 색인은 쓰기에 영향받는 모든 파티션에 걸친 분산 트랜잭션을 실행해야 함.
    • 현실에서 전역 보조 색인은 대개 비동기로 갱신됨.

댓글

Designed by JB FACTORY