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

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

글로벌 보조 인덱스 관리

이 단원에서는 Amazon DynamoDB 에서 글로벌 보조 인덱스를 생성, 변경 및 삭제하는 방법에 대해 살펴봅니다.

글로벌 보조 인덱스를 사용하는 테이블 생성

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

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

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

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

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

테이블에 있는 글로벌 보조 인덱스에 대한 설명

테이블에 속한 모든 글로벌 보조 인덱스의 상태를 확인하려면 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작업을 사용합니다.

인덱스 생성 단계

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

DynamoDB 는 다음 두 단계로 인덱스를 생성합니다.

리소스 할당

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

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

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

채우기 작업(Backfilling)

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

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

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

참고

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

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

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

참고

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

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

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

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

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

DynamoDB 는 이러한 문제를 찾아 해결할 수 있도록 한 가지 도구를 별도로 제공합니다. 자세한 내용은 인덱스 키 위반 검색 및 수정 단원을 참조하세요.

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

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

  • 테이블 크기

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

  • 인덱스로 가져올 속성 수

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

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

글로벌 보조 인덱스를 매우 큰 테이블에 추가하는 경우 생성 프로세스 시간이 오래 걸릴 수 있습니다. 이때 진행 상황을 모니터링하여 인덱스의 쓰기 용량이 충분한지 확인하려면 다음 Amazon CloudWatch 메트릭을 참고하십시오.

  • OnlineIndexPercentageProgress

  • OnlineIndexConsumedWriteCapacity

  • OnlineIndexThrottleEvents

참고

DynamoDB 와 관련된 CloudWatch 지표에 대한 자세한 내용은 단원을 참조하세요.DynamoDB 메트릭를 선택합니다.

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

참고

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

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

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

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

글로벌 보조 인덱스 삭제

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

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

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

참고

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

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

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

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

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

참고

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