Replikuj dane do Lakebase

Ten przewodnik pokazuje, jak replikować dane z zewnętrznej bazy Postgres do Lakebase za pomocą replikacji logicznej. Lakebase działa jako subskrybent: łączy się z twoją bazą źródłową, kopiuje istniejące dane i wprowadza bieżące zmiany, aż do momentu przełączenia. Użyj tego do migracji bazy danych od innego dostawcy Postgres, takiego jak Amazon Aurora PostgreSQL czy Amazon RDS dla PostgreSQL, albo z samodzielnie zarządzanego serwera Postgres do Lakebase.

Warunki wstępne

  • Źródłowa baza danych Postgres z publicznym punktem końcowym, do którego Lakebase może dotrzeć.

  • Dostęp superużytkownika do bazy danych źródłowej lub konto administratora w zarządzanej usłudze Postgres. Ustawienie wal_level, utworzenie roli z atrybutem REPLICATION oraz utworzenie publikacji wymagają takiego poziomu dostępu.

  • Projekt Lakebase dla docelowej bazy danych.

  • Rola Postgres w Lakebase do utworzenia subskrypcji: członek roli databricks_superuser, np. rola właściciela projektu, lub rola, której przyznano zarówno wstępnie zdefiniowaną rolę pg_create_subscription, jak i przywilej CREATE w docelowej bazie danych. Sama rola pg_create_subscription to za mało. Bez CREATE w bazie danych, CREATE SUBSCRIPTION kończy się błędem permission denied for database. Aby przyznać databricks_superuser innej roli, zobacz: Utwórz role Postgres lub Aktualizuj rolę.

    GRANT pg_create_subscription TO <role_name>;
    GRANT CREATE ON DATABASE <database_name> TO <role_name>;
    

Replikacja logiczna jest obsługiwana w Lakebase. Nie ma żadnego kroku na poziomie projektu, który pozwala go włączyć. Jako subskrybent nie musisz wprowadzać zmiany wal_level. Tylko wydawca źródłowy potrzebuje wal_level = logical.

Przygotuj bazę danych źródłową

W źródłowej bazie danych Postgres ustaw dziennik write-ahead (WAL) na logical i potwierdź, że istnieje wystarczająca przepustowość do replikacji. Poniższy przykład dotyczy samodzielnie zarządzanego Postgresa. Twój zarządzany dostawca Postgres może korzystać z różnych ustawień:

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

Uruchom ponownie źródłową bazę danych, aby wal_level zmiana weszła w życie. W usłudze zarządzanej użyj grupy parametrów lub flag dostawcy, aby ustawić wal_level na logical. Na przykład w Amazon Aurora PostgreSQL ustaw rds.logical_replication na 1 w grupie parametrów klastra bazy danych i zrestartuj klaster. Na Amazon RDS dla PostgreSQL ustaw ten sam parametr w grupie parametrów bazy danych i zrestartuj instancję.

Stwórz rolę do replikacji i przyznaj jej dostęp do odczytu do tabel, które replikujesz:

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;

To CREATE ROLE stwierdzenie działa tak, jak zostało napisane, na samodzielnie zarządzanym serwerze PostgreSQL. Niektórzy zarządzani dostawcy Postgres nie pozwalają na ten atrybut REPLICATION bezpośrednio, lecz zamiast tego udostępniają dostęp do replikacji poprzez rolę specyficzną dla dostawcy. Jeśli Twoje źródło działa w usłudze zarządzanej, postępuj zgodnie z dokumentacją dostawcy, aby przyznać roli dostęp do replikacji, a następnie użyj tej roli zamiast replication_user w kolejnych krokach. Na przykład w Amazon Aurora PostgreSQL i Amazon RDS for PostgreSQL utwórz rolę bez WITH REPLICATION, a następnie uruchom GRANT rds_replication TO replication_user.

Stwórz publikację dla tabel, które chcesz replikować. Każda tabela musi mieć PRIMARY KEY lub ustawioną tożsamość repliki. Zobacz tożsamość repliki w dokumentacji Postgres.

CREATE PUBLICATION my_publication FOR TABLE orders, customers;

Zezwól aplikacji Lakebase na dostęp do źródła

Jako subskrybent Lakebase nawiązuje połączenie wychodzące z Twoją źródłową bazą danych. To połączenie wychodzące jest regulowane przez zasady sieci Twojego konta, które kontrolują docelowe adresy internetowe, do których mogą dotrzeć obciążenia bezserwerowe. Nie jest kontrolowany przez ustawienie projektu Lakebase ani rolę w bazie danych.

