DynamoDB에서 글로벌 보조 인덱스 관리 - Amazon DynamoDB

DynamoDB에서 글로벌 보조 인덱스 관리

이 단원에서는 Amazon DynamoDB에서 글로벌 보조 인덱스를 생성, 수정 및 삭제하는 방법을 설명합니다.

글로벌 보조 인덱스가 있는 테이블 생성

하나 이상의 글로벌 보조 인덱스를 사용하는 테이블을 생성하려면 CreateTable 작업에 GlobalSecondaryIndexes 파라미터를 추가하면 됩니다. 쿼리 유연성을 극대화하도록 테이블당 최대 20개의 글로벌 보조 인덱스(기본 할당량)를 생성할 수 있습니다.

보조 파티션 키의 역할을 할 속성 한 가지를 지정해야 합니다. 선택 사항으로 인덱스 정렬 키에 또 하나의 속성을 지정할 수 있습니다. 그렇다고 두 가지 키 속성 중 하나가 테이블의 키 속성과 반드시 같을 필요는 없습니다. 예를 들어 GameScores 테이블(DynamoDB에서 글로벌 보조 인덱스 사용 참조)에서는 TopScoreTopScoreDateTime 둘 다 키 속성이 아닙니다. 파티션 키가 TopScore이고 정렬 키가 TopScoreDateTime인 글로벌 보조 인덱스를 생성할 수 있습니다. 이러한 인덱스는 최고 점수와 경기 시간 사이의 상관관계 여부를 판단할 때 사용됩니다.

각 인덱스 키 속성은 String, Number 또는 Binary 형식의 스칼라여야 합니다. (문서 또는 집합일 수 없습니다.) 모든 데이터 형식의 속성을 글로벌 보조 인덱스로 프로젝션할 수 있습니다. 여기에는 스칼라, 문서, 집합이 포함됩니다. 데이터 형식에 대한 전체 목록은 데이터 타입 단원을 참조하세요.

프로비저닝된 모드를 사용할 경우 인덱스의 ProvisionedThroughput 설정값은 ReadCapacityUnitsWriteCapacityUnits로 구성하여 입력해야 합니다. 여기에서 프로비저닝 처리량 설정 값은 테이블의 설정 값과 다르지만 동작 방식은 비슷합니다. 자세한 내용은 글로벌 보조 인덱스에 대한 프로비저닝된 처리량 고려 사항 단원을 참조하십시오.

글로벌 보조 인덱스는 기본 테이블에서 읽기/쓰기 용량 모드를 상속합니다. 자세한 내용은 DynamoDB에서 용량 모드 전환 시 고려 사항 단원을 참조하십시오.

참고

채우기 작업과 진행 중인 쓰기 작업은 글로벌 보조 인덱스 내의 쓰기 처리량을 공유합니다. 새 GSI를 생성할 때 파티션 키를 선택하면 새 인덱스의 파티션 키 값에서 균일하지 않거나 좁은 데이터 또는 트래픽 분산이 생성되는지 확인하는 것이 중요할 수 있습니다. 이 경우 채우기 및 쓰기 작업이 동시에 발생하고 쓰기가 기본 테이블로 제한될 수 있습니다. 이 서비스는 이 시나리오의 잠재력을 최소화하는 조치를 취하지만 인덱스 파티션 키, 선택한 프로젝션 또는 인덱스 기본 키의 희소성과 관련하여 고객 데이터의 형태를 파악하지 못합니다.

새 글로벌 보조 인덱스에서 파티션 키 값의 데이터 또는 분포가 좁거나 왜곡되어 있다고 의심되는 경우 운영상 중요한 테이블에 새 인덱스를 추가하기 전에 다음을 고려하세요.

  • 애플리케이션에서 최소 양의 트래픽을 유도하고 있을 때 인덱스를 추가하는 것이 가장 안전할 수 있습니다.

  • 기본 테이블 및 인덱스에서 CloudWatch Contributor Insights를 활성화하는 것이 좋습니다. 이렇게 하면 트래픽 분포에 대한 중요한 정보를 얻을 수 있습니다.

  • 프로비저닝된 용량 모드 기본 테이블 및 인덱스의 경우 새 인덱스의 프로비저닝된 쓰기 용량을 기본 테이블의 두 배 이상으로 설정합니다. 프로세스 전체에 WriteThrottleEvents, ThrottledRequests, OnlineIndexPercentageProgress, OnlineIndexConsumedWriteCapacityOnlineIndexThrottleEvents CloudWatch 지표를 감시합니다. 진행 중인 작업을 크게 제한하지 않고 채우기를 적절한 시간에 완료하려면 프로비저닝된 쓰기 용량을 필요에 따라 조정합니다.

  • 쓰기 제한으로 인해 작업에 영향을 받고 새 GSI에서 프로비저닝된 쓰기 용량을 늘려도 문제가 해결되지 않는 경우 인덱스 생성을 취소할 수 있어야 합니다.

