Delivery 1.0 Help

Replikacja logiczna PostgreSQL (natywna)

Error rendering macro 'toc' : null

Zasady ogólne

Pojęcia

  1. Publisher - ten node bazodanowy, z którego zmiany są pobierane i na którym tworzymy publikację.

  2. Subscriber - ten node, który pobiera zmiany (tu tworzymy naturalnie subskrypcję). Nie mówimy w tym wypadku o slave, ponieważ nie jest to node tak zależny jak w wypadku replikacji binarnej.

  3. Slot - mechanizm przekazywania zmian, miejsce komunikacji publishera i subscribera.

Jak to działa

Dokumentacja PostgreSQL jest jedną z najlepszych, pełny opis działania mechanizmu znajdziemy tutaj. W wersji bardzo skróconej:

Podczas tworzenia publikacji definiujemy jakie zmiany chcemy replikować (operacje + ); podczas tworzenia subskrypcji definiujemy z kolei skąd te zmiany pobierać (credentiale do bazy + nazwa publikacji), wówczas tworzy się również slot.

Proces walsender

Publisher przekazuje zmiany na slot w postaci binarnej, subscriber łączy się do slotu, pobiera zmiany i przetwarza je robiąc reverse engineering.

Jeśli w sybskrypcji nie zdefiniujemy inaczej, pierwszym krokiem będzie wykonanie inicjalnego snapshotu danych (proces utworzy osobny slot replikacji). Po zakończeniu snapshotu proces walsender rozpoczyna

Co można, a czego nie można z replikacją logiczną

Replikacja logiczną nie jest pełną replikacją master - master, chwilowo jeszcze w środowiskach produkcyjnych nie jest zalecany dwukierunkowy zapis.

Choć mechanizm slotów został wdrożony w wersji 9.4, replikacja logiczna w 10, sensowną dyskusję o natywnej replikacji zaczynamy z wersją 12.

  1. Można:

    1. replikować wybrane tabele;

    2. replikować dowolną komendę:

      1. instert

      2. update

      3. delete

      4. truncate

      5. dowolną kombinację powyższych

    3. mieć:

      1. dodatkowe niezreplikowane tabele na subscriberze;

      2. dodatkowe kolumny w replikowanej tabeli po stronie

    4. mieć różnych użytkowników po obu stronach

    5. replikowane tabele:

      1. obejmować różnymi dostępami, triggerami, widokami

      2. inaczej indeksować na node'ach (np publishera optymalizujemy pod zapis, a subscribera pod odczyt)

    6. łączyć replikację z innymi rozwiązaniami ze standardu SQL/MED (np. FDW)

    7. replikować na wyższą wersję PostgreSQL (min. wersja pg na publisherze 9.4, min. wersja na subscriberze 10)

  2. Nie można:

    1. replikować tabel bez klucza głównego, gdy replikujemy update i delete

    2. automatycznie replikować poleceń DDL

    3. replikować tylko części kolumn, tzn. wszystkie kolumny z publishera muszą się znaleźć ma subcriberze

Ograniczenia

Sekewencje

Uwaga - patycje!

W przypadku baz i tabel partycjonowanych replikacja pozwala na partycje na subscriberze, ale dopiero w wersji 13.

Konfiguracja

  1. Tworzymy dedykowanego dla replikacji użytkownika - po obu stronach:

    CREATE USER pglogical WITH SUPERUSER REPLICATION;
  2. Dodajemy wpis w pg_hba.conf po stronie publisher

    'LOG_REP_1': type: 'host' database: 'all' user: 'pglogical' address: '10.122.207.181/32' auth_method: 'trust' order: '010' 'LOG_REP_2': type: 'host' database: 'replication' user: 'pglogical' address: '10.122.207.181/32' auth_method: 'trust' order: '011'
  3. Zmiana parametrów po stronie publishera (po zmianie restart)

    postgresql_server_config_entry: 'max_replication_slots': {value: '3'} --minimalna wartość ' 'wal_level': {value: 'logical'}
  4. Zmiana parametrów po stronie subscribera (po zmianie restart):

    postgresql_server_config_entry: 'max_replication_slots': {value: '3'} --minimalna wartość ' 'wal_level': {value: 'logical'}

