Gestione degli indici secondari globali in DynamoDB - Amazon DynamoDB

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Gestione degli indici secondari globali in DynamoDB

In questa sezione viene descritto come creare, modificare ed eliminare indici secondari globali in Amazon DynamoDB.

Creazione di una tabella con indici secondari globali

Per creare una tabella con uno o più indici secondari globali, utilizza l'operazione CreateTable con il parametro GlobalSecondaryIndexes. Per una massima flessibilità delle query, è possibile creare fino a 20 indici secondari globali (quota predefinita) per tabella.

Devi specificare un attributo che funga da chiave di partizione dell'indice. Facoltativamente, puoi specificare un altro attributo per la chiave di ordinamento dell'indice. Non è necessario che questi attributi di chiave coincidano con quelli della tabella. Ad esempio, nella GameScorestabella (vediUtilizzo degli indici secondari globali in DynamoDB), non ci sono TopScoreTopScoreDateTime gli attributi chiave. È possibile creare un indice secondario globale con una chiave di partizione TopScore e una chiave di ordinamento TopScoreDateTime. Puoi utilizzare questo indice per determinare se esiste una correlazione tra punteggi elevati e il periodo del giorno in cui si svolge un gioco.

Ogni attributo di chiave dell'indice deve essere uno scalare di tipo String, Number o Binary (non può essere un tipo documento o set). È possibile proiettare gli attributi di qualsiasi tipo di dati in un indice secondario globale. Questo include scalari, documenti e set. Per l'elenco completo dei tipi di dati, consulta Tipi di dati.

Se utilizzi la modalità assegnata, devi specificare le impostazioni ProvisionedThroughput per l'indice, consistenti di ReadCapacityUnits e WriteCapacityUnits. Queste impostazioni di throughput assegnato sono distinte da quelle della tabella, ma il funzionamento è analogo. Per ulteriori informazioni, consulta Considerazioni sulla velocità di trasmissione effettiva assegnata per indici secondari globali.

Gli indici secondari globali ereditano la modalità di capacità in lettura/scrittura dalla tabella di base. Per ulteriori informazioni, consulta Considerazioni sulla commutazione delle modalità di capacità in DynamoDB.

Nota

Le operazioni di backfill e le operazioni di scrittura in corso condividono la velocità effettiva di scrittura all'interno dell'indice secondario globale. Quando si crea una nuova chiave di partizioneGSI, può essere importante verificare se la chiave di partizione scelta produce una distribuzione irregolare o ristretta dei dati o del traffico tra i valori della chiave di partizione del nuovo indice. In questo caso, è possibile che si verifichino operazioni di backfill e scrittura contemporaneamente e limitando le scritture nella tabella di base. Il servizio adotta misure per ridurre al minimo il potenziale di questo scenario, ma non ha alcuna visione della forma dei dati dei clienti in relazione alla chiave di partizione dell'indice, alla proiezione scelta o alla scarsità della chiave primaria dell'indice.

Se si sospetta che il nuovo indice secondario globale possa avere dati limitati o disallineati o distribuzione del traffico tra i valori chiave delle partizioni, considerare quanto segue prima di aggiungere nuovi indici alle tabelle di importanza operativa.

  • Potrebbe essere più sicuro aggiungere l'indice in un momento in cui l’applicazione guida la quantità minima di traffico.

  • Valuta la possibilità di abilitare CloudWatch Contributor Insights sulla tabella di base e sugli indici. Questo ti darà informazioni preziose sulla distribuzione del traffico.

  • Per tabelle e indici di base in modalità capacità con provisioning, impostare la capacità di scrittura con provisioning del nuovo indice su almeno il doppio di quella della tabella di base. WatchWriteThrottleEvents, ThrottledRequestsOnlineIndexPercentageProgress, OnlineIndexConsumedWriteCapacity e OnlineIndexThrottleEvents CloudWatch metriche durante tutto il processo. Regola la capacità di scrittura fornita in base alle esigenze per completare il backfill in un tempo ragionevole senza effetti significativi di limitazione (della larghezza di banda della rete) sulle operazioni in corso.

  • Preparatevi ad annullare la creazione dell'indice se doveste subire un impatto operativo dovuto alla limitazione della velocità di scrittura. L'aumento della capacità di scrittura assegnata nel nuovo sistema GSI non risolve il problema.

