중급6분 분량

DynamoDB 파티션 키 작동 방식

귀하의 는 주소입니다. DynamoDB는 해당 키를 해시합니다. 해시는 항목을 저장할 물리적 시스템을 결정합니다. 열쇠를 잘 골라라 그리고 부하 분산; 잘못 선택하면 한 서버가 열을 받습니다.

DynamoDB 파티션 키는 어떻게 작동합니까?

DynamoDB는 내부 해시 함수를 통해 를 실행하며 해당 해시는 항목을 저장할 물리적 파티션을 결정합니다. 해시는 배치를 결정합니다. 키는 SQL 열처럼 정렬되거나 인덱싱되지 않습니다. 카디널리티가 높은 키를 선택하면 로드가 여러 파티션에 분산됩니다. 카디널리티가 낮은 파티션을 선택하면 단일 파티션이 모든 열을 흡수합니다.

  • 키는 정렬되지 않고 해시됩니다. DynamoDB는 다음을 통해 파티션 키를 실행합니다. 파티션을 선택하기 위한 내부 해시입니다. 두 개의 인접한 값이 각각 근처에 위치하지 않음 다른 하나는 디스크에 있습니다.
  • 파티션은 실제 저장 장치입니다. 각 파티션의 최대 용량은 약 10GB, 3,000입니다. 읽기 단위/초 및 1,000 쓰기 단위/초. 귀하의 트래픽은 다음과 같이 나뉩니다. 키를 분산시켜 분할합니다.
  • 바로가기 키는 기초입니다. 하나의 파티션 키 값으로 대부분의 요청을 전달합니다. 나머지 테이블이 유휴 상태인 동안 해당 파티션을 제한합니다.
  • 카디널리티가 높은 키가 승리합니다. 더 명확하고 균등하게 적중되는 키 값을 사용하면 더 많은 파티션이 부하를 흡수합니다.

키가 실제로 수행하는 작업부터 시작하세요.

