Gestion des index secondaires globaux - Amazon DynamoDB

Gestion des index secondaires globaux

Cette section décrit comment créer, modifier et supprimer des index secondaires globaux dans Amazon DynamoDB.

Création d'une table avec des index secondaires globaux

Pour créer une table avec un ou plusieurs index secondaires globaux, utilisez l'opération CreateTable avec le paramètre GlobalSecondaryIndexes. Pour bénéficier d'une flexibilité de requête maximum, vous pouvez créer jusqu'à 20 index secondaires globaux (quota par défaut) par table.

Vous devez spécifier un attribut faisant office de clé de partition d'index. Vous pouvez éventuellement spécifier un autre attribut pour la clé de tri d'index. Il n'est pas nécessaire que l'un de ces attributs de clé soit identique à un attribut de clé dans la table. Par exemple, dans la table GameScores (voir Utilisation d'index secondaires globaux dans DynamoDB), ni TopScore ni TopScoreDateTime ne sont des attributs de clé. Vous pouvez créer un index secondaire global avec une clé de partition TopScore et une clé de tri TopScoreDateTime. Vous pouvez utiliser un tel index pour déterminer s'il existe une corrélation entre les scores d'une partie et l'heure de la journée à laquelle celle-ci est jouée.

Chaque attribut de clé d'index doit être un scalaire de type String, Number ou Binary (il ne peut pas être de type document ou ensemble). Vous pouvez projeter des attributs de tout type de données dans un index secondaire global. Celui-ci inclut des scalaires, des documents et des ensembles. Pour obtenir la liste complète des types de données, consultez Les types de données.

Si vous utilisez le mode approvisionné, vous devez fournir les paramètres ProvisionedThroughput pour l'index, à savoir ReadCapacityUnits et WriteCapacityUnits. Ces paramètres de débit approvisionné sont distincts de ceux de la table, mais se comportent de la même manière. Pour plus d'informations, consultez Considérations sur le débit provisionné pour les index secondaires globaux.

Les index secondaires globaux héritent du mode de capacité en lecture/écriture de la table de base. Pour plus d'informations, consultez Considérations relatives à la modification du mode de capacité de lecture ou d'écriture.

Note

Les opérations de remplissage et les opérations d'écriture en cours partagent le débit d'écriture au sein de l'index secondaire global. Lors de la création d'un nouvel index secondaire global, il peut être important de vérifier si la clé de partition de votre choix produit une distribution inégale ou réduite des données ou du trafic entre les valeurs des clés de partition du nouvel index. Si cela se produit, vous pourriez voir des opérations de remplissage et d'écriture se produire en même temps et limiter les écritures dans la table de base. Le service prend des mesures pour minimiser l'éventualité de ce scénario, mais il n'a aucune idée de la forme des données client par rapport à la clé de partition d'index, à la projection choisie ou à la rareté de la clé primaire d'index.

Si vous pensez que votre nouvel index secondaire global peut présenter des données ou une distribution de trafic étroites ou asymétriques entre les valeurs des clés de partition, tenez compte des points suivants avant d'ajouter de nouveaux index à des tables importantes sur le plan opérationnel.

  • Il peut être plus sûr d'ajouter l'index au moment où votre application génère le moins de trafic.

  • Envisagez d'activer CloudWatch Contributor Insights sur votre table de base et vos index. Cela vous procurera des informations précieuses sur la distribution de votre trafic.

  • Pour les tables de base et les index du mode capacité allouée, définissez la capacité d'écriture allouée de votre nouvel index sur au moins le double de celle de votre table de base. Surveillez les métriques CloudWatch WriteThrottleEvents, ThrottledRequests, OnlineIndexPercentageProgress, OnlineIndexConsumedWriteCapacity et OnlineIndexThrottleEvents tout au long du processus. Ajustez la capacité d'écriture allouée au besoin pour achever le remplissage dans un délai raisonnable sans aucun effet de limitation significatif sur vos opérations en cours.

  • Préparez-vous à annuler la création d'index si vous rencontrez un impact opérationnel dû à la limitation de l'écriture, et si l'augmentation de la capacité d'écriture allouée dans votre nouvel index secondaire global ne résout pas ce problème.

Description des index secondaires globaux sur une table

Pour afficher l'état de tous les index secondaires globaux sur une table, utilisez l'opération DescribeTable. La portion GlobalSecondaryIndexes de la réponse affiche tous les index sur la table, ainsi que l'état actuel de chacun d'eux (IndexStatus).

L'état IndexStatus d'un index secondaire global peut être l'un des suivants :

  • CREATING – L'index est en cours de création et n'est pas encore disponible pour utilisation.

  • ACTIVE – L'index est prêt pour utilisation et les applications peuvent effectuer des opérations Query dessus.

  • UPDATING – Les paramètres de débit approvisionné de l'index sont en cours de modification.

  • DELETING – L'index est actuellement en cours de suppression et ne peut plus être utilisé.

Quand DynamoDB a fini de générer un index secondaire global, l'état de celui-ci passe de CREATING à ACTIVE.

Ajout d'un index secondaire global à une table existante

Pour ajouter un index secondaire global à une table existante, utilisez l'opération UpdateTable avec le paramètre GlobalSecondaryIndexUpdates. Vous devez fournir les informations suivantes :

  • Un nom d'index. Le nom doit être unique parmi tous les index sur cette table.

  • Le schéma de clé de l'index. Vous devez spécifier un attribut pour la clé de partition d'index. Vous pouvez éventuellement spécifier un autre attribut pour la clé de tri d'index. Il n'est pas nécessaire que l'un de ces attributs de clé soit identique à un attribut de clé dans la table. Les types de données pour chaque attribut de schéma doivent être scalaires : String, Number ou Binary.

  • Attributs à projeter à partir de la table dans l'index :

    • KEYS_ONLY – Chaque élément de l'index se compose uniquement des valeurs de clé de partition et de tri de la table, ainsi que des valeurs de clé d'index.

    • INCLUDE – En plus des attributs décrits dans KEYS_ONLY, l'index secondaire inclut des attributs autres que de clé que vous spécifiez.

    • ALL – L'index inclut tous les attributs de la table source.

  • Les paramètres de débit approvisionné pour l'index, à savoir ReadCapacityUnits et WriteCapacityUnits. Ces paramètres de débit approvisionné sont distincts de ceux de la table.

Vous ne pouvez créer qu'un seul index secondaire global par opération UpdateTable.

Phases de création d'index

Lorsque vous ajoutez un nouvel index secondaire global à une table existante, la table reste disponible pendant la création de l'index. Toutefois, le nouvel index n'est pas disponible pour les opérations Query tant que son état n'est pas passé de CREATING à ACTIVE.

Note

La création d'un index secondaire global n'utilise pas la scalabilité automatique des applications. L'augmentation de la capacité de scalabilité automatique des applications MIN ne réduit pas le temps de création de l'index secondaire global.

En coulisses, DynamoDB génère l'index en deux phases :

Allocation de ressources

DynamoDB alloue les ressources de calcul et de stockage nécessaires à la génération de l'index.

Au cours de la phase d'allocation des ressources, l'attribut IndexStatus est CREATING, et l'attribut Backfilling a la valeur false. Utilisez l'opération DescribeTable pour récupérer l'état d'une table et de tous ses index secondaires.

Pendant que l'index est en phase d'allocation de ressources, vous ne pouvez pas supprimer l'index ou sa table parent. Vous ne pouvez pas non plus modifier le débit approvisionné de l'index ou de la table. Vous ne pouvez pas ajouter ou supprimer d'autres index sur la table. En revanche, vous pouvez modifier le débit approvisionné de ces autres index.

Remplissage

Pour chaque élément de la table, DynamoDB détermine l'ensemble d'attributs à écrire dans l'index en fonction de sa projection (KEYS_ONLY, INCLUDE ou ALL). Il écrit ensuite ces attributs dans l'index. Durant la phase de remplissage, DynamoDB suit les éléments ajoutés, supprimés ou mis à jour dans la table. Les attributs de ces éléments sont également ajoutés, supprimés ou mis à jour dans l'index, selon le cas.

Au cours de la phase de remplissage, l'attribut IndexStatus est défini sur CREATING, et l'attribut Backfilling a la valeur true. Utilisez l'opération DescribeTable pour récupérer l'état d'une table et de tous ses index secondaires.

Pendant le remplissage de l'index, vous ne pouvez pas supprimer sa table parent. Vous pouvez cependant toujours supprimer l'index ou modifier le débit approvisionné de la table et de n'importe lequel de ses index secondaires globaux.

Note

Pendant la phase de remplissage, certaines écritures d'éléments violant le schéma de clé peuvent aboutir tandis que d'autres sont rejetées. Après le remplissage, toutes les écritures dans les éléments, qui violent le schéma de clé du nouvel index sont rejetées. Nous vous recommandons d'exécuter l'outil de détection des violations une fois la phase de remplissage terminée afin de détecter et résoudre d'éventuelles violations de clé. Pour plus d'informations, consultez Détection et correction des violations de clé d'index.

Pendant les phases d'allocation de ressources et de remplissage, l'index est dans l'état CREATING. Pendant ce temps, DynamoDB effectue des opérations de lecture sur la table. Vous n'êtes pas facturé pour les opérations de lecture de la table de base destinées au remplissage de l'index secondaire global. En revanche, vous êtes facturé pour les opérations d'écriture destinées au remplissage de l'index secondaire global nouvellement créé.

Une fois la génération de l'index terminée, l'état passe à ACTIVE. Vous ne pouvez pas effectuer d'opération Query ou Scan sur l'index tant que l'état de celui-ci n'est pas ACTIVE.

Note

Dans certains cas, DynamoDB ne peut pas écrire des données de la table dans l'index en raison de violations de clé d'index. Cela peut se produire si :

  • Le type de données d'une valeur d'attribut ne correspond pas au type de données d'un type de données de schéma de clé d'index.

  • La taille d'un attribut dépasse la longueur maximale définie pour un attribut de clé d'index.

  • Un attribut de clé d'index a une valeur d'attribut de chaîne (String) ou binaire (Binary) vide.

Les violations de clé d'index n'interfèrent pas avec la création d'index secondaire global. Cependant, quand l'index passe à l'état ACTIVE, il ne contient plus de clé violant le schéma de clé.

DynamoDB fournit un outil autonome pour détecter et résoudre ces problèmes. Pour plus d'informations, consultez Détection et correction des violations de clé d'index.

Ajout d'un index secondaire global à une table volumineuse

Le temps nécessaire à la génération d'un index secondaire global dépend de plusieurs facteurs, tels que les suivants :

  • La taille de la table

  • Le nombre d'éléments dans la table pouvant être inclus dans l'index

  • Le nombre d'attributs projetés dans l'index

  • La capacité d'écriture approvisionnée de l'index

  • L'activité d'écriture sur la table principale pendant les générations d'index

Si vous ajoutez un index secondaire global à une table très volumineuse, le processus de création peut prendre beaucoup de temps. Pour contrôler la progression et déterminer si l'index dispose d'une capacité d'écriture suffisante, consultez les métriques Amazon CloudWatch suivantes :

  • OnlineIndexPercentageProgress

  • OnlineIndexConsumedWriteCapacity

  • OnlineIndexThrottleEvents

Note

Pour plus d'informations sur les métriques CloudWatch relatives à DynamoDB, consultez Métriques DynamoDB.

Si le paramètre de débit d'écriture approvisionné sur l'index est trop bas, la génération d'index prend plus de temps. Pour réduire le temps de génération d'un nouvel index secondaire global, vous pouvez augmenter temporairement sa capacité d'écriture approvisionnée.

Note

En règle générale, nous vous recommandons de définir la capacité d'écriture approvisionnée de l'index sur 1,5 fois la capacité d'écriture de la table. Ce paramétrage convient pour de nombreux cas d'utilisation. Toutefois, vos besoins réels peuvent être plus élevés ou plus bas.

Pendant le remplissage d'un index, DynamoDB utilise la capacité système interne pour lire la table. Cela permet de minimiser l'impact de la création d'index et de s'assurer que la table ne manque pas de capacité de lecture.

Toutefois, il est possible que le volume de l'activité d'écriture entrante dépasse la capacité d'écriture approvisionnée de l'index. Il s'agit d'un scénario de goulot d'étranglement, dans lequel la création d'index prend plus de temps en raison de la limitation de l'activité d'écriture dans l'index. Lors de la génération d'index, nous vous recommandons de contrôler les métriques Amazon CloudWatch pour l'index afin de déterminer si sa capacité d'écriture consommée dépasse sa capacité approvisionnée. Dans un scénario goulot d'étranglement, vous devez augmenter la capacité d'écriture approvisionnée sur l'index pour éviter une limitation d'écriture pendant la phase de remplissage.

Une fois l'index créé, vous devez définir sa capacité d'écriture approvisionnée pour refléter l'utilisation normale de votre application.

Suppression d'un index secondaire global

Si vous n'avez plus besoin d'un index secondaire global, vous pouvez le supprimer à l'aide de l'opération UpdateTable.

Vous ne pouvez supprimer qu'un seul index secondaire global par opération UpdateTable.

Le processus de suppression de l'index secondaire global n'a aucune incidence sur les activités de lecture ou d'écriture dans la table parent. Pendant la suppression, vous pouvez toujours modifier le débit approvisionné sur d'autres index.

Note
  • Lorsque vous supprimez une table à l'aide de l'action DeleteTable, tous les index secondaires globaux sur cette table sont également supprimés.

  • Votre compte ne sera pas facturé pour l'opération de suppression de l'index secondaire global.

Modification d'un index secondaire global en cours de création

Pendant la génération d'un index, vous pouvez utiliser l'opération DescribeTable pour déterminer la phase en cours. La description de l'index inclut un attribut booléen, Backfilling, indiquant si DynamoDB est en train de charger l'index avec les éléments de la table. Si la valeur de Backfilling est true, la phase d'allocation de ressources est terminée et le remplissage de l'index est en cours.

Pendant le remplissage, vous pouvez mettre à jour les paramètres de débit approvisionné pour l'index. Vous pourriez accélérer la génération de l'index en augmentant la capacité d'écriture de l'index pendant la génération de celui-ci, et en la réduisant par la suite. Pour modifier les paramètres de débit approvisionné de l'index, utilisez l'opération UpdateTable. L'état de l'index passe à UPDATING, et Backfilling a la valeur true jusqu'à ce que l'index soit prêt pour utilisation.

Pendant la phase de remplissage, vous pouvez supprimer l'index en cours de création. Au cours de cette phase, vous ne pouvez pas ajouter ou supprimer d'autres index sur la table.

Note

Pour les index créés dans le cadre d'une opération CreateTable, l'attribut Backfilling n'apparaît pas dans la sortie DescribeTable. Pour plus d'informations, consultez Phases de création d'index.