Zestawienie replikacji

  1. Podejmujemy decyzję co do zakresu replikacji

Błędy

Krytyczne jest wszystko, co objawia się dezaktywacją slotu:

Image2021 5 11 12 3 34

Nieaktywny slot modyfikuje działanie procesu checkpointera, obchodząc konfigurację - dopóki slot nie stanie się aktywny na powrót lub nie zostanie usunięty odkładają się dzienniki transakcji (co bardzo szybko prowadzi do przepełnienia przestrzeni dyskowej i zatrzymania bazy).

Najczęstszą przyczyną

Postgres jest dosyć wylewnym i elokwentnym narząedziem, więc większość problemów jest jasna.

2021-05-11T11:58:49.092983+02:00 paybm2-pgl-test.postgresql.dc0 postgres[112590]: [905494-1] 2021-05-11 11:58:49.092 CEST @ 112590  ERROR:  logical replication target relation "public.t1" is missing some replicated columns

Sequence data is not replicated. The data in serial or identity columns backed by sequences will of course be replicated as part of the table, but the sequence itself would still show the start value on the subscriber. If the subscriber is used as a read-only database, then this should typically not be a problem. If, however, some kind of switchover or failover to the subscriber database is intended, then the sequences would need to be updated to the latest values, either by copying the current data from the publisher (perhaps using pg_dump) or by determining a sufficiently high value from the tables themselves.

Replikacja logiczna nie kopiuje tabel oraz roli, trzeba więc zrobić to ręcznie. Logujemy się na użytkownika postgres na masterze

sudo -iu postgres pg_dumpall -s > transport_schema.dump pg_dumpall -r > transport_roles.dump

Po czym przesyłamy pliki na slave

scp transport_schema.dump gkaczorowski@HOST:/home/gkaczorowski scp transport_roles.dump gkaczorowski@HOST:/home/gkaczorowski

Aby postgres mógł skorzystać z tych plików należy przenieść je do lokalizacji /var/lib/pgsql/ oraz nadać odpowiednie uprawnienia

chown postgres:postgres transport_schema.dump chown postgres:postgres transport_roles.dump

Logujemy się na użytkownika postgres na slave, po czym wykonujemy polecenie

sudo -iu postgres psql -f transport_schema.dump psql -f transport_roles.dump

W tym momencie jesteśmy gotowi, aby zacząć zestawiać replikację. Na masterze wykonujemy serię poleceń ( jeśli interesuje nas replikacja wszystkich tabel ):

sudo -iu postgres psql CREATE PUBLICATION NAZWA_PUBLIKACJI FOR ALL TABLES;

Jeśli interesuje nas replikacja pojedynczych tabel tabel ostatnie polecenie powinno wyglądać:

CREATE PUBLICATION NAZWA_PUBLIKACJI FOR TABLE NAZWA_TABELI1,NAZWA_TABELI2...;
Po czym udajemy się na slave gdzie wykonujemy :
sudo -iu postgres psql CREATE SUBSCRIPTION NAZWA_SUBSKRYPCJI CONNECTION 'dbname=NAZWA_BAZY_DANYCH host=NAZWA_HOSTA user=postgres port=5432' PUBLICATION NAZWA_PUBLIKACJI;

UWAGA!

Jeśli na Masterze zostanie dodana nowa kolumna do którejś z tabel replikacja zatrzyma się, a slave będzie oczekiwał aż dodamy mu odpowiednią kolumnę. Po dodaniu kolumny na slave'ie replikacja zacznie zestawiać się ponownie.Sequence data is not replicated. The data in serial or identity columns backed by sequences will of course be replicated as part of the table, but the sequence itself would still show the start value on the subscriber. If the subscriber is used as a read-only database, then this should typically not be a problem. If, however, some kind of switchover or failover to the subscriber database is intended, then the sequences would need to be updated to the latest values, either by copying the current data from the publisher (perhaps using pg_dump) or by determining a sufficiently high value from the tables themselves.

Last modified: 30 May 2024