Descrizione degli indici secondari globali su una tabella

Per visualizzare lo stato di tutti gli indici secondari globali su una tabella, utilizza l'operazione DescribeTable. La parte GlobalSecondaryIndexes della risposta mostra tutti gli indici della tabella insieme allo stato corrente di ciascuno (IndexStatus).

IndexStatus per un indice secondario globale sarà uno dei seguenti:

  • CREATING: l'indice è in fase di creazione e non è ancora disponibile per l'uso.

  • ACTIVE: l'indice è pronto per l'uso e le applicazioni possono eseguire operazioni Query sull'indice.

  • UPDATING: vengono modificate le impostazioni di velocità effettiva assegnata dell'indice.

  • DELETING: l'indice è attualmente in fase di eliminazione e non può essere più utilizzato.

Quando DynamoDB ha terminato la creazione di un indice secondario globale, lo stato dell'indice cambia da CREATING a ACTIVE.

Aggiunta di un indice secondario globale a una tabella esistente

Per aggiungere un indice secondario globale a una tabella esistente, utilizza l'operazione UpdateTable con il parametro GlobalSecondaryIndexUpdates. Devi specificare quanto segue:

  • Un nome per l'indice. Il nome deve essere univoco tra tutti gli indici della tabella.

  • Lo schema delle chiavi dell'indice. Devi specificare un attributo per la chiave di partizione dell'indice; opzionalmente, puoi specificare un altro attributo per la chiave di ordinamento dell'indice. Non è necessario che questi attributi di chiave coincidano con quelli della tabella. I tipi di dati per ogni attributo dello schema devono essere scalari: String, Number o Binary.

  • Gli attributi da proiettare dalla tabella all'indice:

    • KEYS_ONLY: ogni elemento dell'indice è costituito solo dalla chiave di partizione della tabella e dai valori della chiave di ordinamento, oltre ai valori della chiave di indice.

    • INCLUDE: oltre agli attributi descritti in KEYS_ONLY, l'indice secondario include gli altri attributi non chiave che sono stati specificati.

    • ALL: l'indice include tutti gli attributi della tabella di origine.

  • Le impostazioni di throughput assegnato dell'indice, consistenti di ReadCapacityUnits e WriteCapacityUnits. Queste impostazioni di throughput assegnato sono distinte da quelle della tabella.

È possibile creare un solo indice secondario globale per operazione UpdateTable.

Fasi della creazione di un indice

Quando si aggiunge un nuovo indice secondario locale a una tabella esistente, mentre l'indice viene creato la tabella continua a essere disponibile. Tuttavia, il nuovo indice non è disponibile per le operazioni Query finché il suo stato non cambia da CREATING ad ACTIVE.

Nota

La creazione di un indice secondario globale non utilizza Application Auto Scaling. L’aumento della capacità di MIN Application Auto Scaling non diminuisce il tempo di creazione dell'indice secondario globale.

Dietro le quinte, DynamoDB crea l'indice in due fasi:

Allocazione delle risorse

DynamoDB alloca le risorse di calcolo e archiviazione necessarie per la creazione dell'indice.

Durante la fase di allocazione delle risorse, l'attributo IndexStatus è CREATING e l'attributo Backfilling è false. Utilizza l'operazione DescribeTable per recuperare lo stato di una tabella e di tutti i suoi indici secondari.

Mentre l'indice si trova nella fase di allocazione delle risorse, non puoi eliminare l'indice o la sua tabella padre. Inoltre, non puoi modificare il throughput assegnato dell'indice o della tabella. Non puoi aggiungere o eliminare altri indici nella tabella. Tuttavia, puoi modificare il throughput assegnato di questi altri indici.

