Gérer et monitorer la réplication logique
Cette page décrit comment surveiller la réplication logique dans Lakebase, comment la réplication interagit avec le monter en charge à zéro et les branches, et comment résoudre les problèmes courants. Pour la configuration, voir Répliquer des données vers Lakebase et Répliquer des données depuis Lakebase.
Surveiller la réplication
Tout rôle Postgres peut query les catalogues de réplication sur cette page, avec deux exceptions. La colonne subconninfo de pg_subscription peut contenir le mot de passe de connexion et est restreinte ; veuillez donc sélectionner des colonnes spécifiques au lieu d'utiliser SELECT *. Dans pg_stat_replication, la plupart des colonnes sont masquées à moins que votre rôle ne dispose de pg_read_all_stats, ce que possèdent les membres de databricks_superuser.
Sur un abonné, vérifiez que l'abonnement existe et qu'il est activé :
SELECT subname, subenabled FROM pg_catalog.pg_subscription;
Sur un éditeur, confirmez que la publication existe :
SELECT pubname FROM pg_catalog.pg_publication;
Vérifiez le statut de synchronisation par table sur le destinataire. Lorsque chaque table lit Ready (fully live), la copie initiale est terminée et l'abonnement est en streaming :
SELECT
srrelid::regclass AS table_name,
CASE srsubstate
WHEN 'i' THEN 'Initializing'
WHEN 'd' THEN 'Data copying (in progress)'
WHEN 's' THEN 'Synchronized (catching up)'
WHEN 'r' THEN 'Ready (fully live)'
END AS sync_status
FROM pg_catalog.pg_subscription_rel;
Vérifier l'état de l'abonnement et la latence :
SELECT subname, received_lsn, latest_end_lsn, last_msg_receipt_time
FROM pg_catalog.pg_stat_subscription;
Comparez le nombre de lignes sur l'éditeur et l'abonné pour confirmer qu'une table est synchronisée :
SELECT COUNT(*) FROM public.playing_with_lakebase;
Sur un éditeur, répertoriez les emplacements de réplication et leur degré d'avancement :
SELECT slot_name, slot_type, active, restart_lsn
FROM pg_catalog.pg_replication_slots;
Sur Lakebase, les résultats incluent également les emplacements physiques internes wal_proposer_slot et wal_retention_slot. Lakebase gère ces emplacements, et ils ne font pas partie de la réplication logique.
Réplication logique et Monter en charge jusqu'à zéro
Un compute Lakebase avec un abonné actif ne Monter en charge pas à zéro, ce qui peut augmenter l'utilisation du compute.
Vérifiez les abonnés actifs :
SELECT *
FROM pg_catalog.pg_stat_replication
WHERE application_name <> 'walproposer';
Emplacements de réplication et stockage
Un emplacement de réplication permet à l’éditeur de conserver le journal WAL (write-ahead log) jusqu’à ce que l’abonné confirme qu’il a reçu les modifications. Si l’abonné cesse de consommer les modifications, par exemple parce qu’il est désactivé, déconnecté, en échec ou en retard, les WAL s’accumulent sur l’éditeur. Il s’agit de la cause la plus fréquente de problèmes graves avec la réplication logique :
- L'éditeur peut manquer de stockage. Le WAL conservé augmente jusqu’à ce que le stockage de l’éditeur soit plein, ce qui peut empêcher la base de données d’accepter des écritures et provoquer une interruption de service.
- La suppression de l’emplacement ne libère pas immédiatement le stockage. Postgres ne supprime le WAL conservé que lorsqu’il recycle les segments WAL à un point de contrôle ultérieur. Si l’éditeur manque déjà d’espace de stockage, ce recyclage peut ne pas être terminé.
- Le risque s'applique également aux éditeurs externes. Lorsque Lakebase s'abonne à une base de données externe, le WAL s'accumule sur cette source externe si l'abonnement cesse de consommer les modifications.
Surveiller le WAL conservé
Sur l’éditeur, vérifiez la quantité de WAL conservée par chaque emplacement logique et s’il est actif :
SELECT slot_name, active, wal_status,
pg_catalog.pg_size_pretty(pg_catalog.pg_wal_lsn_diff(pg_catalog.pg_current_wal_lsn(), restart_lsn)) AS retained_wal
FROM pg_catalog.pg_replication_slots
WHERE slot_type = 'logical';
Exécutez cette query régulièrement pendant que la réplication est active. Enquêtez lorsque retained_wal continue de croître ou que active est false. Une valeur wal_status sur extended signifie que l'emplacement conserve plus de WAL que l'éditeur n'en conserve normalement. Une valeur wal_status sur unreserved ou lost signifie que l'emplacement a dépassé max_slot_wal_keep_size et qu'il perd ou a perdu des WAL dont il a besoin. L'abonnement doit donc être recréé.
Récupérer après une accumulation de WAL
-
Trouvez l'emplacement qui conserve le WAL avec la query dans Surveiller le WAL conservé.
-
Si l’abonné peut se rétablir, corrigez la cause, par exemple un problème réseau, un abonnement désactivé ou un processus d’application défaillant, afin que l’abonné rattrape son retard et que l’emplacement avance.
-
Si vous n'avez plus besoin de l'abonnement, supprimez-le sur l'abonné. Si l'abonné est inaccessible, supprimez l'emplacement directement sur l'éditeur. Un emplacement doit être inactif avant de pouvoir être supprimé :
SQLSELECT pg_catalog.pg_drop_replication_slot('<slot_name>'); -
Attendez que l'éditeur recycle le WAL conservé. Sur un éditeur auto-géré qui est sur le point de manquer de stockage, ajoutez d'abord du stockage afin que le recyclage puisse se terminer.
Suppression automatique des emplacements inactifs sur Lakebase
Lorsque Lakebase est le diffuseur, il supprime automatiquement tout emplacement de réplication inactif depuis environ 40 heures afin d’éviter que l’emplacement ne conserve indéfiniment les WAL. Un emplacement devient inactif lorsque son abonné cesse de consommer les modifications et que l’emplacement cesse d’avancer. Cela peut se produire lorsqu’un abonné est désactivé ou devient indisponible, ou lorsqu’un abonné est configuré avec un délai de réplication important.
Pour éviter que les emplacements ne soient supprimés, assurez-vous que leur abonné reste connecté et continue de consommer les modifications. Si l'abonné utilise un délai ou une fréquence de réplication configurable, gardez-les en dessous de 40 heures afin que l'emplacement continue d'avancer. Si un emplacement est supprimé et que vous en avez toujours besoin, recréez l'abonnement sur l'abonné.
Les éditeurs externes ne suppriment pas automatiquement les emplacements inactifs. Sur un éditeur autogéré, définissez max_slot_wal_keep_size pour limiter le WAL qu’un emplacement peut conserver. Si un emplacement dépasse la limite, Postgres l’invalide et vous devez recréer l’abonnement.
La restauration de Branch supprime les emplacements de réplication
La restauration d'une Branch supprime tous les emplacements de réplication sur cette Branch. Recréez les publications et les abonnements après une restauration de Branch.
Les Branch enfants n'héritent pas des abonnements
Les abonnements définis sur une Branch parente ne sont pas dupliqués sur ses Branch enfants. Lakebase les supprime d'une Branch enfant avant que le compute de cette Branch ne start, afin que deux computes ne répliquent pas le même abonnement. Ceci s'applique lorsque vous créez, Reset ou restaurez une Branch enfant. Recréez l'abonnement sur la Branch enfant si vous avez besoin de le répliquer.
La suppression d'une base de données supprime ses abonnements
Avant de supprimer une base de données en réponse à une commande ou une opération DROP DATABASE, Lakebase supprime tous les abonnements de réplication logique définis dans cette base de données.
Rôles de réplication
Un rôle de réplication dédié doit disposer de l’attribut REPLICATION. Les rôles créés dans l’application Lakebase, la CLI Databricks ou l’API REST disposent de cet attribut, qu’ils soient membres de databricks_superuser ou non. Les rôles créés avec SQL ne reçoivent pas automatiquement l’attribut REPLICATION. Pour en créer un avec SQL, incluez l’attribut, par exemple CREATE ROLE replication_user WITH LOGIN REPLICATION PASSWORD '<password>';. Pour l’ajouter à un rôle existant, exécutez ALTER ROLE <role_name> REPLICATION;. Les deux instructions nécessitent un rôle disposant des attributs CREATEROLE et REPLICATION, tel que le rôle du propriétaire du projet.
Vérifier les privilèges d'un rôle :
SELECT rolname, rolreplication
FROM pg_catalog.pg_roles
WHERE rolname = '<role_name>';
Plug-ins de décodeur
Lakebase prend en charge deux plugins de sortie de décodage logique :
pgoutput: le plugin de réplication logique Postgres intégré, et le default. Utilisez-le pour la réplication standard de Postgres vers Postgres.wal2json: envoie les modifications WAL sous forme de JSON, pour les systèmes qui consomment les données de modification au format JSON.
Paramètres de publication
Sur Lakebase, max_wal_senders et max_replication_slots sont tous deux définis sur 10:
max_wal_senders = 10
max_replication_slots = 10
max_wal_senders limite le nombre de processus d'envoi WAL simultanés qui Stream des modifications aux abonnés, et max_replication_slots limite le nombre d'emplacements de réplication qui suivent la progression de l'abonné. Prévoyez un élément de chaque par abonné. Pour demander des valeurs différentes, contactez Databricks.
Créer un emplacement de réplication dédié
Certains Data Services nécessitent un emplacement de réplication que vous créez à l'avance. Créez-en un avec la fonction Postgres standard, en nommant le plug-in de décodeur :
SELECT pg_catalog.pg_create_logical_replication_slot('my_replication_slot', 'pgoutput');
Supprimer un abonnement ou une publication
Supprimez un abonnement sur l'abonné lorsque vous n'en avez plus besoin. Lorsque l'éditeur est accessible, la suppression de l'abonnement coupe la connexion avec l'éditeur et supprime l'emplacement de réplication sur l'éditeur. Les données répliquées restent dans la base de données de l'abonné.
DROP SUBSCRIPTION my_subscription;
Si l’éditeur est injoignable, DROP SUBSCRIPTION ne se termine pas, car il ne peut pas se connecter pour supprimer l’emplacement distant. Dissociez d'abord l'emplacement, puis supprimez l'abonnement :
ALTER SUBSCRIPTION my_subscription DISABLE;
ALTER SUBSCRIPTION my_subscription SET (slot_name = NONE);
DROP SUBSCRIPTION my_subscription;
Dans ce cas, l'emplacement de réplication reste sur l'éditeur et continue à conserver les fichiers WAL. Supprimez-le sur l'éditeur pour libérer le WAL :
SELECT pg_catalog.pg_drop_replication_slot('<slot_name>');
Supprimez une publication sur l'éditeur :
DROP PUBLICATION my_publication;
Dépannage
Symptôme | Cause et résolution |
|---|---|
L’abonnement ne se connecte pas. | Confirmez que l'éditeur est joignable et que la chaîne de connexion, le rôle et le mot de passe sont corrects. Lorsque Lakebase est l'abonné, confirmez que l'endpoint de l'éditeur est dans la liste d'autorisation de la politique réseau du compte. Voir Répliquer des données dans Lakebase. |
| Votre compte applique une politique de réseau et l’hôte de l’éditeur ne figure pas dans les destinations internet autorisées. Ajoutez l’hôte à la politique de réseau du compte. Consultez Répliquer des données dans Lakebase. |
Le stockage augmente et n’est pas libéré. | Un emplacement de réplication conserve le WAL parce que son abonné ne consomme pas les modifications. Si le problème n'est pas résolu, l'éditeur risque de manquer de stockage. Vérifiez le WAL conservé, puis reconnectez l'abonné ou supprimez l'emplacement. Le stockage n'est libéré qu'après que l'éditeur a recyclé le WAL. Voir Emplacements de réplication et stockage. |
Les lignes n’arrivent pas sur l’abonné. | Confirmez que les tables cibles existent avec des noms et des colonnes correspondants, et que la publication inclut les tables que vous attendez. |
Étapes suivantes
- Migrer vers Lakebase : Répliquez une base de données Postgres existante vers Lakebase. Voir Répliquer des données vers Lakebase.
- Stream depuis Lakebase : publiez les modifications sur un abonné Postgres externe. Voir Répliquer des données depuis Lakebase.
- Comprendre la fonctionnalité : Examinez ce qu’est la réplication logique et quand l’utiliser. Voir Réplication logique.