Zarządzanie i monitorowanie replikacji logicznej

Ta strona opisuje, jak monitorować logiczną replikację w Lakebase, jak replikacja oddziałuje na skalowanie do zera i rozgałęzienia, a także jak rozwiązywać typowe problemy. Aby uzyskać konfigurację, zobacz: Replikuj dane do Lakebase oraz Replikuj dane z Lakebase.

Monitorowanie replikacji

Każda rola Postgres może wykonywać zapytania do katalogów replikacji na tej stronie, z dwoma wyjątkami. Kolumna subconninfo elementu pg_subscription może zawierać hasło do połączenia i jest ograniczona, więc wybierz konkretne kolumny zamiast używać SELECT *. W pg_stat_replication, większość kolumn jest ukryta, chyba że twoja rola ma pg_read_all_stats, które mają członkowie databricks_superuser.

U subskrybenta potwierdź, że subskrypcja istnieje i jest włączona:

SELECT subname, subenabled FROM pg_catalog.pg_subscription;

U wydawcy potwierdź, że publikacja istnieje:

SELECT pubname FROM pg_catalog.pg_publication;

Sprawdź status synchronizacji poszczególnych tabel na subskrybencie. Gdy przy każdej tabeli widnieje Ready (fully live), początkowa kopia jest gotowa, a subskrypcja jest przesyłana strumieniowo:

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;

Sprawdź status subskrypcji i opóźnienie:

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

Porównaj liczbę wierszy u wydawcy i subskrybenta, aby potwierdzić, że tabela jest zsynchronizowana:

SELECT COUNT(*) FROM public.playing_with_lakebase;

Na wydawcy wypisz sloty replikacyjne i jak daleko każdy z nich się rozwinął:

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

Na Lakebase wyniki obejmują także wewnętrzne fizyczne sloty wal_proposer_slot oraz wal_retention_slot. Lakebase zarządza tymi slotami, a nie są one częścią replikacji logicznej.

Replikacja logiczna i skalowanie do zera

Instancja compute Lakebase z aktywnym abonentem nie skaluje się do zera, co może zwiększyć użycie compute.

Wyszukaj aktywnych subskrybentów:

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

Sloty replikacyjne i pamięć masowa

Slot replikacyjny pozwala publisherowi zachować write-ahead log (WAL) do momentu potwierdzenia przez subskrybenta otrzymania zmian. Jeśli subskrybent przestanie konsumować zmiany, na przykład dlatego, że jest wyłączony, rozłączony, nie działa poprawnie lub jest opóźniony, WAL gromadzi się na publisherze. To najczęstsza przyczyna poważnych problemów z replikacją logiczną:

  • Wydawcy może zabraknąć miejsca na dane. Zachowany WAL rośnie, aż magazyn publikującego jest pełny, co może uniemożliwić bazie danych przyjmowanie zapisów i spowodować awarię.
  • Usunięcie slotu nie zwalnia od razu miejsca. Postgres usuwa zachowany WAL tylko wtedy, gdy w późniejszym punkcie kontrolnym recyklinguje segmenty WAL. Jeśli wydawcy już zabrakło miejsca, recykling może nie zostać ukończony.
  • Ryzyko dotyczy także zewnętrznych wydawców. Gdy Lakebase subskrybuje zmiany z zewnętrznej bazy danych, WAL kumuluje się na tym zewnętrznym źródle, jeśli subskrypcja przestaje odbierać zmiany.

Monitor zatrzymanego WAL

Na wydawcy sprawdź, ile WAL zachowuje każdy slot logiczny i czy jest aktywny:

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

Uruchamiaj to zapytanie regularnie, gdy replikacja jest aktywna. Sprawdź, kiedy active nadal rośnie lub retained_wal jest false. wal_status z extended oznacza, że slot zatrzymuje więcej WAL, niż wydawca zwykle utrzymuje. Wystąpienie unreserved lub lost oznacza, że slot przekroczył max_slot_wal_keep_size i traci lub stracił potrzebny WAL, więc subskrypcja musi zostać odtworzona.

Odzyskaj po nagromadzeniu WAL

  1. Znajdź slot, który utrzymuje WAL, za pomocą zapytania w Monitor retained WAL.

  2. Jeśli subskrybent może odzyskać sprawność, napraw przyczynę, na przykład problem z siecią, wyłączoną subskrypcję lub nieudaną operację apply, aby nadrobił zaległości i slot przesunął się do przodu.

  3. Jeśli już nie potrzebujesz subskrypcji, upuść ją na subskrybenta. Jeśli subskrybent jest nieosiągalny, odrzuć slot bezpośrednio po stronie wydawcy. Slot musi być nieaktywny, zanim można go upuścić:

    SELECT pg_catalog.pg_drop_replication_slot('<slot_name>');
    
  4. Poczekaj, aż publikujący przetworzy ponownie zachowane WAL. W samozarządzającym się publikatorze, który jest bliski wyczerpania miejsca, najpierw dodaj magazyn danych, aby odzyskiwanie mogło się zakończyć.