SQL에서 기본 키는 JOIN 및 `ORDER로 정렬되고 인덱싱된 열입니다. BY' 켜짐. DynamoDB에서는 파티션 키(해시 키라고도 함)가 다음을 수행합니다. 뭔가 다른 것: _배치_를 결정합니다.

DynamoDB는 파티션 키를 내부 해시 함수에 공급합니다. 출력 맵 키스페이스에 할당되고 키스페이스는 범위로 분할됩니다. 각 범위는 물리적 파티션. 해당 파티션은 실제 노드의 실제 스토리지입니다.

따라서 파티션 키는 하나의 질문에 답합니다. _이 항목을 보관하는 시스템은 무엇입니까? , 있는 경우 해당 기계 내 내부 품목만 주문하세요. 그것은 재생 배치에 참여하지 않습니다.

해시를 통해 하나의 쓰기를 따릅니다.

장치 판독값을 수집하는 SaaS를 실행한다고 가정해 보겠습니다. 귀하의 테이블 SensorReadings에서는 파티션 키 deviceId 및 정렬 키 readingTs. 당신은 독서를 위해 글을 씁니다 deviceId = "vac-7741".

쓰기가 수행되는 경로 - 키에서 디스크가 있는 디스크까지:

키스페이스 슬라이스PutItemdeviceId = 'vac-7741'파티션 키를해시해시가 키스페이스의 점에 매핑어느 범위가소유하나?파티션 P2아이템 저장,readingTs

vac-7741에 대한 쓰기는 키스페이스의 한 지점으로 해시되며, 해당 지점은 P2의 범위 및 항목이 P2에 도착합니다. readingTs로 정렬됩니다.

내면화해야 할 것: "vac-7741""vac-7742"은 한 문자 떨어져 있습니다. 그러나 해시는 관련이 없습니다. 그들은 거의 확실히 다른 곳에 살고 있습니다 파티션. 파티션 키스페이스에는 "근처"가 없습니다.

이는 원래 설계에서 상속된 DynamoDB의 일관된 해싱 아이디어입니다. 2007년 Amazon Dynamo 논문("Dynamo: Amazon의 고가용성 키-값 Store")는 정확하게 해싱하여 노드 전체에 키를 분산시켜 단일 노드가 병목 현상.

해시가 파티션 키 값을 어떻게 분산시키는지 확인하려면 아래에 파티션 키 값 목록을 붙여넣으세요. 버킷. 카디널리티가 높은 세트는 고르게 퍼집니다. 하나의 값을 재사용하면 모두 쌓이게 됩니다. 하나의 버킷에 — 다음 섹션에서는 에 관한 것입니다.

파티션 키 분포

한 줄에 파티션 키 값 하나씩 입력하세요. 핫 키를 시뮬레이션하려면 값을 반복하세요.

버킷 8개키 8개
  • #0
    0
  • #1
    1
  • #2
    1
  • #3
    0
  • #4
    2
  • #5
    2
  • #6
    0
  • #7
    2

이것은 DynamoDB의 실제 내부 해시가 아니라 학습용으로 단순화한 해시입니다. DynamoDB는 문서화되지 않은 내부 함수와 테이블에 따라 증가하는 파티션 수를 사용합니다 — 서로 다른 키가 어떻게 분산되고 하나의 핫 키가 어떻게 쌓이는지에 대한 직관을 기르는 용도로만 사용하세요.

이는 직관 교육용 해시이지 DynamoDB의 실제 내부 해시는 아닙니다. 실제 함수, 키 공간 및 파티션 경계는 AWS 내부입니다. 그것을 사용하여 어떤 물리적 파티션이 키인지 예측하지 않고 확산과 왜곡에 대한 느낌을 구축합니다. 착륙합니다.

파티션의 하드 제한을 존중합니다.

물리적 분할은 유한합니다. AWS DynamoDB 개발자 안내서에 따라 각각 다음 정도까지 유지됩니다.

한도파티션별
저장~10GB
읽기 처리량3,000 읽기 단위/초
쓰기 처리량1,000 쓰기 단위/초

파티션이 10GB를 초과하거나 프로비저닝된 처리량에 더 많은 공간이 필요한 경우 DynamoDB 분할 — 키스페이스 범위가 분할되고 항목이 재배포됩니다. 더 많은 파티션에 걸쳐. 이는 자동입니다. 당신은 그것을 실행하지 않습니다.

분할은 정렬 키에서 하나의 파티션 키의 항목 컬렉션을 분할할 수 있습니다. 사용 중인 키의 로드가 더 많은 파티션으로 분산될 수 있습니다. 무슨 분열인가? 구출할 수 없는 것은 단일 핫 item, 계속 증가하는 정렬 키 또는 다음이 포함된 테이블입니다. LSI - 컬렉션을 하나의 파티션에 고정합니다.

트랩 이름 지정: 핫 파티션

핫 파티션은 고전적인 풋건입니다. 하나의 파티션 키가 있을 때 발생합니다. 가치(또는 그 중 작은 집합)가 트래픽의 불균형적인 점유율을 흡수합니다.

구체적인 실패: SensorReadings를 다음을 사용하여 파티션 키 region로 전환합니다. "us-east", "eu-west"와 같은 값. 3개의 지역은 3개의 핵심 가치를 의미합니다. 최대 3개의 파티션이 실제 작업을 수행합니다. 읽기와 함께 슬램 "us-east" 테이블의 총 프로비저닝된 용량이 사용되지 않는 동안 3,000RCU로 제한됩니다.

DynamoDB의 적응형 용량은 이를 완화하여 사용하지 않는 처리량을 이동할 수 있습니다. 사용량이 많은 파티션으로 이동하고 매우 자주 사용되는 단일 키를 자체 파티션에 격리합니다. 파티션. AWS는 re:Invent "Advanced Design Patterns for DynamoDB' 심층 분석 세션. 그러나 적응 능력은 면역이 아니라 시간을 벌어줍니다. 단일 핫 item, 계속 증가하는 정렬 키 또는 LSI는 여전히 한 번에 하나의 키를 제한합니다. 단일 파티션. 확산을 위한 디자인; 안전망에 기대지 마세요.

높은 카디널리티 키를 선택하세요

수정 사항은 카디널리티입니다. 즉, 고유한 키 값의 수와 얼마나 균등하게 교통 체증이 발생합니다.

  • 낮은 카디널리티(region, status, true/false): 파티션이 거의 없음, 교통량이 집중되면 일찍 속도를 조절합니다.
  • 높은 카디널리티(deviceId, userId, 주문 ID): 많은 값 해싱 여러 파티션에 걸쳐 로드가 분산되고 여유 공간이 늘어납니다.

SQL에서 status 열을 색인화하고 필터링할 수 있습니다. 로서 함정인 DynamoDB 파티션 키 — 확산될 수 없습니다. 낮은 카디널리티 유지 속성은 필터로 쓰거나 보조 인덱스의 정렬 키로 쓰되, 결코 배치를 결정하는 것이 아닙니다.

자연적으로 좋은 키가 여전히 왜곡된 경우 — 소수의 고래 세입자가 나머지 — 접미사를 추가하여 N개의 파티션에 걸쳐 하나의 논리값을 팬합니다. 예: 샤딩된 쓰기 경로의 경우 tenantId#3입니다. 읽기 시 다시 집계됩니다.

키가 분산된 후 파티션 내부 항목을 대상으로 지정하려면 다음을 작성합니다. 정렬 키에 KeyConditionExpression이 있습니다. 당신은 당신 자신에 대해 하나를 조립할 수 있습니다 DynamoDB expression builder의 스키마 코드에 연결하기 전에:

deviceId = "vac-7741" AND readingTs BETWEEN "2026-06-01" AND "2026-06-30"

이는 단일 파티션에서 한 장치의 6월 창을 읽습니다. Scan. 파티션 키는 머신을 고정합니다. 정렬 키 조건에 따라 행이 좁아집니다.

함정과 다음 단계

  • SQL에서 잘 읽히는 것으로 키를 선택하지 마십시오. _확산되는 것_으로 키를 선택하십시오. 카디널리티가 먼저이고 쿼리 편의성이 두 번째입니다.
  • 테이블의 총 용량이 키당 귀하의 것이라고 가정하지 마십시오. 처리량은 파티션별; 테이블이 유휴 상태로 보이는 동안 하나의 핫 값이 조절될 수 있습니다.
  • 분할에 맞서 싸우지 마세요. 자동이고 해시 중심입니다. 귀하의 임무는 분할을 제공하는 것입니다. 분산될 만큼 충분한 고유 키.

키가 깔끔하게 분산되면 다음 결정은 내부에 항목을 배치하는 방법입니다. 파티션 — single-table design 참조 — 그리고 secondary index는 두 번째 접근에 적합한 도구입니다. 패턴.

Download DynoTable를 입력하고 파티션 키에 대해 GROUP BY을 실행합니다. 항목이 핫 파티션으로 전환되기 전에 항목이 쌓이는 키를 확인하기 위한 SQL Workbench

업데이트됨