Comment résoudre les problèmes causant le passage d'Amazon Redshift en mode One-by-one (Un par un) suite à l'échec d'une opération en bloc pendant une tâche AWS DMS ?

Date de la dernière mise à jour : 02/10/2019

J'ai une tâche AWS Database Migration Service (AWS DMS) qui migre des données vers Amazon Redshift en tant que cible. Mais ma tâche est passée en mode Un-par-un, car une opération en bloc a échoué. Comment résoudre ce problème ?

Brève description

Au cours de la phase de capture des données modifiées (CDC) d'une tâche, AWS DMS utilise un seul thread pour lire les données modifiées à partir de la source et appliquer les modifications à la cible. Étant donné que le thread ne peut gérer qu'un certain nombre de transactions à la fois, en fonction du taux de modifications apportées à la source, il arrive que le thread ne puisse pas synchroniser la cible avec la source. Cela se produit plus fréquemment lorsqu'Amazon Redshift est la cible d'AWS DMS, car les validations sont onéreuses dans les moteurs OLAP. Par défaut, AWS DMS utilise le mode Batch Apply (Application par lots) pour traiter les modifications par lots. Lorsque vous utilisez le mode Batch Apply (Application par lots), AWS DMS effectue les opérations suivantes :

  1. Il collecte les modifications à partir d'un lot contrôlé par les paramètres Batch Apply (Application par lots).
  2. Il crée une table de modifications nettes qui contient toutes les modifications du lot apportées à l'instance cible. 
  3. Il utilise un algorithme qui regroupe les transactions et les applique en bloc à la cible.

Lorsqu'une tâche de migration qui réplique des données vers Amazon Redshift rencontre un problème lors de l'application d'un lot, AWS DMS ne fait pas échouer l'ensemble du lot. AWS DMS décompose le lot et passe en mode One-by-one (Un par un) pour appliquer les transactions. Lorsqu'AWS DMS trouve la transaction qui a entraîné l'échec du lot, il enregistre la transaction dans la table awsdms_apply_exceptions de la cible Amazon Redshift. AWS DMS applique ensuite les autres transactions du lot une par une jusqu'à ce que toutes les transactions de ce lot soient appliquées sur la cible. Enfin, il repasse en mode Batch Apply (Application de lots) pour un nouveau lot et continue d'utiliser ce mode sauf si un autre lot échoue.

Résolution

Vous pouvez voir si votre lot a échoué et si AWS DMS a utilisé le mode One-by-one (Un par un) en consultant le journal des tâches AWS DMS. Chaque fois qu'un lot échoue et qu'AWS DMS passe en mode One-by-one (Un par un), vous voyez l'entrée de journal suivante :

Messages
[TARGET_APPLY ]I: Bulk apply operation failed. (L'opération d'application en bloc a échoué.) Trying to execute bulk statements in 'one-by-one' mode (bulk_apply.c:2175) (Tentative d'exécution d'instructions en bloc en mode « one-by-one » [Un par un] [bulk_apply.c : 2175].)

Dans ce cas, AWS DMS applique les transactions de manière séquentielle sur la cible jusqu'à ce qu'il rencontre un problème avec n'importe quelle transaction du lot. Si AWS DMS rencontre un problème, il consigne la transaction et vous voyez une entrée de journal similaire à ce qui suit :

Messages
[TARGET_APPLY ]W: Source changes that would have had no impact were not applied to the target database. (Les modifications de source qui n'auraient eu aucun impact n'ont pas été appliquées à la base de données cible.) Refer to the 'awsdms_apply_exceptions' table for details. (endpointshell.c:5984) (Reportez-vous à la table « awsdms_apply_exceptions » pour plus de détails. [endpointshell.c : 5984])

Remarque : par défaut, la table awsdms_apply_exceptions est créée dans le schéma public, sauf si vous spécifiez un schéma de table de contrôle dans les paramètres de votre tâche AWS DMS.

Une fois qu'AWS DMS a enregistré la transaction, il termine l'application de toutes les transactions de ce lot. AWS DMS bascule ensuite à nouveau sur Batch Apply (Application de lots) et vous voyez dans le journal un message similaire à ce qui suit :

Messages
[TARGET_APPLY ]I: Switch back to bulk apply mode (bulk_apply.c:4751) (Retour au mode Bulk Apply [Application de lots] [bulk_apply.c:4751])

Amazon Redshift est un entrepôt de données OLAP optimisé pour exécuter des requêtes analytiques complexes. Toutefois, les performances d'Amazon Redshift peuvent être affectées lors de l'exécution de modifications transactionnelles à partir d'une base de données OLTP. Par conséquent, lorsque le mode Batch Apply (Application par lots) échoue et qu'AWS DMS passe en mode One-by-one (Un par un), vous pouvez voir que la latence cible augmente pendant la période au cours de laquelle AWS DMS exécute les transactions en mode One-by-one (Un par un). Une fois qu'AWS DMS est revenu au mode Bulk Apply (Application de lots), la latence cible diminue.

Pour résoudre ce problème, connectez-vous à la cible Amazon Redshift. Ensuite, obtenez la sortie de la table awsdms_apply_exceptions pour identifier la requête qui a provoqué l'échec du lot :

select * from public.awsdms_apply_exceptions order by 4 desc;

Une fois que vous avez trouvé la requête qui a provoqué l'échec du lot (par exemple, conflits de mise à jour ou violations de contrainte), vous pouvez résoudre les conflits pour empêcher les tâches de passer en One-by-one (Un par un).