Automatyczne usuwanie nieaktywnych slotów na Lakebase

Gdy wydawcą jest Lakebase, automatycznie usuwa slot replikacyjny, który był nieaktywny przez około 40 godzin, aby zapobiec zatrzymywaniu danych WAL przez czas nieokreślony. Slot staje się nieaktywny, gdy jego subskrybent przestaje pobierać zmiany, a slot przestaje się przesuwać. Może się to zdarzyć, gdy abonent zostaje dezaktywowany lub staje się niedostępny, albo gdy abonent jest skonfigurowany z długim opóźnieniem replikacji.

Aby zapobiec usunięciu slotu, upewnij się, że jego subskrybent pozostaje połączony i konsumuje zmiany. Jeśli subskrybent używa konfigurowalnego opóźnienia replikacyjnego lub konfigurowalnej częstotliwości, utrzymuj to poniżej 40 godzin, aby slot mógł się przesuwać. Jeśli slot zostanie usunięty, a nadal go potrzebujesz, odtwórz subskrypcję na subskrybencie.

Zewnętrzni wydawcy nie usuwają automatycznie nieaktywnych slotów. Na samodzielnie zarządzanym wydawcy ustaw max_slot_wal_keep_size, aby ograniczyć ilość WAL, jaką może przechowywać slot. Jeśli slot przekroczy limit, Postgres go unieważnia i musisz ponownie utworzyć subskrypcję.

Przywracanie gałęzi usuwa sloty replikacyjne

Przywrócenie gałęzi usuwa wszystkie sloty replikacyjne na tej gałęzi. Odtwórz publikacje i subskrypcje po przywróceniu gałęzi.

Gałęzie potomne nie dziedziczą subskrypcji

Subskrypcje zdefiniowane na gałęzi nadrzędnej nie są duplikowane na jej gałęziach potomnych. Lakebase usuwa je z gałęzi potomnej, zanim rozpocznie się przetwarzanie tej gałęzi, więc dwa obliczenia nie replikują tej samej subskrypcji. Dotyczy to także tworzenia, resetowania lub przywracania gałęzi podrzędnej. Utwórz subskrypcję ponownie na gałęzi podrzędnej, jeśli potrzebujesz tam replikacji.

Usunięcie bazy subskrybenta pozostawia slot na publisherze

Gdy usuniesz bazę danych, która ma subskrypcje korzystające z aplikacji Lakebase, Databricks CLI lub REST API, Lakebase najpierw usuwa te subskrypcje, ale nie usuwa ich slotów replikacyjnych na serwerze publikującym. Każdy slot pozostaje na publikującym serwerze i nadal zatrzymuje WAL, co może zapełnić miejsce na dysku publikującego serwera. Podczas migracji publikujący często jest Twoją bazą produkcyjną.

Polecenie SQL DROP DATABASE zachowuje się jak w standardowym Postgresie: kończy się błędem database "<name>" is being used by logical replication subscription, gdy baza danych ma subskrypcje.

Aby nie zostawić slotu, usuń każdą subskrypcję przed usunięciem bazy danych. Gdy wydawca jest osiągalny, DROP SUBSCRIPTION usuwa też slot u wydawcy. Zobacz Usuń subskrypcję lub publikację.

Jeśli już usunąłeś bazę danych, usuń pozostały slot na wydawcy. Domyślnie slot subskrypcji ma tę samą nazwę co subskrypcja. Jeśli ustawiłeś slot_name to przy tworzeniu subskrypcji, użyj tej nazwy. Aby zarejestrować nazwy slotów przed usunięciem bazy danych, uruchom SELECT subname, subslotname FROM pg_catalog.pg_subscription; w tej bazie. Potwierdź, że slot istnieje i jest nieaktywny:

SELECT slot_name, database, plugin, active
FROM pg_catalog.pg_replication_slots
WHERE slot_type = 'logical' AND slot_name = '<slot_name>';

Usuń przypisanie tylko tego slotu, który należał do usuniętej subskrypcji. Inne nieaktywne sloty mogą należeć do subskrybentów lub narzędzi do przechwytywania zmian w danych, które są tymczasowo odłączone, a ich usunięcie zakłóca ich replikację. Upuść slot:

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

Role replikacji

