Hantera och övervaka logisk replikering

Den här sidan beskriver hur man övervakar logisk replikation i Lakebase, hur replikering interagerar med nedskalning till noll och brancher, samt hur man löser vanliga problem. För installation, se Replikera data till Lakebase och Replikera data från Lakebase.

Övervaka replikering

Vilken Postgres-roll som helst kan fråga replikationskatalogerna på denna sida, med två undantag. Kolumnen subconninfo i pg_subscription kan innehålla anslutningslösenordet och är begränsad, så välj specifika kolumner istället för att använda SELECT *. I pg_stat_replication är de flesta kolumner dolda om inte din roll har pg_read_all_stats, som medlemmar i databricks_superuser har.

Hos en abonnent bekräftar du att prenumerationen finns och är aktiverad:

SELECT subname, subenabled FROM pg_catalog.pg_subscription;

För en utgivare, bekräfta att publikationen existerar:

SELECT pubname FROM pg_catalog.pg_publication;

Kontrollera synkroniseringsstatusen per tabell på prenumeranten. När varje tabell visar Ready (fully live), är den initiala kopian klar och prenumerationen strömmar:

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;

Kontrollera prenumerationsstatus och fördröjning:

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

Jämför radantal på publiceraren och prenumeranten för att bekräfta att en tabell är synkroniserad:

SELECT COUNT(*) FROM public.playing_with_lakebase;

På en publicerare, lista replikationsslotar och hur långt varje har kommit fram:

SELECT slot_name, slot_type, active, restart_lsn
FROM pg_catalog.pg_replication_slots;

På Lakebase inkluderar resultaten även de interna fysiska slotarna wal_proposer_slot och wal_retention_slot. Lakebase hanterar dessa slotar, och de är inte en del av logisk replikation.

Logisk replikation och skalning till noll

En Lakebase compute med en aktiv abonnent skalar inte till noll, vilket kan öka compute-användningen.

Kontrollera aktiva prenumeranter:

SELECT *
FROM pg_catalog.pg_stat_replication
WHERE application_name <> 'walproposer';

replikeringsplatser och lagring

En replikeringsslot gör att publiceraren behåller write-ahead log (WAL) tills prenumeranten bekräftar att de har mottagit ändringarna. Om abonnenten slutar konsumera ändringar, till exempel för att den är inaktiverad, frånkopplad, misslyckas eller halkar efter, ackumuleras WAL på utgivaren. Detta är den vanligaste orsaken till allvarliga problem med logisk replikation:

  • Förlaget kan få slut på lagringsutrymme. Retained WAL växer tills utgivarnodens lagring är full, vilket kan stoppa databasen från att acceptera skrivningar och orsaka avbrott.
  • Att släppa sloten frigör inte lagringsutrymme omedelbart. Postgres tar bort den behållna WAL endast när WAL-segment återanvänds vid en senare kontrollpunkt. Om utgivaren redan har slut på lagringsutrymme kanske återställningen inte kan slutföras.
  • Risken gäller även externa förlag. När Lakebase prenumererar på en extern databas ackumuleras WAL på den externa källan om prenumerationen slutar konsumera ändringar.

Övervaka kvarhållen WAL

På publiceraren, kontrollera hur mycket WAL varje logisk slot behåller och om den är aktiv:

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';

Kör den här frågan regelbundet medan replikeringen är aktiv. Undersök när retained_wal fortsätter att växa eller active är false. Ett extended på wal_status betyder att platsen behåller mer WAL än vad publiceraren normalt behåller. wal_status av unreserved eller lost betyder att sloten har överskridit max_slot_wal_keep_size och förlorar, eller har förlorat, WAL som den behöver, så prenumerationen måste återskapas.

Återställ efter WAL-ansamling

  1. Hitta sloten som behåller WAL med frågan i Monitor retained WAL.

  2. Om abonnenten kan återhämta sig, åtgärda orsaken, som ett nätverksproblem, en avstängd prenumeration eller ett misslyckat tillämpningsförsök, så att abonnenten hinner ikapp och slotten avancerar.

  3. Om du inte längre behöver prenumerationen, släpp den på prenumeranten. Om prenumeranten är otillgänglig, släpp sloten direkt på publiceraren. En slot måste vara inaktiv innan du kan släppa den:

    SELECT pg_catalog.pg_drop_replication_slot('<slot_name>');
    
  4. Vänta på att utgivaren återvinner den kvarhållna WAL. På en självhanterad publisher som är nära att få slut på lagring, lägg till lagring först så att rensningen kan genomföras.

Automatisk borttagning av inaktiva slots på Lakebase

När Lakebase är publicerare tar den automatiskt bort en replikeringsslot som varit inaktiv i cirka 40 timmar, för att förhindra att sloten behåller WAL på obestämd tid. En slot blir inaktiv när dess prenumerant slutar konsumera ändringar och sloten slutar föras framåt. Detta kan hända när en abonnent inaktiveras eller blir otillgänglig, eller när en abonnent konfigureras med lång replikationsfördröjning.

För att förhindra att en slot tas bort, se till att dess prenumerant är ansluten och fortsätter att ta emot ändringar. Om abonnenten använder en konfigurerbar replikationsfördröjning eller frekvens, håll den under 40 timmar så att sloten fortsätter att avancera. Om en slot tas bort och du fortfarande behöver den, skapa om prenumerationen på subscriber.