To, czy musisz coś zmienić, zależy od tego, czy Twoje konto egzekwuje politykę sieciową:

  • Brak aktywnej polityki sieciowej: Lakebase może dotrzeć do każdego publishera, który ma dostępny publiczny punkt końcowy. Nie jest wymagana żadna zmiana.
  • Aktywna polityka sieciowa: dodaj hosta bazy źródłowej do dozwolonych miejsc docelowych internetu w polityce sieciowej konta. Zobacz Zarządzanie zasadami sieciowymi. Jeśli host nie jest dozwolony, subskrypcja zostaje odrzucona podczas jej tworzenia. Zobacz Rozwiązywanie problemów.

Private Link nie jest obsługiwany dla połączenia subskrybenta. Źródłowa baza danych musi być dostępna za pośrednictwem swojego publicznego endpointu.

Stwórz tabele docelowe

Replikacja logiczna kopiuje dane, a nie schemat bazy danych. Utwórz tabele w docelowej bazie danych Lakebase o tych samych nazwach i kolumnach, jak w źródłowej bazie danych, przed rozpoczęciem replikacji. Możesz je stworzyć ręcznie albo zrzucić schemat ze źródła i załadować go do Lakebase. Zobacz Zrzuć tylko schemat.

Utwórz puste tabele docelowe. Początkowa kopia tabeli zawodzi z powodu duplikatów kluczy lub naruszeń ograniczeń, jeśli docelowa tabela już zawiera wiersze.

Stwórz subskrypcję

Połącz się z docelową bazą danych Lakebase, używając roli, która może tworzyć subskrypcje (patrz Wymagania wstępne), a następnie utwórz subskrypcję łączącą się z wydawcą źródłowym:

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;

Utworzenie subskrypcji uruchamia slot replikacyjny na wydawcy źródłowym, kopiuje istniejące wiersze, a następnie przesyła bieżące zmiany.

Warning

Slot replikacyjny sprawia, że źródłowa baza danych zachowuje dziennik WAL do czasu potwierdzenia przez Lakebase, że otrzymała zmiany. Jeśli subskrypcja przestaje pobierać zmiany, na przykład dlatego, że jest wyłączona, rozłączona lub zawiodła, WAL gromadzi się na źródle bez ograniczeń. Na źródle produkcyjnym może to zapełnić przestrzeń dyskową i spowodować awarię.

Podczas replikacji monitoruj, ile WAL zachowuje slot na źródle:

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;

Aby ograniczyć ryzyko na samozarządzanym źródle, ustaw max_slot_wal_keep_size, aby ograniczyć ilość WAL, którą może zatrzymać slot. Jeśli slot przekroczy limit, Postgres go unieważnia i subskrypcja musi zostać utworzona ponownie. Zrezygnuj z subskrypcji zaraz po zakończeniu migracji. Zobacz sloty replikacji i pamięć masową.

Note

Gdy Lakebase nawiązuje subskrypcję, łączy się z Twoją źródłową bazą danych i wysyła do niej dane uwierzytelniające roli replikacyjnej. sslmode=verify-full z sslrootcert=system szyfruje połączenie i weryfikuje tożsamość źródła, co chroni przekazywane dane uwierzytelniające przed „man-in-the-middle”. Działa, gdy Twoje źródło korzysta z publicznie zaufanego urzędu certyfikacyjnego. Słabszy algorytm sslmode=require szyfruje, ale nie weryfikuje źródła. Weryfikacja źródła korzystającego z prywatnego urzędu certyfikacji nie jest wspierana.

Zweryfikuj replikację

W docelowej bazie danych Lakebase potwierdź, że dotarły istniejące wiersze:

SELECT COUNT(*) FROM orders;

Wstaw lub zaktualizuj wiersz w źródle, a następnie ponownie wykonaj zapytanie względem elementu docelowego. Zmiana pojawia się na Lakebase w ciągu kilku sekund.

Monitor i przełącz

Śledź początkowe kopiowanie i bieżące opóźnienie:

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

Aby potwierdzić, że początkowa kopia się zakończyła, uruchom zapytanie o status synchronizacji dla poszczególnych tabel w Monitor replication na subskrybencie i poczekaj, aż każda tabela będzie mieć status Ready (fully live).

Gdy system docelowy nadrobi zaległości, zatrzymaj zapisy na źródle, upewnij się, że system docelowy jest w pełni aktualny, i przełącz aplikację na szczegóły połączenia Lakebase.

Replikacja logiczna nie kopiuje wartości sekwencji ani liczników tożsamości. Zanim wznowisz zapisy w Lakebase, zresetuj każdą sekwencję docelową, aby dopasowała się do replikowanych danych, albo nowe wstawienia do SERIAL lub kolumn tożsamości mogą generować zduplikowane klucze główne:

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

Gdy aplikacja działa już na Lakebase, usuń subskrypcję, aby zatrzymać replikację ze źródła. Gdy źródło jest osiągalne, rezygnacja z subskrypcji również usuwa na nim slot replikacyjny. Zobacz Usuwanie subskrypcji lub publikacji.

Informacje o monitorowaniu i czyszczeniu zawiera temat Zarządzanie i monitorowanie replikacji logicznej.

Następne kroki