Comment puis-je utiliser la fonctionnalité d'application par lots DMS pour améliorer les performances de réplication CDC ?

Date de la dernière mise à jour : 16/02/2021

J'exécute une tâche AWS Database Migration Service (AWS DMS) de chargement complet et de capture de données modifiées (CDC). La latence source n'est pas élevée, mais la latence cible est élevée ou elle augmente. Comment puis-je accélérer la phase de réplication CDC ?

Brève description

AWS DMS utilise les méthodes suivantes pour répliquer les données dans la phase de capture de données modifiées (CDC) :

  • Application transactionnelle
  • Application par lots

Le processus CDC d'AWS DMS est à thread unique, par défaut (application transactionnelle). Il utilise la même méthode pour la réplication SQL que tous les autres moteurs de base de données OLTP (Online Transactional Processing). La réplication CDC de DMS dépend des journaux de transactions de la base de données source. Au cours de la phase de réplication, DMS applique les modifications à l'aide d'une méthode d'application transactionnelle comme suit :

  1. DMS lit les modifications à partir du journal des transactions, de la source dans la mémoire de l'instance de base de données de réplication.
  2. DMS traduit les modifications, puis les transmet à un composant trieur.
  3. Le composant trieur trie les transactions dans l'ordre de validation, puis les transmet à la cible, de manière séquentielle.

Si le taux de changement est élevé sur la base de données source, ce processus peut prendre du temps. Il se peut que vous observiez un pic dans les métriques de latence cible CDC lorsque DMS reçoit une charge de travail entrante élevée de la base de données source.

DMS utilise une méthode de réplication à thread unique pour traiter les modifications CDC. DMS fournit le paramètre de niveau de tâche BatchAPPLYEnabled pour traiter rapidement les modifications sur une cible à l'aide de lots. BatchApplyEnabled est utile si vous avez une charge de travail élevée sur la base de données source et une tâche avec une latence CDC cible élevée. Par défaut, DMS désactive BatchApplySetting. Vous pouvez l'activer à l'aide de l'interface de ligne de commande d’AWS (AWS CLI).

Fonctionnement de l'application par lots

Si vous exécutez une tâche avec BatchApplyEnabled, DMS traite les modifications de la manière suivante :

  1. DMS collecte les modifications dans le lot à partir des journaux de transactions de la base de données source.
  2. DMS crée une table appelée table des modifications nettes, avec toutes les modifications du lot.
  3. Cette table réside dans la mémoire de l'instance de base de données de réplication et est transmise à l'instance de base de données cible.
  4. DMS applique un algorithme de modifications nettes qui solde toutes les modifications à partir de la table des modifications nettes pour les appliquer à la table cible réelle.

Par exemple, si vous exécutez une tâche DMS avec BatchApplyEnabled et qu'une nouvelle ligne est insérée, mise à jour dix fois et finalement supprimée dans un seul lot, DMS calcule le résultat net de toutes ces transactions et ne les reporte donc pas. Car, en définitive, la ligne est supprimée et n'existe plus. Ce processus réduit le nombre de transactions réelles qui sont appliquées sur la cible.

BatchApplyEnabled applique l'algorithme des modifications nettes au niveau des lignes d'une table au sein d'un lot d'une tâche particulière. Ainsi, si la base de données source est fréquemment modifiée (mise à jour, suppression et insertion) ou subit une combinaison de ces charges de travail sur les mêmes lignes, BatchApplyEnabled offre une efficacité optimale. Cette option minimalise les modifications à appliquer à la cible. Si le lot collecté est unique dans les modifications (mise à jour / suppression / insertion de modifications pour différents enregistrements de ligne), le processus d'algorithme de table de modification nette ne peut filtrer aucun événement. Par conséquent, tous les événements de lot sont appliqués sur la cible en mode lot. Les tables doivent avoir une clé primaire ou une clé unique pour que les lots s'appliquent au travail.

DMS fournit également le paramètre BatchApplyPreserveTransaction pour le réglage du traitement des modifications. Si vous activez BatchApplySetting, BatchApplyPreserveTransaction s’active par défaut. Si vous définissez la valeur sur true, l'intégrité transactionnelle est préservée. Un lot est garanti pour contenir toutes les modifications au sein d'une transaction à partir de la source. Ce paramètre s'applique uniquement aux points de terminaison cibles Oracle.

Remarque : faites attention aux avantages et aux inconvénients de ce paramètre. Lorsque le paramètre BatchApplyPreserveTransaction est true, DMS capture l'intégralité de la transaction longue durée dans la mémoire de l'instance de base de données de réplication. Il le fait conformément aux paramètres de tâche MemoryLimitTotal et MemoryKeepTime, et effectue l’échange si nécessaire, avant d'envoyer des modifications à la table des modifications nettes. Lorsque le paramètre BatchApplyPreserveTransaction a la valeur false, les modifications d'une seule transaction peuvent s'étendre sur plusieurs lots. Cela peut entraîner une perte de données en cas d'application partielle, par exemple, en raison de l'indisponibilité de la base de données cible.

Pour en savoir plus sur la latence DMS et le processus d'application par lots, consultez la Partie 2 et la Partie 3 des blogs Débogage de vos migrations AWS DMS.

Cas d'utilisation de l'application par lots