Externa utgivare tar inte automatiskt bort inaktiva slotar. På en självhanterad publisher anger du max_slot_wal_keep_size för att begränsa hur mycket WAL en replikeringsslot kan behålla. Om en slot överskrider gränsen ogiltigförklarar Postgres den och du måste skapa prenumerationen igen.

Branch restore tar bort replication slots

Att återställa en gren tar bort alla replikeringsslotar på den grenen. Skapa om publikationer och prenumerationer efter en grenåterställning.

Barngrenar ärver inte prenumerationer

Prenumerationer definierade på en modergren dupliceras inte på dess undergrenar. Lakebase tar bort dem från en underordnad gren innan den grenens compute startar, så att två computes inte replikerar samma prenumeration. Detta gäller när du skapar, återställer eller återskapar en undergren. Återskapa prenumerationen på undergrenen om du behöver replikering där.

Att ta bort en databas tar bort dess prenumerationer

Innan en databas tas bort som svar på ett DROP DATABASE kommando eller en operation, tar Lakebase bort alla logiska replikeringsprenumerationer som definierats i den databasen.

Replikationsroller

En dedikerad replikationsroll måste ha attributet REPLICATION . Roller skapade i Lakebase-appen, Azure Databricks CLI eller REST API har detta attribut, oavsett om de är medlemmar i databricks_superuser. Roller som skapas med SQL får inte attributet REPLICATION automatiskt. För att skapa en med SQL, inkludera attributet, till exempel CREATE ROLE replication_user WITH LOGIN REPLICATION PASSWORD '<password>';. För att lägga till det i en befintlig roll, kör ALTER ROLE <role_name> REPLICATION;. Båda formuleringarna kräver en roll som har CREATEROLE och REPLICATION attributen, såsom projektägarens roll.

Kontrollera en rolls privilegier:

SELECT rolname, rolreplication
FROM pg_catalog.pg_roles
WHERE rolname = '<role_name>';

decoderplugins

Lakebase stöder två logiska avkodningsplugins:

  • pgoutput: det inbyggda Postgres logiska replikeringspluginet, och standardalternativet. Använd det för standardreplikering från Postgres till Postgres.
  • wal2json: ger WAL-ändringar som JSON, för system som konsumerar ändringsdata i JSON.

Publisher-inställningar

På Lakebase är både max_wal_senders och max_replication_slots satta till 10:

max_wal_senders = 10
max_replication_slots = 10

max_wal_senders begränsar samtidiga WAL-sändarprocesser som strömmar ändringar till abonnenter, och max_replication_slots begränsar replikeringsslotarna som spårar abonnenternas framsteg. Plan för en av varje per abonnent. För att begära olika värden, kontakta Databricks.

Skapa en dedikerad replikeringsslot

Vissa datatjänster kräver en replikeringsslot som du skapar i förväg. Skapa en med den standardiserade Postgres-funktionen och namnge avkodarpluginet:

SELECT pg_catalog.pg_create_logical_replication_slot('my_replication_slot', 'pgoutput');

Ta bort en prenumeration eller publikation

Ta bort en prenumeration på prenumeranten när du inte längre behöver den. När utgivaren är nåbar kopplas anslutningen till utgivaren från när prenumerationen tas bort och replikeringsslotten på utgivaren tas bort. Replikerad data finns kvar i abonnentdatabasen.

DROP SUBSCRIPTION my_subscription;

Om publiceraren är ouppnåelig slutförs DROP SUBSCRIPTION inte eftersom den inte kan ansluta för att ta bort fjärrslotten. Koppla bort sloten först och avsluta sedan prenumerationen:

ALTER SUBSCRIPTION my_subscription DISABLE;
ALTER SUBSCRIPTION my_subscription SET (slot_name = NONE);
DROP SUBSCRIPTION my_subscription;

I detta fall förblir replikeringsslotten hos publiceraren och behåller fortfarande WAL. Ta bort den på utgivaren för att frigöra WAL:

SELECT pg_catalog.pg_drop_replication_slot('<slot_name>');

Släpp en publikation på utgivaren:

DROP PUBLICATION my_publication;

Troubleshooting

Symtom Orsak och lösning
Prenumerationen ansluter inte. Bekräfta att utgivaren är nåbar och att reťazec pripojenia, roll och lösenord är korrekta. När Lakebase är prenumerant, bekräfta att utgivarens endpoint finns på kontots nätverkspolicy-allowlist. Se Replikera data till Lakebase.
En prenumeration på en annan Lakebase-databas hänger och kopplas inte upp. Replikering mellan Lakebase-databaser i samma region stöds inte. Källan och målet måste vara i olika regioner. Se Begränsningar.
CREATE SUBSCRIPTION misslyckas vid restricted by Account Network Policies. Ditt konto tillämpar en nätverkspolicy och utgivarvärden finns inte bland de tillåtna internetdestinationerna. Lägg till värd i kontots nätverkspolicy. Se Replikera data till Lakebase.
Lagringen växer och frigörs inte. En replikeringsslot behåller WAL eftersom dess abonnent inte konsumerar ändringarna. Om det lämnas oavklarat kan publiceraren få slut på lagringsutrymme. Kontrollera kvarhållen WAL, koppla sedan in prenumeranten igen eller ta bort sloten. Storage släpps först efter att publiceraren återanvänt WAL. Se Replikationsplatser och lagring.
Raderna kommer inte till prenumeranten. Bekräfta att måltabellerna finns med matchande namn och kolumner, och att publiceringen innehåller de tabeller du förväntar dig.

Nästa steg