테이블의 글로벌 보조 인덱스 설명

테이블에 속한 모든 글로벌 보조 인덱스의 상태를 확인하려면 DescribeTable 작업을 사용합니다. 응답에서 GlobalSecondaryIndexes 부분은 현재 각 인덱스 상태(IndexStatus)와 함께 테이블에 속한 모든 인덱스를 나타냅니다.

글로벌 보조 인덱스의 IndexStatus는 다음 중 하나입니다.

  • CREATING - 현재 인덱스를 생성 중이며, 아직 사용할 수 없습니다.

  • ACTIVE - 현재 인덱스가 사용 대기 상태이며, 애플리케이션이 인덱스에 대한 Query 작업을 실행할 수 있습니다.

  • UPDATING - 인덱스의 프로비저닝된 처리량 설정을 변경 중입니다.

  • DELETING - 현재 인덱스를 삭제하고 있으며 더 이상 사용할 수 없습니다.

DynamoDB가 글로벌 보조 인덱스 빌드를 마치면 인덱스 상태는 CREATING에서 ACTIVE로 바뀝니다.

기존 테이블에 글로벌 보조 인덱스 추가

글로벌 보조 인덱스를 기존 테이블에 추가하려면 UpdateTable 작업에 GlobalSecondaryIndexUpdates 파라미터를 사용합니다. 이때 입력해야 하는 정보는 다음과 같습니다.

  • 인덱스 이름. 인덱스 이름은 모든 테이블 인덱스 중에서 식별할 수 있도록 고유해야 합니다.

  • 인덱스의 키 스키마. 인덱스 파티션 키로 한 가지 속성을 반드시 지정해야 하며, 인덱스 정렬 키는 옵션으로 다른 속성을 지정할 수 있습니다. 그렇다고 두 가지 키 속성 중 하나가 테이블의 키 속성과 반드시 같을 필요는 없습니다. 각 스키마 속성의 데이터 형식은 스칼라(String, Number 또는 Binary)가 되어야 합니다.

  • 테이블에서 인덱스로 가져올 속성:

    • KEYS_ONLY - 인덱스의 각 항목은 테이블 파티션 키 및 정렬 키 값, 그리고 인덱스 키 값으로만 구성됩니다.

    • INCLUDE - KEYS_ONLY에서 설명한 속성 외에도 지정하는 키가 아닌 다른 속성이 보조 인덱스에 포함됩니다.

    • ALL - 인덱스에 소스 테이블의 모든 속성이 포함됩니다.

  • 인덱스의 할당 처리량 설정 값(ReadCapacityUnits와 WriteCapacityUnits로 구성). 이러한 프로비저닝된 처리량 설정은 테이블의 설정과 별개입니다.

UpdateTable 작업당 글로벌 보조 인덱스를 1개만 생성할 수 있습니다.

인덱스 생성 단계

새로운 글로벌 보조 인덱스를 기존 테이블에 추가하는 경우 인덱스 빌드 중에도 테이블을 계속 사용할 수 있습니다. 하지만 쿼리 작업 중에는 상태가 CREATING에서 ACTIVE로 바뀔 때까지 새로운 인덱스를 사용할 수 없습니다.

참고

글로벌 보조 인덱스 생성에는 Application Auto Scaling이 사용되지 않습니다. MIN Application Auto Scaling 용량을 늘려도 글로벌 보조 인덱스의 생성 시간이 단축되지는 않습니다.

내부적으로 DynamoDB는 다음 두 단계로 인덱스를 빌드합니다.

리소스 할당

DynamoDB가 인덱스 빌드에 필요한 컴퓨팅 및 스토리지 리소스를 할당합니다.

리소스 할당 단계에서는 IndexStatus 속성이 CREATING이고, Backfilling 속성이 false입니다. DescribeTable 작업으로 테이블과 테이블에 속한 모든 보조 인덱스의 상태를 가져옵니다.

인덱스가 리소스 할당 단계에 있는 동안에는 인덱스를 삭제하거나 상위 테이블을 삭제할 수 없습니다. 또한 인덱스 또는 테이블의 프로비저닝된 처리량을 수정할 수 없습니다. 테이블에 다른 인덱스를 추가하거나 삭제할 수 없습니다. 그러나 이와 같은 다른 인덱스의 프로비저닝된 처리양을 수정할 수는 있습니다.

