Logická replikace a logické dekódování ve službě Azure Database for PostgreSQL – flexibilní server
PLATÍ PRO: Flexibilní server Azure Database for PostgreSQL
Flexibilní server Azure Database for PostgreSQL podporuje následující metodologie extrakce a replikace logických dat:
Logická replikace
- Použití nativní logické replikace PostgreSQL k replikaci datových objektů Logická replikace umožňuje přesnou kontrolu nad replikací dat, včetně replikace dat na úrovni tabulek.
- Použití rozšíření pglogical , které poskytuje logickou replikaci streamování a další možnosti, jako je kopírování počátečního schématu databáze, podpora TRUNCATE, schopnost replikovat DDL atd.
Logické dekódování , které je implementováno dekódováním obsahu protokolu o zápisu (WAL).
Porovnání logické replikace a logického dekódování
Logická replikace a logické dekódování mají několik podobností. Oba:
Umožňuje replikovat data z Postgresu.
Jako zdroj změn použijte protokol WAL (write-ahead).
K odesílání dat použijte sloty logické replikace. Slot představuje datový proud změn.
Pomocí vlastnosti REPLIKA IDENTITY tabulky určete, jaké změny je možné odeslat.
Nereplikujte změny DDL.
Dvě technologie mají své rozdíly:
Logická replikace:
- Umožňuje zadat tabulku nebo sadu tabulek, které se mají replikovat.
Logické dekódování:
- Extrahuje změny napříč všemi tabulkami v databázi.
Předpoklady pro logickou replikaci a logické dekódování
Přejděte na stránku parametrů serveru na portálu.
Nastavte parametr
wal_level
serveru nalogical
hodnotu .Pokud chcete použít rozšíření pglogical, vyhledejte
shared_preload_libraries
aazure.extensions
parametry a vybertepglogical
z rozevíracího seznamu.Aktualizujte
max_worker_processes
hodnotu parametru na alespoň 16. V opačném případě může dojít k problémům, jako jeWARNING: out of background worker slots
.Uložte změny a restartujte server, aby se změny použily.
Ověřte, že vaše instance flexibilního serveru Azure Database for PostgreSQL umožňuje síťový provoz z vašeho připojujícího prostředku.
Udělte správci oprávnění k replikaci uživatelů.
ALTER ROLE <adminname> WITH REPLICATION;
Můžete se ujistit, že role, kterou používáte, má oprávnění ke schématu, které replikujete. V opačném případě může docházet k chybám, například
Permission denied for schema
.
Poznámka:
Vždy je vhodné oddělit uživatele replikace od běžného účtu správce.
Použití logické replikace a logického dekódování
Použití nativní logické replikace je nejjednodušší způsob, jak replikovat data z flexibilního serveru Azure Database for PostgreSQL. Ke zpracování změn můžete použít rozhraní SQL nebo protokol streamování. Pomocí rozhraní SQL můžete také využívat změny pomocí logického dekódování.
Nativní logická replikace
Logická replikace používá termíny vydavatel a odběratel.
- Vydavatelem je flexibilní serverová databáze Azure Database for PostgreSQL, ze které odesíláte data.
- Odběratelem je flexibilní serverová databáze Azure Database for PostgreSQL, do které odesíláte data.
Tady je ukázkový kód, který můžete použít k vyzkoušení logické replikace.
Připojte se k databázi vydavatele. Vytvořte tabulku a přidejte nějaká data.
CREATE TABLE basic (id INTEGER NOT NULL PRIMARY KEY, a TEXT); INSERT INTO basic VALUES (1, 'apple'); INSERT INTO basic VALUES (2, 'banana');
Vytvořte publikaci pro tabulku.
CREATE PUBLICATION pub FOR TABLE basic;
Připojte se k databázi odběratele. Vytvořte tabulku se stejným schématem jako u vydavatele.
CREATE TABLE basic (id INTEGER NOT NULL PRIMARY KEY, a TEXT);
Vytvořte předplatné, které se připojí k publikaci, kterou jste vytvořili dříve.
CREATE SUBSCRIPTION sub CONNECTION 'host=<server>.postgres.database.azure.com user=<rep_user> dbname=<dbname> password=<password>' PUBLICATION pub;
Teď se můžete dotazovat na tabulku odběratele. Vidíte, že obdržela data od vydavatele.
SELECT * FROM basic;
Do tabulky vydavatele můžete přidat další řádky a zobrazit změny odběratele.
Pokud se vám data nezobrazují, povolte oprávnění
azure_pg_admin
k přihlášení a zkontrolujte obsah tabulky.ALTER ROLE azure_pg_admin login;
Další informace o logické replikaci najdete v dokumentaci k PostgreSQL.
Použití logické replikace mezi databázemi na stejném serveru
Pokud se snažíte nastavit logickou replikaci mezi různými databázemi umístěnými ve stejné instanci flexibilního serveru Azure Database for PostgreSQL, je nezbytné postupovat podle konkrétních pokynů, abyste se vyhnuli omezením implementace, která jsou aktuálně k dispozici. Odteď bude vytvoření předplatného, které se připojí ke stejnému databázovému clusteru, úspěšné pouze v případě, že se slot replikace nevytvoří ve stejném příkazu; CREATE SUBSCRIPTION
jinak volání přestane reagovat na LibPQWalReceiverReceive
událost čekání. K tomu dochází kvůli existujícímu omezení v rámci modulu Postgres, které se může v budoucích verzích odebrat.
Pokud chcete efektivně nastavit logickou replikaci mezi "zdrojovými" a "cílovými" databázemi na stejném serveru a současně obejít toto omezení, postupujte podle následujících kroků:
Nejprve vytvořte tabulku s názvem "basic" se stejným schématem ve zdrojové i cílové databázi:
-- Run this on both source and target databases
CREATE TABLE basic (id INTEGER NOT NULL PRIMARY KEY, a TEXT);
Dále ve zdrojové databázi vytvořte publikaci pro tabulku a samostatně vytvořte slot logické replikace pomocí pg_create_logical_replication_slot
funkce, která pomáhá převrátit problém s předsazením, ke kterému obvykle dochází při vytvoření slotu ve stejném příkazu jako předplatné. Musíte použít modul plug-in pgoutput
:
-- Run this on the source database
CREATE PUBLICATION pub FOR TABLE basic;
SELECT pg_create_logical_replication_slot('myslot', 'pgoutput');
Potom ve vaší cílové databázi vytvořte předplatné dříve vytvořené publikace, čímž zajistíte, aby create_slot
false
se zabránilo flexibilnímu serveru Azure Database for PostgreSQL v vytvoření nového slotu, a správně zadejte název slotu, který byl vytvořen v předchozím kroku. Před spuštěním příkazu nahraďte zástupné symboly v připojovací řetězec skutečnými přihlašovacími údaji databáze:
-- Run this on the target database
CREATE SUBSCRIPTION sub
CONNECTION 'dbname=<source dbname> host=<server>.postgres.database.azure.com port=5432 user=<rep_user> password=<password>'
PUBLICATION pub
WITH (create_slot = false, slot_name='myslot');
Po nastavení logické replikace ji teď můžete otestovat vložením nového záznamu do "základní" tabulky ve zdrojové databázi a následným ověřením, že se replikuje do cílové databáze:
-- Run this on the source database
INSERT INTO basic SELECT 3, 'mango';
-- Run this on the target database
TABLE basic;
Pokud je vše správně nakonfigurované, měli byste vidět nový záznam ze zdrojové databáze v cílové databázi a potvrdit úspěšné nastavení logické replikace.
rozšíření pglogical
Tady je příklad konfigurace pglogical na databázovém serveru poskytovatele a odběrateli. Další podrobnosti najdete v dokumentaci k rozšíření pglogical. Ujistěte se také, že jste provedli výše uvedené požadované úlohy.
Nainstalujte do databáze rozšíření pglogical v databázovém serveru poskytovatele i odběratele.
\c myDB CREATE EXTENSION pglogical;
Pokud je uživatel replikace jiný než uživatel pro správu serveru (který server vytvořil), ujistěte se, že uživateli udělíte členství v roli
azure_pg_admin
a přiřadíte uživateli atributy REPLIKACE a LOGIN. Podrobnosti najdete v dokumentaci pglogical.GRANT azure_pg_admin to myUser; ALTER ROLE myUser REPLICATION LOGIN;
Na databázovém serveru poskytovatele (zdroj/vydavatel) vytvořte uzel zprostředkovatele.
select pglogical.create_node( node_name := 'provider1', dsn := ' host=myProviderServer.postgres.database.azure.com port=5432 dbname=myDB user=myUser password=<password>');
Vytvořte sadu replikace.
select pglogical.create_replication_set('myreplicationset');
Přidejte do replikační sady všechny tabulky v databázi.
SELECT pglogical.replication_set_add_all_tables('myreplicationset', '{public}'::text[]);
Jako alternativní metodu můžete také přidat tabulky z konkrétního schématu (například testUser) do výchozí sady replikace.
SELECT pglogical.replication_set_add_all_tables('default', ARRAY['testUser']);
Na databázovém serveru odběratele vytvořte uzel odběratele.
select pglogical.create_node( node_name := 'subscriber1', dsn := ' host=mySubscriberServer.postgres.database.azure.com port=5432 dbname=myDB user=myUser password=<password>' );
Vytvořte předplatné, které spustí synchronizaci a proces replikace.
select pglogical.create_subscription ( subscription_name := 'subscription1', replication_sets := array['myreplicationset'], provider_dsn := 'host=myProviderServer.postgres.database.azure.com port=5432 dbname=myDB user=myUser password=<password>');
Stav předplatného pak můžete ověřit.
SELECT subscription_name, status FROM pglogical.show_subscription_status();
Upozornění
Pglogical v současné době nepodporuje automatickou replikaci DDL. Počáteční schéma lze kopírovat ručně pomocí pg_dump --schema-only. Příkazy DDL je možné spouštět u poskytovatele a odběratele současně pomocí funkce pglogical.replicate_ddl_command. Mějte prosím na paměti další omezení rozšíření, která jsou zde uvedená.
Logické dekódování
Logické dekódování je možné využívat prostřednictvím protokolu streamování nebo rozhraní SQL.
Protokol streamování
Používání změn pomocí protokolu streamování je často vhodnější. Můžete vytvořit vlastní příjemce nebo konektor nebo použít službu třetí strany, jako je Debezium.
Příklad použití protokolu streamování s pg_recvlogical najdete v dokumentaci wal2jsonu.
Rozhraní SQL
V následujícím příkladu používáme rozhraní SQL s modulem plug-in wal2json.
Vytvořte slot.
SELECT * FROM pg_create_logical_replication_slot('test_slot', 'wal2json');
Vydávat příkazy SQL Příklad:
CREATE TABLE a_table ( id varchar(40) NOT NULL, item varchar(40), PRIMARY KEY (id) ); INSERT INTO a_table (id, item) VALUES ('id1', 'item1'); DELETE FROM a_table WHERE id='id1';
Spotřebovávejte změny.
SELECT data FROM pg_logical_slot_get_changes('test_slot', NULL, NULL, 'pretty-print', '1');
Výstup vypadá takto:
{ "change": [ ] } { "change": [ { "kind": "insert", "schema": "public", "table": "a_table", "columnnames": ["id", "item"], "columntypes": ["character varying(40)", "character varying(40)"], "columnvalues": ["id1", "item1"] } ] } { "change": [ { "kind": "delete", "schema": "public", "table": "a_table", "oldkeys": { "keynames": ["id"], "keytypes": ["character varying(40)"], "keyvalues": ["id1"] } } ] }
Jakmile slot dokončíte, zahoďte ho.
SELECT pg_drop_replication_slot('test_slot');
Další informace o logickém dekódování najdete v dokumentaci k PostgreSQL.
Monitor
Musíte monitorovat logické dekódování. Všechny nevyužité sloty replikace se musí vynechat. Sloty uchovávají protokoly Postgres WAL a relevantní systémové katalogy, dokud se změny nepřečtou. Pokud váš odběratel nebo příjemce selže nebo pokud je nesprávně nakonfigurovaný, hromadí se nepotřebné protokoly a vyplní vaše úložiště. Také nekonsumované protokoly zvyšují riziko zalamování ID transakce. Obě situace můžou způsobit nedostupnost serveru. Proto musí být sloty logické replikace spotřebovány nepřetržitě. Pokud se slot logické replikace už nepoužívá, okamžitě ho zahoďte.
Sloupec Aktivní v pg_replication_slots
zobrazení označuje, jestli je uživatel připojený ke slotu.
SELECT * FROM pg_replication_slots;
Nastavte upozornění na maximální využité ID transakcí a metriky flexibilního serveru Azure Database for PostgreSQL, které vás upozorní, když hodnoty zvyšují prahové hodnoty za normální hodnoty.
Omezení
Omezení logické replikace platí, jak je uvedeno tady.
Sloty a převzetí služeb při selhání vysoké dostupnosti – Při použití serverů s podporou vysoké dostupnosti s flexibilním serverem Azure Database for PostgreSQL mějte na paměti, že sloty logické replikace se během událostí převzetí služeb při selhání nezachovají. Pokud chcete zachovat sloty logické replikace a zajistit konzistenci dat po převzetí služeb při selhání, doporučujeme použít rozšíření PG Failover Slots. Další informace o povolení tohoto rozšíření najdete v dokumentaci.
Důležité
Pokud už odpovídající odběratel neexistuje, musíte na primárním serveru vynechat slot logické replikace. V opačném případě se soubory WAL hromadí v primárním, vyplňování úložiště. Předpokládejme, že prahová hodnota úložiště překračuje určitou prahovou hodnotu a slot logické replikace se nepoužívá (kvůli nedostupné odběrateli). V takovém případě instance flexibilního serveru Azure Database for PostgreSQL automaticky klesne tento nepoužívaný slot logické replikace. Tato akce uvolní kumulované soubory WAL a vyhne se nedostupnosti vašeho serveru kvůli zaplnění úložiště.