Repliceren van data naar Lakebase

Deze gids laat zien hoe je data uit een externe Postgres-database kunt repliceren naar Lakebase met behulp van logische replicatie. Lakebase fungeert als subscriber: het maakt verbinding met je brondatabase, kopieert de bestaande data en past doorlopende wijzigingen toe totdat je overschakelt. Gebruik dit om een database te migreren van een andere Postgres-provider, zoals Amazon Aurora PostgreSQL of Amazon RDS voor PostgreSQL, of van een zelfbeheerde Postgres-server naar Lakebase.

Voorwaarden

  • Een bron-Postgres-database met een openbaar eindpunt dat Lakebase kan bereiken.
  • Superuser-toegang op de brondatabase, of het beheerdersaccount op een beheerde Postgres-dienst. Het instellen van wal_level, het aanmaken van een rol met het REPLICATION-attribuut en het aanmaken van een publicatie vereisen allemaal dit toegangsniveau.
  • Een Lakebase-project voor de doeldatabase.
  • Een Lakebase Postgres-rol om het abonnement aan te maken: een lid van de databricks_superuser rol, of een rol waaraan de vooraf gedefinieerde rol pg_create_subscription is verleend. Zie Postgres-rollen maken.

Logische replicatie wordt ondersteund in Lakebase. Er is geen stap per project om het aan te zetten. Als abonnee is een wal_level wijziging door Lakebase niet vereist. Alleen de bronuitgever heeft wal_level = logical nodig.

Bereid de brondatabase voor

Zet in je bron-Postgres-database het write-ahead log op logical en bevestig dat er capaciteit is voor replicatie. Het volgende voorbeeld geldt voor zelfbeheerde Postgres. Je beheerde Postgres-provider kan andere instellingen gebruiken:

ALTER SYSTEM SET wal_level = logical;
ALTER SYSTEM SET max_wal_senders = 10;
ALTER SYSTEM SET max_replication_slots = 10;

Herstart de brondatabase zodat de wal_level wijziging van kracht wordt. Op een beheerde dienst gebruik je de parametergroep of vlaggen van de provider om wal_level op logical in te stellen. Stel bijvoorbeeld in Amazon Aurora PostgreSQL rds.logical_replication in op 1 in de parametergroep van het DB-cluster en start het cluster opnieuw op. Op Amazon RDS voor PostgreSQL stel je dezelfde parameter in in de databaseparametergroep en start je de instantie opnieuw op.

Maak een rol aan voor replicatie en verleen deze leestoegang tot de tabellen die je repliceert:

CREATE ROLE replication_user WITH REPLICATION LOGIN PASSWORD '<password>';
GRANT USAGE ON SCHEMA public TO replication_user;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO replication_user;

Deze CREATE ROLE statement werkt zoals geschreven op een zelfbeheerde Postgres-server. Sommige beheerde Postgres-providers staan het REPLICATION attribuut niet direct toe en verlenen in plaats daarvan replicatie-toegang via een provider-specifieke rol. Als je bron op een beheerde dienst draait, volg dan de documentatie van de provider om de rol replicatie-toegang te geven, en gebruik die rol vervolgens in plaats van replication_user in de volgende stappen. Bijvoorbeeld, op Amazon Aurora PostgreSQL en Amazon RDS voor PostgreSQL, maak je de rol zonder WITH REPLICATION aan en voer daarna GRANT rds_replication TO replication_user uit.

Maak een publicatie voor de tabellen die je wilt repliceren. Elke tabel moet een PRIMARY KEY hebben of een replica-identiteit ingesteld hebben. Zie Replica-identiteit in de Postgres-documentatie.

CREATE PUBLICATION my_publication FOR TABLE orders, customers;

Laat Lakebase de bron bereiken

Als subscriber belt Lakebase uit naar je brondatabase. Deze uitgaande verbinding wordt beheerst door het netwerkbeleid van je account, dat de internetbestemmingen beheert die serverless workloads kunnen bereiken. Het wordt niet bestuurd door een Lakebase-projectinstelling of een rol in de database.

Of je een wijziging moet doorvoeren, hangt af van of je account een netwerkbeleid afdwingt:

  • Geen actief netwerkbeleid: Lakebase kan elke uitgever bereiken die een bereikbaar openbaar eindpunt heeft. Er is geen wijziging nodig.
  • Een actief netwerkbeleid: voeg de host van de brondatabase toe aan de toegestane internetbestemmingen in het accountnetwerkbeleid. Zie Netwerkbeleid beheren. Als de host niet is toegestaan, wordt het abonnement geweigerd wanneer je het aanmaakt. Zie Probleemoplossing.