채우기 작업(Backfilling)

테이블의 각 항목에 대해 DynamoDB는 프로젝션(KEYS_ONLY, INCLUDE 또는 ALL)에 따라 인덱스에 쓸 속성 집합을 결정합니다. 그런 다음 결정된 속성을 인덱스에 기록합니다. DynamoDB가 채우기(backfill) 단계에 들어서면 테이블에서 추가, 삭제 또는 업데이트되는 항목을 추적합니다. 그리고, 이러한 항목들의 속성이 인덱스에서도 추가, 삭제 또는 업데이트됩니다.

채우기 단계에서는 IndexStatus 속성이 CREATING으로 설정되어 있고 Backfilling 속성은 true입니다. DescribeTable 작업으로 테이블과 테이블에 속한 모든 보조 인덱스의 상태를 가져옵니다.

인덱스 채우기 중에는 상위 테이블을 삭제할 수 없습니다. 단, 인덱스를 삭제하거나 테이블과 테이블에 속한 글로벌 보조 인덱스의 프로비저닝된 처리량을 변경하는 것은 가능합니다.

참고

채우기 단계에서 불일치 항목이 있을 경우 쓰기 작업이 성공하는 경우도 있고 거부될 수도 있습니다. 채우기 단계가 끝나면 새 인덱스의 키 스키마를 위반하는 모든 항목에 대한 쓰기 작업은 거부됩니다. 따라서 채우기 단계 이후에는 위반 감지기 도구를 실행하여 발생했을 수도 있는 키 위반을 찾아내 해결하는 것이 좋습니다. 자세한 내용은 DynamoDB에서 인덱스 키 위반 검색 및 수정 단원을 참조하십시오.

리소스 할당 및 채우기 단계가 진행 중일 때 인덱스는 CREATING 상태입니다. 이 단계에서 DynamoDB는 테이블에서 읽기 작업을 수행합니다. 글로벌 보조 인덱스를 채우기 위한 기본 테이블의 읽기 작업에는 요금이 부과되지 않습니다. 그러나 새로 생성된 글로벌 보조 인덱스를 채우기 위한 쓰기 작업에는 요금이 청구됩니다.

인덱스 빌드를 마치면 상태가 ACTIVE로 바뀝니다. 인덱스가 ACTIVE 상태가 되기 전에는 Query 또는 Scan 작업을 할 수 없습니다.

참고

경우에 따라 인덱스 키 위반으로 인해 DynamoDB가 테이블의 데이터를 인덱스에 쓰지 못할 수도 있습니다. 이러한 상황은 다음과 같은 경우에 발생할 수 있습니다.

  • 속성 값의 데이터 형식이 인덱스 키 스키마 데이터 형식의 데이터 형식과 일치하지 않습니다.

  • 속성 크기가 인덱스 키 속성의 최대 길이를 초과합니다.

  • 인덱스 키 속성에 빈 문자열 또는 빈 이진 속성 값이 있습니다.

인덱스 키 위반이 발생해도 글로벌 보조 인덱스 생성은 방해를 받지 않습니다. 그러나 인덱스가 ACTIVE 상태가 되면 인덱스에는 위반 키가 존재하지 않습니다.

DynamoDB는 이러한 문제를 찾아 해결하기 위한 독립형 도구를 제공합니다. 자세한 내용은 DynamoDB에서 인덱스 키 위반 검색 및 수정 단원을 참조하십시오.

큰 테이블에 글로벌 보조 인덱스 추가

글로벌 보조 인덱스 빌드에 소요되는 시간은 다음과 같은 몇 가지 요인에 따라 달라집니다.

  • 테이블 크기

  • 인덱스에 추가할 수 있는 테이블 항목 수

  • 인덱스로 가져올 속성 수

  • 인덱스에 할당된 쓰기 용량

  • 인덱스 빌드 중 메인 테이블에 대한 쓰기 작업

아주 큰 테이블에 글로벌 보조 인덱스를 추가할 때는 생성 프로세스가 완료되는 데 오래 걸릴 수 있습니다. 이때 진행 상황을 모니터링하여 인덱스의 쓰기 용량이 충분한지 확인하려면 다음 Amazon CloudWatch 지표를 참조하세요.

  • OnlineIndexPercentageProgress

  • OnlineIndexConsumedWriteCapacity

  • OnlineIndexThrottleEvents

DynamoDB와 관련된 CloudWatch 지표에 대한 자세한 내용은 DynamoDB 지표 단원을 참조하세요.

