Passer au contenu

Pourquoi est-ce que je constate une consommation de stockage élevée sur ma base de données PostgreSQL source lorsque j'exécute une tâche CDC d’AWS DMS ?

Lecture de 5 minute(s)
0

Je souhaite résoudre des problèmes de consommation de stockage élevée sur ma base de données PostgreSQL source lorsque j'exécute une tâche de capture de données modifiées (CDC) d’AWS Database Migration Service (AWS DMS).

Brève description

Lorsque vous utilisez PostgreSQL comme source pour une tâche CDC, AWS DMS utilise des emplacements de réplication logique PostgreSQL pour récupérer les modifications depuis la base de données source. Les emplacements conservent les journaux d'écriture anticipée (WAL) dont AWS DMS a besoin, même lorsque vous ne les connectez pas à la source PostgreSQL. AWS DMS ne supprime les WAL de PostgreSQL qu’après avoir récupéré les modifications requises dans l'emplacement de réplication et avancé le restart_lsn de l’emplacement de réplication.

Pour plus d'informations, consultez la page Concepts de décodage logique sur le site Web de PostgreSQL.

Des problèmes de volume de stockage peuvent survenir pour les motifs suivants :

  • Vous interrompez la tâche CDC d’AWS DMS pendant une longue période. Si vous ne connectez pas AWS DMS à la base de données source, les modifications apportées par l'emplacement de réplication sur la source ne seront pas prises en compte. Ainsi, PostgreSQL conserve en permanence les WAL.
  • Vous disposez d’une charge de travail importante qui entraîne une génération excessive de WAL. Lorsque vous utilisez des emplacements de réplication logique, PostgreSQL conserve les WAL si l'emplacement de réplication requiert les numéros de séquence de journal (LSN).
  • Vous disposez d’emplacements de réplication inactifs. Même lorsqu'un emplacement de réplication est inactif, le WAL conservé par l’emplacement de réplication contient toujours des informations sur la table, le schéma ou la base de données. Cela permet de remplir l'espace de stockage sur la source, même lorsque les tables ne contiennent aucune transaction.

Résolution

Vérifiez si les emplacements de réplication entraînent une utilisation élevée de l'espace disque sur la source PostgreSQL

Pour vérifier si les emplacements de réplication entraînent une utilisation élevée de l'espace disque dans votre base de données PostgreSQL, exécutez l'une des requêtes suivantes :

Pour PostgreSQL v9 :

psql=> SELECT slot_name, pg_size_pretty(pg_xlog_location_diff(pg_current_xlog_location(),restart_lsn)) AS replicationSlotLag, active FROM pg_replication_slots ;

Pour PostgreSQL v10 et versions ultérieures :

psql=> SELECT slot_name, pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_lsn(),restart_lsn)) AS replicationSlotLag, active FROM pg_replication_slots ;

Exemple de sortie :

slot_name                                                      | replicationslotlag | active---------------------------------------------------------------+--------------------+--------
xc36ujql35djp_00013322_907c1e0a_9f8b_4c13_89ea_ef0ea1cf143d    | 129 GB             | f
7pajuy7htthd7sqn_00013322_a27bcebf_7d0f_4124_b336_92d0fb9f5130 | 704 MB             | t
zp2tkfo4ejw3dtlw_00013322_03e77862_689d_41c5_99ba_021c8a3f851a | 624 MB             | t

Si l'état actif d'un emplacement de réplication est défini sur f (faux), cela signifie que votre base de données n’utilise pas cet emplacement.

Pour supprimer les emplacements inutilisés, exécutez la requête suivante :

psql=> SELECT pg_drop_replication_slot('YOUR_SLOTNAME');

Remarque : Remplacez YOUR_SLOTNAME par le nom de l’emplacement.

Pour plus d'informations, consultez la section Pourquoi un message d'erreur « No space left on device » ou « DiskFull » s’est-il affiché sur Amazon Relational Database Service (Amazon RDS) pour PostgreSQL ?

Activer la fonction de pulsation WAL

Pour réduire votre consommation de stockage sur une base de données source PostgreSQL, activez l'attribut de connexion supplémentaire (ECA) heartbeatEnable. Cet attribut permet d'éviter les scénarios de stockage complets sur la source PostgreSQL.

Pour activer la fonction de pulsation WAL, ajoutez l'ECA suivant au point de terminaison source PostgreSQL :

heartbeatEnable=Y;

Remarque : La transaction de pulsation ne s'exécute sur la source que si une tâche AWS DMS est en cours d'exécution. Si vous interrompez vos tâches AWS DMS, la fonction de pulsation WAL n'a aucun effet.

Vous pouvez également spécifier les ECA suivants :

heartbeatFrequency=frequency;heartbeatSchema=schemaname;

L'attribut heartbeatFrequency détermine la fréquence en minutes à laquelle la transaction de pulsation s'exécute sur la source PostgreSQL. Remplacez frequency par la fréquence à laquelle vous souhaitez que la transaction soit exécutée. Par exemple, si vous définissez heartbeatFrequency sur la valeur 15, AWS DMS exécute la transaction de pulsation toutes les 15 minutes sur la source.

L'attribut heartbeatSchema spécifie le schéma de base de données dans lequel AWS DMS crée des objets de base de données pour générer la transaction de pulsation. Remplacez schemaname par votre schéma de base de données.

Définir la taille maximale d'un emplacement dans PostgreSQL

Vous pouvez appliquer max_slot_wal_keep_size à la base de données source dans PostgreSQL version 13 et versions ultérieures. Cela définit la quantité maximale de WAL pouvant être conservés par les emplacements de réplication. Pour plus d'informations, consultez la page max_slot_wal_keep_size sur le site Web de PostgreSQL.

Remarque : Le paramètre max_slot_wal_keep_size vous permet d'éviter les problèmes de stockage complet sur la source PostgreSQL. Toutefois, cela peut amener la base de données source PostgreSQL à purger les WAL avant que la tâche CDC d’AWS DMS ne lise les modifications depuis l’emplacement de réplication. Cela peut entraîner l'échec de la tâche.

Informations connexes

Types d’emplacements de réplication PostgreSQL sur le site Web de Hevo

AWS OFFICIELA mis à jour il y a 5 mois