Private Link wordt niet ondersteund voor de abonneeverbinding. De brondatabase moet bereikbaar zijn via het publieke eindpunt.

Maak de doeltabellen aan

Logische replicatie kopieert data, niet schema. Maak de tabellen aan in de doel-Lakebase-database met dezelfde namen en kolommen als de bron voordat je begint met replicatie. Je kunt ze handmatig aanmaken, of het schema uit de bron dumpen en in Lakebase laden. Zie alleen het schema dumpen.

Maak lege doeltabellen aan. De initiële tabelkopie faalt bij dubbele sleutels of constraints-overtredingen als een doeltabel al rijen bevat.

Maak het abonnement aan

Maak verbinding met de doel-Lakebase-database als een rol die abonnementen kan aanmaken (zie Vereisten), en maak vervolgens een abonnement aan dat verbinding maakt met de bronuitgever:

CREATE SUBSCRIPTION my_subscription
CONNECTION 'host=<source-host> port=5432 dbname=<source-db> user=replication_user password=<password> sslmode=verify-full sslrootcert=system'
PUBLICATION my_publication;

Het aanmaken van het abonnement start een replicatieslot op de bronuitgever, kopieert de bestaande rijen en streamt vervolgens lopende wijzigingen.

Warning

Het replicatieslot zorgt ervoor dat de brondatabase write-ahead log (WAL) behoudt totdat Lakebase bevestigt dat het de wijzigingen heeft ontvangen. Als het abonnement stopt met het consumeren van wijzigingen, bijvoorbeeld omdat het is uitgeschakeld, losgekoppeld of faalt, stapelt WAL zich onbeperkt op de bronserver. Bij een productiebron kan dit de opslag van de bron vullen en een storing veroorzaken.

Terwijl de replicatie draait, houd je in de gaten hoeveel WAL het slot op de bron vasthoudt:

SELECT slot_name, active,
       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;

Om het risico op een zelfbeheerde bron te beperken, stel max_slot_wal_keep_size in om te beperken hoeveel WAL een slot kan vasthouden. Als een slot de limiet overschrijdt, maakt Postgres deze ongeldig en moet de subscription opnieuw worden aangemaakt. Beëindig het abonnement zodra je de migratie hebt afgerond. Zie Replicatieslots en opslag.

Note

Wanneer Lakebase zich abonneert, maakt het verbinding met je brondatabase en stuurt de inloggegevens van de replicatierol naar die database. sslmode=verify-full Met sslrootcert=system versleutelt de verbinding en verifieert de identiteit van de bron, wat de doorgegeven aanmeldingsgegevens beschermt tegen een man-in-the-middle. Het werkt wanneer je bron gebruikmaakt van een publiek vertrouwde certificaatautoriteit. De zwakkere variant sslmode=require versleutelt maar verifieert de bron niet. Het verifiëren van een bron die een private certificaatautoriteit gebruikt, wordt niet ondersteund.

Verifieer replicatie

Bevestig in de doel-Lakebase-database dat de bestaande rijen zijn aangekomen:

SELECT COUNT(*) FROM orders;

Voeg een rij in of werk een rij bij op de bron, en voer vervolgens opnieuw een query uit op het doel. De verandering verschijnt binnen enkele seconden op Lakebase.

Monitor en overschakelen

Houd de eerste kopie en de voortdurende vertraging bij:

SELECT subname, received_lsn, latest_end_lsn, last_msg_receipt_time
FROM pg_catalog.pg_stat_subscription;

Om te bevestigen dat de eerste kopie klaar is, voer je de per-tabel synchronisatiestatusquery uit in Monitor replication op de abonnee en wacht tot elke tabel Ready (fully live) aangeeft.

Wanneer het doel gelijkgelopen is, stop je de schrijfacties op de bron, bevestig dat het doel volledig actueel is en schakel je applicatie over naar de Lakebase-verbindingsdetails.

Logische replicatie kopieert geen sequentiewaarden of identiteitstellers. Voordat je de schrijfbewerkingen op Lakebase hervat, reset elke doelsequentie om overeen te komen met de gerepliceerde data, of nieuwe inserts in SERIAL of identiteitskolommen kunnen dubbele primaire sleutels genereren:

SELECT pg_catalog.setval(pg_catalog.pg_get_serial_sequence('orders', 'id'), (SELECT MAX(id) FROM orders));

Nadat je applicatie tegen Lakebase draait, verwijder je het abonnement om te stoppen met repliceren vanaf de bron. Wanneer de bron bereikbaar is, verwijdert het beëindigen van het abonnement ook het replicatieslot erop. Zie Het verwijderen van een abonnement of publicatie.

Voor monitoren en opruimen, zie Logische replicatie beheren en monitoren.

Volgende stappen