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

Date de la dernière mise à jour : 25/07/2022

J'exécute une tâche de capture de données modifiées (CDC) d'AWS Database Migration Service (AWS DMS) et j'utilise une base de données PostgreSQL comme source. Pourquoi la consommation de stockage est-elle élevée sur ma base de données source lorsque j'exécute une tâche CDC d'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, une fonction de PostgreSQL, pour obtenir les modifications de la base de données source. Ces emplacements représentent un flux d'opérations qui sont rejouées dans le même ordre qu'elles ont été effectuées dans la base de données source PostgreSQL.

Par conception, les emplacements de réplication logique conservent les journaux de transactions (WAL) dont AWS DMS a besoin, même lorsqu'ils ne sont pas connectés à la source PostgreSQL. Ainsi, WAL est supprimé de PostgreSQL seulement après qu'AWS DMS confirme qu'il a récupéré les modifications dont il a besoin à partir de l'emplacement de réplication. AWS DMS confirme qu'il dispose des modifications nécessaires en avançant le restart_lsn de l'emplacement de réplication.

Causes d'une consommation de stockage élevée sur une source PostgreSQL

En raison de la façon dont PostgreSQL implémente la fonction d'emplacement de réplication logique, dans certains scénarios, des problèmes de volume de stockage peuvent survenir sur la base de données source.

  • La tâche CDC d'AWS DMS est arrêtée pendant une longue période : cela signifie qu'AWS DMS n'est pas connecté à la base de données source et qu'il ne consomme pas les modifications à partir de l'emplacement de réplication sur la source. Cela signifie que PostgreSQL conserve continuellement les WAL sans supprimer les WAL plus anciens qui n'ont pas été lus par AWS DMS. Ainsi, le stockage sur la base de données source finit par se remplir.
  • Charge de travail élevée : les charges de travail élevées qui entraînent une génération excessive des WAL peuvent également entraîner le remplissage du stockage sur une base de données PostgreSQL lorsque les emplacements de réplication logique sont utilisés. Cela se produit parce que les WAL sont toujours conservés par PostgreSQL si les numéros de séquence de journal (LSN) sont requis par l'emplacement de réplication.
  • Emplacements de réplication inactifs : même si une table, un schéma ou une base de données à partir desquels AWS DMS réplique des modifications est inactif, les WAL conservés par l'emplacement de réplication contiennent toujours des informations sur cette table, ce schéma ou cette base de données. Cela entraîne un remplissage du stockage sur la source, même si les tables ne font l'objet d'aucune transaction.

Solution

Vérifiez si les emplacements de réplication sont à l'origine d'une utilisation élevée de l'espace disque sur la source PostgreSQL

Pour vérifier si les emplacements de réplication sont à l'origine d'une utilisation élevée de l'espace disque dans votre base de données PostgreSQL, exécutez les requêtes répertoriées dans Pourquoi ai-je reçu une erreur « No space left on device » (Espace insuffisant sur l'appareil) ou « DiskFull » (Disque plein) sur Amazon RDS for PostgreSQL ?

Remarque : la plupart de ces requêtes peuvent être utilisées sur des installations PostgreSQL autogérées.

Activation de la fonction WAL heartbeat

Activez la fonction WAL heartbeat d'AWS DMS pour vous aider à éviter de consommer du stockage sur une base de données source PostgreSQL. Cette fonction imite une transaction fictive afin que les emplacements de réplication logique inactifs ne conservent pas les anciens journaux WAL. Ce heartbeat permet à restart_lsn de rester en mouvement et empêche le stockage de se remplir sur la source PostgreSQL.

Pour activer la fonction WAL heartbeat, ajoutez cet attribut de connexion supplémentaire (ECA) au point de terminaison de la source PostgreSQL :

heartbeatEnable=Y;

En option, spécifiez ces ECA supplémentaires :

heartbeatFrequency=frequency;heartbeatSchema=schemaname;

heartbeatFrequency détermine la fréquence (en minutes) à laquelle la transaction heartbeat est exécutée sur la source PostgreSQL. Par exemple, si vous définissez heartbeatFrequency à une valeur de 15, alors AWS DMS exécute la transaction heartbeat toutes les 15 minutes sur la source.

heartbeatSchema indique dans quel schéma de base de données AWS DMS crée les objets de base de données pour générer la transaction heartbeat.

Remarque : la transaction heartbeat s'exécute sur la source uniquement si une tâche AWS DMS est en cours d'exécution. Si vos tâches AWS DMS sont arrêtées, la fonction WAL heartbeat n'a aucun effet.

Limitation de la taille d'un emplacement dans PostgreSQL

Vous pouvez appliquer max_slot_wal_keep_size sur la base de données source dans PostgreSQL 13 et versions ultérieures. Ceci définit la quantité maximale des WAL qui peuvent être conservés par les emplacements de réplication.

Remarque : le paramètre max_slot_wal_keep_size peut vous aider à éviter les problèmes de saturation du stockage sur la source PostgreSQL. Mais, il peut également entraîner la purge des WAL de la source avant que la tâche CDC d'AWS DMS puisse lire ses modifications à partir de l'emplacement de réplication. Ainsi, la tâche échoue.