Compilazione

Per ogni elemento nella tabella, DynamoDB determina quale set di attributi scrivere sull'indice in base alla relativa proiezione (KEYS_ONLY, INCLUDE o ALL). Procede quindi a scrivere questi attributi nell'indice. Durante la fase di backfill, DynamoDB tiene traccia degli elementi che vengono aggiunti, eliminati o aggiornati nella tabella. Anche gli attributi di questi item vengono aggiunti, eliminati o aggiornati nell'indice secondo il caso.

Durante la fase di compilazione, l'attributo IndexStatus è impostato su CREATING e l'attributo Backfilling è true. Utilizza l'operazione DescribeTable per recuperare lo stato di una tabella e di tutti i suoi indici secondari.

Mentre l'indice è in fase di compilazione, non puoi eliminare la tabella padre. Tuttavia, puoi comunque eliminare l'indice o modificare il throughput assegnato della tabella e di qualsiasi suoi indici secondari globali.

Nota

Nella fase di compilazione, alcune scritture di item in violazione possono riuscire mentre altre vengono rifiutate. Dopo la compilazione, tutte le scritture negli elementi che violano lo schema delle chiavi del nuovo indice vengono rifiutate. È consigliabile eseguire lo strumento Rilevamento violazioni alla fine della fase di backfill per rilevare e risolvere le eventuali violazioni delle chiavi che possono essersi verificate. Per ulteriori informazioni, consulta Rilevamento e correzione delle violazioni delle chiavi di indice in DynamoDB.

Mentre le fasi di allocazione delle risorse e compilazione sono in corso, l'indice si trova nello stato CREATING. Durante questo periodo, DynamoDB esegue operazioni di lettura sulla tabella. Le operazioni di lettura dalla tabella di base per popolare l'indice secondario globale non vengono addebitate. Tuttavia, vengono addebitate le operazioni di scrittura per popolare l'indice secondario globale appena creato.

Quando la creazione è terminata, lo stato dell'indice diventa ACTIVE. Non puoi eseguire operazioni di Query o Scan dell'indice finché è ACTIVE.

Nota

In alcuni casi DynamoDB non è in grado di scrivere dati dalla tabella all'indice a causa di violazioni delle chiavi di indice. Ciò può verificarsi se:

  • Il tipo di dati di un valore di attributo non corrisponde al tipo di dati di un tipo di dati dello schema della chiave dell'indice.

  • La dimensione di un attributo supera la lunghezza massima di un attributo della chiave dell'indice.

  • Un attributo della chiave dell'indice ha un valore di attributo String vuoto o Binary vuoto.

Le violazioni delle chiavi dell'indice non interferiscono con la creazione di un indice secondario. Tuttavia, quando l'indice diventa ACTIVE, le chiavi in violazione non sono presenti nell'indice.

DynamoDB fornisce uno strumento autonomo per individuare e risolvere questi problemi. Per ulteriori informazioni, consulta Rilevamento e correzione delle violazioni delle chiavi di indice in DynamoDB.

Aggiunta di un indice secondario globale a una tabella di grandi dimensioni

Il tempo necessario per creare un indice secondario globale dipende da diversi fattori, tra cui:

  • Le dimensioni della tabella

  • Il numero di item nella tabella idonei per essere inclusi nell'indice

  • Il numero di attributi proiettati nell'indice

  • La capacità di scrittura assegnata dell'indice

  • L'attività di scrittura sulla tabella principale durante la creazione dell'indice

Se si aggiunge un indice secondario globale a una tabella molto grande, il processo di creazione potrebbe richiedere molto tempo. Per monitorare l'avanzamento e determinare se l'indice ha una capacità di scrittura sufficiente, consulta le seguenti CloudWatch metriche di Amazon:

  • OnlineIndexPercentageProgress

  • OnlineIndexConsumedWriteCapacity

  • OnlineIndexThrottleEvents

