Quelle est la méthode recommandée par Amazon pour modifier le schéma d'une grande table dans un DynamoDB de production?
Imaginez un hypothétique cas où nous avons une table Person, avec une clé de hachage principale SSN. Ce tableau peut contenir 10 millions d'articles.
Maintenant, la nouvelle vient qu'en raison du volume critique de vols d'identité, le gouvernement de ce pays hypothétique a introduit une autre identification personnelle: Unique Personal Identifier, ou UPI.
Nous devons ajouter une colonne UPI et changer le schéma de la table Person, de sorte que maintenant la clé de hachage principale est UPI. Nous voulons prendre en charge pendant un certain temps à la fois le système actuel , qui utilise SSN et le nouveau système, qui utilise UPI, nous avons donc besoin que ces deux colonnes coexistent dans la table Person.
Quelle est la méthode recommandée par Amazon pour effectuer ce changement de schéma?
Il existe plusieurs approches, mais vous devez d'abord comprendre que vous ne pouvez pas modifier le schéma d'une table existante. Pour obtenir un schéma différent, vous devez créer une nouvelle table. Vous pourrez peut-être réutiliser votre table existante, mais le résultat serait le même que si vous créiez une table différente.
Les flux DynamoDB nous permettent de migrer des tables sans aucun temps d'arrêt. J'ai fait cela de manière très efficace, et les étapes que j'ai suivies sont les suivantes:
Scannez le GSI créé à l'étape précédente (ou la table entière) et utilisez le filtre suivant:
FilterExpression = "attribute_not_exists (Migré)"
Mettez à jour chaque élément du tableau avec un indicateur de migration (c'est-à-dire: "Migré": {"S": "0"}, qui l'envoie aux flux DynamoDB (à l'aide de l'API UpdateItem, pour éviter toute perte de données).
[~ # ~] note [~ # ~] : Vous souhaiterez peut-être augmenter les unités de capacité d'écriture sur la table pendant les mises à jour.
En suivant ces étapes, vous devez vous assurer que vous n'avez aucune perte de données et aucun temps d'arrêt.
J'ai documenté cela sur mon blog, avec du code pour aider: https://www.abhayachauhan.com/2018/01/dynamodb-changing-table-schema/
J'utilise une variante de la troisième approche d'Alexandre. Encore une fois, vous créez une nouvelle table qui sera mise à jour à mesure que l'ancienne table est mise à jour. La différence est que vous utilisez du code dans le service existant pour écrire dans les deux tables pendant la transition au lieu d'utiliser une fonction lambda. Vous pouvez avoir un code de persistance personnalisé que vous ne souhaitez pas reproduire dans une fonction lambda temporaire et il est probable que vous devrez de toute façon écrire le code de service pour cette nouvelle table. Selon votre architecture, vous pourrez même basculer vers la nouvelle table sans interruption.
Cependant, la partie agréable de l'utilisation d'une fonction lambda est que toute charge introduite par des écritures supplémentaires dans la nouvelle table se fera sur le lambda, pas sur le service.