Aller au contenu
CDC : le slot de réplication qui remplit votre disqueLecture : 0 %

CDC : le slot de réplication qui remplit votre disque

Un slot de réplication logique est une promesse de ne rien supprimer tant que le consommateur n'a pas confirmé. Les quatre façons dont cette promesse remplit le disque du primaire avec Debezium, et les garde-fous à poser avant la mise en production.

Par Elias Varen7 min de lectureMembres

Le Change Data Capture a une propriété que ses schémas d'architecture ne montrent pas : il donne à un composant périphérique le pouvoir d'arrêter votre base principale. Le connecteur lit le WAL à travers un slot de réplication, et PostgreSQL s'engage à conserver tout le WAL que ce slot n'a pas encore confirmé. Si le connecteur s'arrête un vendredi soir, le WAL s'accumule tout le week-end. Lundi, le volume est plein, PostgreSQL refuse les écritures, et la panne d'un flux analytique est devenue la panne du produit. C'est pourquoi le CDC s'exploite d'abord depuis la base, et seulement ensuite depuis le connecteur.

Ce qu'un slot promet

Un slot de réplication logique tient deux positions. restart_lsn est le point le plus ancien du WAL dont le décodage pourrait encore avoir besoin, et PostgreSQL ne recycle aucun segment postérieur. confirmed_flush_lsn est la position jusqu'où le consommateur a déclaré avoir tout reçu durablement.

WAL ───────────────────────────────────────────────▶ écriture courante
        ▲                    ▲
   restart_lsn       confirmed_flush_lsn
        └──── retenu sur disque, quoi qu'il arrive ────┘

Le slot survit aux déconnexions et aux redémarrages ; c'est sa raison d'être, puisqu'il permet au connecteur de reprendre sans rien perdre. Mais la promesse n'a pas de limite par défaut. Un slot sans consommateur retient le WAL indéfiniment, et il retient aussi l'horizon du catalogue, ce qui gêne le vacuum des tables système.

La requête à connaître par cœur :

SQL
SELECT slot_name,
       active,
       wal_status,
       pg_size_pretty(
         pg_wal_lsn_diff(pg_current_wal_lsn(), restart_lsn)
       ) AS wal_retenu
FROM pg_replication_slots;

wal_retenu est la métrique du CDC, bien avant le retard dans Kafka ou l'état du connecteur, parce qu'elle mesure le nombre d'octets que votre base garde en otage.

Ce qui fait grossir le WAL retenu

Le connecteur arrêté. C'est le cas évident : tâche en échec, déploiement raté, Kafka indisponible. Le slot passe à active = false et le WAL retenu croît au rythme des écritures. Sur une base qui produit 2 Go de WAL par heure avec 80 Go libres, il reste quarante heures, moins qu'un week-end prolongé.

CDC : le slot de réplication qui remplit votre disque · Deepstack