Per ulteriori informazioni sulle CloudWatch metriche relative a DynamoDB, vedere. Parametri di DynamoDB

Importante

Potrebbe essere necessario consentire l'inserimento di tabelle molto grandi prima di creare o aggiornare un indice secondario globale. Contatta il AWS servizio di assistenza per inserire i tuoi tavoli nella lista dei preferiti.

Se l'impostazione di throughput di scrittura assegnato all'indice è troppo bassa, la creazione dell'indice richiederà più tempo. Per abbreviare i tempi di creazione di un nuovo indice secondario globale è possibile incrementarne temporaneamente la capacità di scrittura assegnata.

Nota

In linea generale, è consigliabile impostare la capacità di scrittura assegnata all'indice su 1,5 volte la capacità di scrittura della tabella. Questa impostazione è valida per molti casi d'uso. I requisiti effettivi tuttavia possono essere maggiori o minori.

Durante il backfill di un indice, DynamoDB utilizza la capacità interna del sistema per leggere dalla tabella. Ciò ha lo scopo di ridurre al minimo l'impatto della creazione dell'indice e di assicurare che la tabella non esaurisca la capacità di lettura.

Tuttavia è possibile che il volume dell'attività di scrittura in entrata superi la capacità assegnata dell'indice. Questo è un caso di collo di bottiglia, in cui la creazione dell'indice richiede più tempo a causa del throttling dell'attività di scrittura nell'indice. Durante la creazione dell'indice, ti consigliamo di monitorare i CloudWatch parametri di Amazon per determinare se la capacità di scrittura consumata supera la capacità assegnata. In uno scenario di collo di bottiglia, devi aumentare la capacità di scrittura assegnata dell'indice per evitare il throttling della scrittura in fase di compilazione.

Dopo la creazione dell'indice, devi impostare la sua capacità di scrittura assegnata in modo da riflettere il normale utilizzo dell'applicazione.

Eliminazione di un indice secondario globale

Se l'indice secondario globale non è più necessario, è possibile eliminarlo utilizzando l'operazione UpdateTable.

È possibile eliminare un solo indice secondario globale per operazione UpdateTable.

Mentre l'indice secondario globale viene eliminato, non vi sono effetti sull'attività di lettura o scrittura nella tabella padre. Durante l'eliminazione è comunque possibile modificare il throughput assegnato di altri indici.

Nota
  • Quando elimini una tabella utilizzando l'operazione DeleteTable, vengono eliminati anche tutti gli indici secondari globali della tabella.

  • L'operazione di eliminazione dell'indice secondario globale non verrà addebitata sul tuo account.

Modifica di un indice secondario globale durante la creazione

Nel corso della creazione di un indice puoi utilizzare l'operazione DescribeTable per determinare in quale fase si trova. La descrizione dell'indice include un attributo booleano, Backfilling, che indica se DynamoDB sta attualmente caricando l'indice con elementi della tabella. Se Backfilling è true, la fase di allocazione delle risorse è terminata ed è in corso la compilazione dell'indice.

Mentre la compilazione è in corso, puoi aggiornare i parametri di throughput assegnato dell'indice. Questa scelta può essere determinata dalla volontà di accelerare la creazione. Puoi incrementare la capacità di scrittura dell'indice mentre viene creato, per ridurla successivamente. Per modificare le impostazioni di throughput assegnato dell'indice, utilizza l'operazione UpdateTable. Lo stato dell'indice cambia in UPDATING e Backfilling è true finché l'indice non è pronto per l'uso.

Durante la fase di compilazione, puoi eliminare l'indice in corso di creazione. Durante questa fase, non puoi aggiungere o eliminare altri indici nella tabella.

Nota

Per gli indici creati nell'ambito di un'operazione CreateTable, l'attributo Backfilling non compare nell'output di DescribeTable. Per ulteriori informazioni, consulta Fasi della creazione di un indice.