Vous pouvez utiliser l'application par lots dans les cas suivants :

  • La tâche comporte un nombre élevé de transactions capturées à partir de la source, ce qui génère une latence au niveau de la cible.
  • La tâche possède une charge globale provenant de la source qui est une combinaison d'insertion, de mise à jour et de suppression sur les mêmes lignes.
  • Il n'est pas nécessaire de conserver une intégrité référentielle stricte sur la cible (clés premières désactivées).

Limitations

L'application par lots présente actuellement les limites suivantes :

  • Par défaut, la cible Amazon Redshift utilise l'application par lots. La cible Amazon Simple Storage Service (Amazon S3) est forcée d'utiliser l'application transactionnelle.
  • L'application par lots ne peut fonctionner que sur les tables avec clé primaire/index unique. Pour les tables sans clé primaire/index unique, l'application en mode bloc appliquera uniquement l'insertion en mode groupé, mais effectuera les mises à jour et les suppressions une par une. Si la table possède une clé primaire/un index unique mais qu'un basculement en mode un par un est observé, consultez la section 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 ?
  • Lorsque des colonnes LOB sont incluses dans la réplication, vous pouvez utiliser BatchApplyEnabled en mode LOB limité uniquement. Pour plus d'informations, consultez la section Paramètres de tâche de métadonnées cible.
  • Lorsque BatchApplyEnabled est défini sur true, AWS DMS génère un message d'erreur si une table cible a une contrainte unique.

Résolution

Remarque : si vous recevez des erreurs lors de l'exécution de commandes à partir de l'interface de ligne de commande AWS (AWS CLI), assurez-vous d'utiliser la version la plus récente d'AWS CLI.

BatchApplySetting est désactivé par défaut. Vous pouvez activer ce paramètre à l'aide de l'interface de ligne de commande AWS (AWS CLI) ou de la console AWS DMS. Effectuez les tâches de configuration suivantes sur votre système avant d'activer le paramétrage par lots :

Vérifier l'état des paramètres de traitement par lots d'une tâche existante

  1. Ouvrez la console AWS DMS.
  2. Sélectionnez Tâches de migration de base de données dans le volet de navigation.
  3. Sélectionnez votre tâche, puis Paramètre de la tâche (JSON). Dans le JSON, BatchApplyEnabled est répertorié avec le statut disabled.

Activer le paramètre de traitement par lots à l'aide de l'interface de ligne de commande AWS

  1. Ouvrez le système avec AWS CLI installé.
  2. Exécutez la commande aws configure pour ouvrir l'invite AWS CLI.
  3. Saisissez votre ID de clé d'accès AWS, puis appuyez sur Entrée.
  4. Saisissez votre ID de clé secrète AWS, puis appuyez sur Entrée.
  5. Saisissez le nom de la région de vos ressources DMS, puis appuyez sur Entrée.
  6. Saisissez le format de sortie, puis appuyez sur Entrée.
  7. Exécutez la commande modify-replication-task avec les conditions de configuration de l'ARN de tâche et par lots.

Remarque : vérifiez que la tâche affiche l'état stopped avant de modifier la tâche. Modifiez l'ARN sur la commande suivante en fonction de votre tâche, puis exécutez-le pour modifier le paramètre de tâche.

Une fois la commande exécutée avec succès dans l'interface de ligne de commande d’AWS, ouvrez la console DMS et revérifiez le statut des paramètres par lots de votre tâche. BatchApplyEnabled est maintenant répertorié comme activé dans Paramètre de la tâche (JSON).

Vous pouvez maintenant démarrer la tâche DMS et observer les performances de migration.

aws dms modify-replication-task --replication-task-arn arn:aws:dms:us-east-1:123456789123:task:4VUCZ6ROH4ZYRIA25M3SE6NXCM --replication-task-settings "{\"TargetMetadata\":{\"BatchApplyEnabled\":true}}"

Activer le paramètre de traitement par lots à l'aide de la console AWS DMS

  1. Ouvrez la console AWS DMS.
  2. Sélectionnez Tâches de migration de base de données dans le volet de navigation.
  3. Choisissez votre tâche, puis choisissez Modifier.
  4. Dans la section Paramètres de tâche, choisissez éditeur JSON.
  5. Modifiez les paramètres de tâche à changer. Par exemple, dans la section TargetMetadata, changez BatchApplyEnabled en true (la valeur par défaut est false).
  6. Cliquez sur Enregistrer pour modifier la tâche.

Vérifiez que les modifications sont entrées en vigueur en procédant comme suit :

  1. Dans la page de liste des tâches, choisissez la tâche que vous avez modifiée.
  2. Dans l'onglet Présentation des détails, développez Paramètres de la tâche (JSON).
  3. Vérifiez les paramètres de tâche de la tâche.

Résolution des problèmes liés à un CDCLatencyTarget élevé après l'exécution d’une tâche en mode de traitement par lots

Si CDCLatencyTarget est élevé après l'exécution de la tâche en mode de traitement par lots, la latence peut être due aux éléments suivants :

  • Transaction de longue durée sur la cible en raison de l'absence d'index primaire et secondaire
  • Disponibilité insuffisante des ressources pour traiter la charge de travail sur la cible
  • Conflit de ressources élevé sur l'instance de réplication DMS

Suivez les bonnes pratiques DMS pour résoudre ces problèmes.