Dedykowana rola replikacji musi posiadać atrybut REPLICATION. Role utworzone w aplikacji Lakebase, Azure Databricks CLI lub interfejsie API REST mają ten atrybut, niezależnie od tego, czy są członkami databricks_superuser. role utworzone za pomocą SQL nie otrzymują tego atrybutu REPLICATION automatycznie. Aby utworzyć taki element za pomocą SQL, dołącz atrybut, na przykład CREATE ROLE replication_user WITH LOGIN REPLICATION PASSWORD '<password>';. Aby dodać go do istniejącej roli, uruchom ALTER ROLE <role_name> REPLICATION;. Oba stwierdzenia wymagają roli, która posiada atrybuty CREATEROLE i REPLICATION , na przykład rolę właściciela projektu.

Sprawdź uprawnienia danej roli:

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

Wtyczki dekodujące

Lakebase obsługuje dwie wtyczki wyjściowe do dekodowania logicznego:

  • pgoutput: wbudowana wtyczka do logicznej replikacji Postgresa i jest domyślną wtyczką. Użyj go do standardowej replikacji Postgres do Postgresa.
  • wal2json: generuje zmiany WAL jako JSON, dla systemów przetwarzających dane o zmianach w formacie JSON.

Ustawienia wydawcy

Na Lakebase max_wal_senders i max_replication_slots oba są ustawione na 10:

max_wal_senders = 10
max_replication_slots = 10

max_wal_senders ogranicza jednoczesne procesy nadawcze WAL, które przesyłają zmiany do subskrybentów, oraz max_replication_slots ogranicza sloty replikacyjne śledzące postępy subskrybentów. Zaplanuj po jednym z każdego dla każdego subskrybenta. Aby zażądać różnych wartości, skontaktuj się z Databricks.

Stwórz dedykowany slot replikacyjny

Niektóre usługi danych wymagają slotu replikacyjnego, który należy utworzyć wcześniej. Stwórz taki za pomocą standardowej funkcji Postgres, nazywając wtyczkę dekodera:

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

Usuń subskrypcję lub publikację

Usuń subskrypcję subskrybentowi, gdy już jej nie potrzebujesz. Gdy wydawca jest osiągalny, rezygnacja z subskrypcji powoduje rozłączenie się z wydawcą i usunięcie slotu replikacyjnego na wydawcy. Zreplikowane dane pozostają w bazie danych abonenta.

DROP SUBSCRIPTION my_subscription;

Jeśli wydawca jest nieosiągalny, DROP SUBSCRIPTION nie kończy pracy, ponieważ nie może się połączyć, aby usunąć zdalny slot. Najpierw usuń skojarzenie slotu, a potem zrezygnuj z subskrypcji:

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

W tym przypadku slot replikacyjny pozostaje u wydawcy i nadal przechowuje pliki WAL. Usuń to na wydawcy, aby zwolnić WAL:

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

Przeciągnij publikację do wydawcy:

DROP PUBLICATION my_publication;

Troubleshooting

Objaw Przyczyna i rozwiązanie
Subskrypcja się nie łączy. Potwierdź, że wydawca jest dostępny oraz że parametry połączenia, rola i hasło są poprawne. Gdy Lakebase jest subskrybentem, upewnij się, że endpoint wydawcy znajduje się na liście dozwolonych adresów w zasadach sieciowych konta. Zobacz Replikuj dane do Lakebase.
Subskrypcja innej bazy danych Lakebase zawiesza się i nie łączy się. Replikacja między bazami Lakebase w tym samym regionie nie jest obsługiwana. Źródło i cel muszą znajdować się w różnych regionach. Zobacz Ograniczenia.
CREATE SUBSCRIPTION kończy się niepowodzeniem z restricted by Account Network Policies. Na Twoim koncie obowiązuje polityka sieciowa, a host publisher nie znajduje się w dozwolonych miejscach docelowych w internecie. Dodaj hosta do polityki sieciowej konta. Zobacz Replikuj dane do Lakebase.
Zużycie pamięci rośnie i nie jest zwalniane. Slot replikacyjny zachowuje WAL, ponieważ jego subskrybent nie konsumuje zmian. Jeśli nie zostanie rozwiązany, wydawcy może zabraknąć miejsca na przechowywanie. Sprawdź zachowane WAL, potem ponownie podłącz subskrybenta lub usuń slot. Pamięć jest zwalniana dopiero po tym, jak wydawca przetworzy WAL. Zobacz Sloty replikacyjne i magazyn danych.
Wiersze nie docierają do subskrybenta. Potwierdź, że tabele docelowe istnieją z pasującymi nazwami i kolumnami oraz że publikacja zawiera tabele, których się spodziewasz.

Następne kroki