중요

글로벌 보조 인덱스를 생성하거나 업데이트하기 전에 먼저 매우 큰 테이블 허용 목록이 필요할 수 있습니다. 테이블 허용 목록을 추가하려면 AWS 지원 팀에 문의하시기 바랍니다.

인덱스에 프로비저닝된 쓰기 처리량 설정 값이 낮을 수록 인덱스 빌드에 걸리는 시간이 길어집니다. 따라서 새로운 글로벌 보조 인덱스의 빌드 시간을 단축하려면 프로비저닝된 쓰기 용량을 일시적으로 높여야 합니다.

참고

일반적으로 인덱스에 할당된 쓰기 용량은 테이블에 할당된 쓰기 용량에 비해 1.5배로 높여 설정하는 것이 좋습니다. 이는 많은 사용 사례에 유용하지만, 실제 요건은 더 높거나 낮을 수도 있습니다.

인덱스 채움 단계에서는 DynamoDB가 내부 시스템 용량을 사용하여 테이블에서 읽어옵니다. 이는 인덱스 생성에 미치는 영향을 최소화하는 동시에 테이블의 읽기 용량이 고갈되는 것을 방지하기 위해서입니다.

하지만 수신되는 쓰기 작업 볼륨이 인덱스에 할당된 쓰기 용량을 초과할 수는 있습니다. 이는 인덱스에 대한 쓰기 작업이 몰려들면서 인덱스 생성 시간이 늘어나는 병목 현상 시나리오입니다. 따라서 인덱스 빌드 중에는 인덱스의 Amazon CloudWatch 지표를 모니터링하면서 소비되는 쓰기 용량이 프로비저닝된 용량을 초과하지 않는지 살펴보는 것이 바람직합니다. 병목 현상 시나리오에서는 인덱스에 할당된 쓰기 용량을 늘려서 채움 단계에서 쓰기 작업이 몰리는 것을 방지해야 합니다.

인덱스 생성을 마치면 정상적인 애플리케이션 사용량을 반영하여 할당된 쓰기 용량을 설정해야 합니다.

글로벌 보조 인덱스 삭제

글로벌 보조 인덱스가 더 이상 필요하지 않으면 UpdateTable 작업으로 삭제할 수 있습니다.

UpdateTable 작업당 글로벌 보조 인덱스를 하나만 삭제할 수 있습니다.

글로벌 보조 인덱스 삭제 중에도 상위 테이블의 읽기 또는 쓰기 작업에 미치는 영향은 전혀 없습니다. 삭제가 진행되는 동안에도 다른 인덱스의 할당 처리량은 변경 가능합니다.

참고
  • DeleteTable 작업을 사용하여 테이블을 삭제할 때는 해당 테이블의 글로벌 보조 인덱스가 모두 삭제됩니다.

  • 글로벌 보조 인덱스의 삭제 작업에 대해서는 계정에 요금이 부과되지 않습니다.

생성 중 글로벌 보조 인덱스 수정

인덱스 빌드 중에도 DescribeTable 작업을 사용하여 현재 진행 중인 단계를 확인할 수 있습니다. 인덱스의 설명에 포함되는 부울 속성인 Backfilling은 DynamoDB가 현재 테이블의 항목과 함께 인덱스를 로드하고 있는지 여부를 나타냅니다. Backfilling이 true이면 리소스 할당 단계가 끝나고 인덱스 채움 단계가 시작된 것을 의미합니다.

채움 단계가 진행 중일 때는 인덱스의 할당 처리량 파라미터를 업데이트할 수 있습니다. 이러한 파라미터 업데이트의 목적은 인덱스의 빌드 속도를 높이는 데 있습니다. 즉, 인덱스 빌드 중 인덱스의 쓰기 용량을 늘렸다가 빌드가 완료되면 용량을 줄입니다. 인덱스의 할당 처리량 설정 값을 변경하려면 UpdateTable 작업을 사용합니다. 그러면 인덱스 상태가 UPDATING으로 바뀌고, Backfilling은 인덱스를 사용할 준비가 될 때까지 true를 유지합니다.

채우기 단계 중에는 생성되고 있는 인덱스를 삭제할 수 있습니다. 이 단계에서는 테이블에(서) 다른 인덱스를 추가하거나 삭제할 수 없습니다.

참고

인덱스가 CreateTable 작업의 일환으로 생성된 경우에는 Backfilling 속성이 DescribeTable 출력에 표시되지 않습니다. 자세한 내용은 인덱스 생성 단계 단원을 참조하십시오.