Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Deze pagina beschrijft hoe je logische replicatie in Lakebase kunt monitoren, hoe replicatie samenwerkt met schaal tot nul en branches, en hoe veelvoorkomende problemen kunnen worden opgelost. Voor de setup, zie Data repliceren naar Lakebase en Data repliceren uit Lakebase.
Replicatie monitoren
Elke Postgres-rol kan de replicatiecatalogi op deze pagina raadplegen, met twee uitzonderingen. De subconninfo kolom van pg_subscription kan het verbindingswachtwoord bevatten en is beperkt, dus selecteer specifieke kolommen in plaats van SELECT *. In pg_stat_replication zijn de meeste kolommen verborgen tenzij je rol over pg_read_all_stats beschikt, wat leden van databricks_superuser hebben.
Bevestig bij een abonnee dat het abonnement bestaat en is ingeschakeld:
SELECT subname, subenabled FROM pg_catalog.pg_subscription;
Bevestig bij een uitgever dat de publicatie bestaat:
SELECT pubname FROM pg_catalog.pg_publication;
Controleer de synchronisatiestatus per tabel op de subscriber. Wanneer elke tabel Ready (fully live) aangeeft, is de eerste kopie klaar en wordt het abonnement gestreamd:
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;
Controleer de abonnementsstatus en achterstand:
SELECT subname, received_lsn, latest_end_lsn, last_msg_receipt_time
FROM pg_catalog.pg_stat_subscription;
Vergelijk het aantal rijen van de uitgever en de abonnee om te bevestigen dat een tabel synchroon is:
SELECT COUNT(*) FROM public.playing_with_lakebase;
Vermeld bij een uitgever replicatieslots en hoe ver elk is gevorderd:
SELECT slot_name, slot_type, active, restart_lsn
FROM pg_catalog.pg_replication_slots;
Op Lakebase omvatten de resultaten ook de interne fysieke slots wal_proposer_slot en wal_retention_slot. Lakebase beheert deze slots, en ze maken geen deel uit van logische replicatie.
Logische replicatie en schaal tot nul
Een Lakebase-compute met een actieve subscriber schaalt niet naar nul, wat het computegebruik kan verhogen.
Controleer op actieve abonnees:
SELECT *
FROM pg_catalog.pg_stat_replication
WHERE application_name <> 'walproposer';
Replicatieslots en opslag
Een replicatieslot zorgt ervoor dat de publisher het write-ahead log (WAL) behoudt totdat de subscriber bevestigt dat de wijzigingen zijn ontvangen. Als de abonnee stopt met het consumeren van wijzigingen, bijvoorbeeld omdat deze is uitgeschakeld, losgekoppeld, niet goed functioneert of achterloopt, hoopt WAL zich op op de publisher. Dit is de meest voorkomende oorzaak van ernstige problemen met logische replicatie:
- De uitgever kan zonder opslagruimte komen te zitten. Behouden WAL groeit totdat de opslag van de publisher vol is, wat ervoor kan zorgen dat de database geen schrijfacties meer accepteert en een storing kan veroorzaken.
- Het verwijderen van de sleuf maakt opslagruimte niet onmiddellijk vrij. Postgres verwijdert de bewaarde WAL alleen wanneer het WAL-segmenten bij een later controlepunt recyclet. Als de uitgever al door zijn opslagruimte heen is, kan het zijn dat de recycling niet wordt voltooid.
- Het risico geldt ook voor externe uitgevers. Wanneer Lakebase een abonnement neemt op een externe database, wordt WAL opgebouwd op die externe bron als het abonnement stopt met het consumeren van wijzigingen.
Controleer behouden WAL
Controleer bij de uitgever hoeveel WAL elke logische slot behoudt en of deze actief is:
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';
Voer deze query regelmatig uit terwijl de replicatie actief is. Onderzoek wanneer retained_wal blijft groeien of active is false. Een extended van wal_status betekent dat het slot meer WAL vasthoudt dan de publisher normaal bewaart.
wal_status van lost of max_slot_wal_keep_size betekent dat het slot unreserved heeft overschreden en WAL verliest die het nodig heeft, of die al heeft verloren, dus het abonnement moet opnieuw worden aangemaakt.
Herstellen na WAL-ophoping
Zoek de slot die WAL vasthoudt met de query in Monitor retained WAL.
Als de abonnee kan herstellen, los dan de oorzaak op, zoals een netwerkprobleem, een uitgeschakeld abonnement of een mislukte apply-bewerking, zodat de abonnee bijloopt en de slot vooruitgaat.
Als je het abonnement niet meer nodig hebt, sleep het dan naar de abonnee. Als de subscriber onbereikbaar is, laat de slot dan direct vallen op de publisher. Een slot moet inactief zijn voordat je het kunt verwijderen:
SELECT pg_catalog.pg_drop_replication_slot('<slot_name>');Wacht tot de publisher de behouden WAL recyclet. Op een zelfbeheerde publisher die bijna zonder opslag zit, voeg eerst opslag toe zodat het recyclen kan worden afgerond.
Automatische verwijdering van inactieve slots op Lakebase
Wanneer Lakebase de publisher is, verwijdert het automatisch een replicatieslot dat ongeveer 40 uur inactief is geweest, om te voorkomen dat het slot WAL voor onbepaalde tijd behoudt. Een slot wordt inactief wanneer de abonnee stopt met het consumeren van wijzigingen en het slot niet verder opschuift. Dit kan gebeuren wanneer een abonnee wordt gedeactiveerd of onbereikbaar wordt, of wanneer een abonnee is geconfigureerd met een lange replicatievertraging.
Om te voorkomen dat een slot wordt verwijderd, zorg ervoor dat de abonnee verbonden blijft en wijzigingen blijft verwerken. Als de abonnee een configureerbare replicatievertraging of frequentie gebruikt, houd deze dan onder de 40 uur zodat het slot blijft opschuiven. Als er een slot is verwijderd en je hebt het nog steeds nodig, maak dan het abonnement opnieuw aan op de subscriber.
Externe uitgevers verwijderen inactieve slots niet automatisch. Stel op een zelfbeheerde uitgever max_slot_wal_keep_size in om de hoeveelheid WAL te beperken die een slot kan behouden. Als een slot de limiet overschrijdt, maakt Postgres deze ongeldig en moet je de subscription opnieuw aanmaken.
Branch restore verwijdert replicatieslots
Het herstellen van een tak verwijdert alle replicatieslots op die branch. Maak publicaties en abonnementen opnieuw aan na een branchherstel.
Kindtakken erven geen abonnementen
Abonnementen die op een bovenliggende branch zijn gedefinieerd, worden niet gedupliceerd op de onderliggende branches. Lakebase verwijdert ze uit een kindbranch voordat de compute van die branch begint, dus twee computes repliceren niet hetzelfde abonnement. Dit geldt wanneer je een onderliggende branch aanmaakt, reset of herstelt. Maak het abonnement opnieuw aan op de child branch als je daar replicatie nodig hebt.
Het verwijderen van een abonneedatabase laat de sleuf op de publisher behouden
Wanneer je een database verwijdert met abonnementen via de Lakebase App, Databricks CLI of REST API, verwijdert Lakebase die abonnementen eerst, maar verwijdert het hun replicatieslots niet op de publisher. Elke slot blijft bij de uitgever en blijft WAL vasthouden, wat de opslag van de uitgever kan vullen. Bij een migratie is de publisher vaak je productiedatabase.
Een SQL-commando DROP DATABASE gedraagt zich zoals in standaard Postgres: het faalt met database "<name>" is being used by logical replication subscription terwijl de database abonnementen heeft.
Om te voorkomen dat je een slot achterlaat, kun je elk abonnement verwijderen voordat je de database verwijdert. Wanneer de uitgever bereikbaar is, DROP SUBSCRIPTION verwijdert ook de slot op de uitgever. Zie Het verwijderen van een abonnement of publicatie.
Als je de database al hebt verwijderd, verwijder dan het overgebleven slot bij de publisher. Standaard heeft het slot van een abonnement dezelfde naam als het abonnement. Als je bij het maken van het abonnement slot_name hebt ingesteld, gebruik dan die naam in plaats daarvan. Om de slotnamen vast te leggen voordat je een database verwijdert, voer SELECT subname, subslotname FROM pg_catalog.pg_subscription; uit in die database. Bevestig dat het slot bestaat en inactief is:
SELECT slot_name, database, plugin, active
FROM pg_catalog.pg_replication_slots
WHERE slot_type = 'logical' AND slot_name = '<slot_name>';
Verwijder alleen het slot dat bij het verwijderde abonnement hoorde. Andere inactieve slots kunnen toebehoren aan abonnees of change-data-capturetools die tijdelijk zijn losgekoppeld, en het verwijderen ervan breekt hun replicatie. Sleep naar de sleuf:
SELECT pg_catalog.pg_drop_replication_slot('<slot_name>');
Replicatierollen
Een toegewijde replicatierol moet het REPLICATION attribuut hebben. Rollen die zijn aangemaakt in de Lakebase App, Azure Databricks CLI of REST API hebben deze attribuut, ongeacht of ze lid zijn van databricks_superuser. Rollen die met SQL zijn aangemaakt, ontvangen het REPLICATION attribuut niet automatisch. Om er een met SQL te maken, voeg je het attribuut toe, bijvoorbeeld CREATE ROLE replication_user WITH LOGIN REPLICATION PASSWORD '<password>';. Om het toe te voegen aan een bestaande rol, voer ALTER ROLE <role_name> REPLICATION; uit. Beide statements vereisen een rol die de CREATEROLE en REPLICATION attributen heeft, zoals de rol van de projecteigenaar.
Controleer de privileges van een rol:
SELECT rolname, rolreplication
FROM pg_catalog.pg_roles
WHERE rolname = '<role_name>';
decoderplugins
Lakebase ondersteunt twee logische decoderende uitvoer-plugins:
-
pgoutput: de ingebouwde Postgres logische replicatie-plugin, en is de standaard. Gebruik het voor standaard Postgres-naar-Postgres replicatie. -
wal2json: geeft WAL-wijzigingen als JSON uit, voor systemen die wijzigingsdata in JSON verbruiken.
Publisher-instellingen
Op Lakebase zijn max_wal_senders en max_replication_slots beide ingesteld op 10:
max_wal_senders = 10
max_replication_slots = 10
max_wal_senders beperkt de gelijktijdige WAL-zenderprocessen die wijzigingen naar abonnees streamen, en max_replication_slots beperkt de replicatieslots die de voortgang van abonnees volgen. Plan voor één van elk per abonnee. Neem contact op met Databricks om verschillende waarden aan te vragen.
Maak een speciaal replicatieslot aan
Sommige dataservices vereisen een replicatieslot die je van tevoren aanmaakt. Maak er een aan met de standaard Postgres-functie, waarbij je de decoder-plugin een naam geeft:
SELECT pg_catalog.pg_create_logical_replication_slot('my_replication_slot', 'pgoutput');
Verwijder een abonnement of publicatie
Verwijder een abonnement van de abonnee wanneer je het niet meer nodig hebt. Wanneer de uitgever bereikbaar is, wordt het abonnement verwijderd, wordt de verbinding met de uitgever verbroken en wordt het replicatieslot op de uitgever verwijderd. Gerepliceerde gegevens blijven in de abonneedatabase.
DROP SUBSCRIPTION my_subscription;
Als de uitgever onbereikbaar is, wordt DROP SUBSCRIPTION niet voltooid omdat het niet kan verbinden om de externe sleuf te verwijderen. Maak eerst de koppeling met het slot los en beëindig daarna het abonnement:
ALTER SUBSCRIPTION my_subscription DISABLE;
ALTER SUBSCRIPTION my_subscription SET (slot_name = NONE);
DROP SUBSCRIPTION my_subscription;
In dit geval blijft het replicatieslot op de publisher en blijft WAL behouden. Verwijder het op de uitgever om de WAL vrij te geven:
SELECT pg_catalog.pg_drop_replication_slot('<slot_name>');
Sleep een publicatie naar de uitgever:
DROP PUBLICATION my_publication;
Troubleshooting
| Symptoom | Oorzaak en oplossing |
|---|---|
| De subscription maakt geen verbinding. | Bevestig dat de uitgever bereikbaar is en dat de verbindingsreeks, rol en wachtwoord correct zijn. Wanneer Lakebase de subscriber is, bevestig dan dat het publisher-endpoint op de toestaanlijst van het netwerkbeleid van het account staat. Zie Data repliceren in Lakebase. |
| Een abonnement op een andere Lakebase-database hangt vast en maakt geen verbinding. | Replicatie tussen Lakebase-databases in dezelfde regio wordt niet ondersteund. De bron en het doel moeten zich in verschillende regio's bevinden. Zie Beperkingen. |
CREATE SUBSCRIPTION faalt met restricted by Account Network Policies. |
Voor je account geldt een netwerkbeleid en de host van de uitgever bevindt zich niet in de toegestane internetbestemmingen. Voeg de host toe aan het netwerkbeleid van het account. Zie Data repliceren in Lakebase. |
| Opslag groeit en wordt niet vrijgegeven. | Een replicatieslot behoudt WAL omdat de subscriber geen wijzigingen consumeert. Als het niet wordt opgelost, kan de uitgever zonder opslagruimte komen te zitten. Controleer de behouden WAL, sluit dan de subscriber weer aan of verwijder de slot. Opslag wordt pas vrijgegeven nadat de publisher WAL heeft gerecycled. Zie Replicatieslots en opslag. |
| Rijen komen niet aan bij de subscriber. | Bevestig dat de doeltabellen bestaan met overeenkomende namen en kolommen, en dat de publicatie de tabellen bevat die je verwacht. |
Volgende stappen
- Migreren naar Lakebase: Repliceer een bestaande Postgres-database in Lakebase. Zie Data repliceren in Lakebase.
- Stream vanaf Lakebase: Publiceer wijzigingen naar een externe Postgres-abonnee. Zie Gegevens van Lakebase repliceren.
- Begrijp de functie: Bekijk wat logische replicatie is en wanneer je het moet gebruiken. Zie Logische replicatie.