Logikai replikáció és logikai dekódolás rugalmas Azure Database for PostgreSQL-kiszolgálón
A következőkre vonatkozik: Azure Database for PostgreSQL – Rugalmas kiszolgáló
A rugalmas Azure Database for PostgreSQL-kiszolgáló a következő logikai adatkinyerési és replikációs módszereket támogatja:
Logikai replikáció
- A PostgreSQL natív logikai replikációja adatobjektumok replikálásához. A logikai replikáció lehetővé teszi az adatreplikáció, például a táblaszintű adatreplikáció finomhangolt szabályozását.
- Pglogical extension használata, amely logikai streamelési replikációt és további képességeket biztosít, például az adatbázis kezdeti sémájának másolását, a TRUNCATE támogatását, a DDL replikálásának képességét stb.
Logikai dekódolás, amely az írási napló (WAL) tartalmának dekódolásával valósul meg.
Logikai replikáció és logikai dekódolás összehasonlítása
A logikai replikáció és a logikai dekódolás számos hasonlósággal rendelkezik. Mindkettő:
Lehetővé teszi az adatok postgresből való replikálását.
Használja az előre írt naplót (WAL) a módosítások forrásaként.
Logikai replikációs pontok használata adatok küldéséhez. A pontok a változások adatfolyamát jelölik.
A tábla REPLICA IDENTITY tulajdonságával meghatározhatja, hogy milyen módosítások küldhetők el.
Ne replikálja a DDL-módosításokat.
A két technológia különbségeket mutat:
Logikai replikáció:
- Lehetővé teszi a replikálni kívánt tábla vagy táblakészlet megadását.
Logikai dekódolás:
- Kinyeri az adatbázis összes táblájában lévő módosításokat.
A logikai replikáció és a logikai dekódolás előfeltételei
Nyissa meg a kiszolgálóparaméterek lapját a portálon.
Állítsa be a kiszolgálóparamétert
wal_level
a következőrelogical
: .Ha pglogicális bővítményt szeretne használni, keressen rá a
shared_preload_libraries
, ésazure.extensions
a paraméterekre, és válasszonpglogical
a legördülő listából.Frissítse
max_worker_processes
a paraméter értékét legalább 16-ra. Ellenkező esetben olyan problémák merülhetnek fel, mint aWARNING: out of background worker slots
.Mentse a módosításokat, és indítsa újra a kiszolgálót a módosítások alkalmazásához.
Ellenőrizze, hogy a rugalmas Azure Database for PostgreSQL-kiszolgálópéldány engedélyezi-e a hálózati forgalmat a csatlakozó erőforrásból.
Adjon meg rendszergazdai felhasználói replikációs engedélyeket.
ALTER ROLE <adminname> WITH REPLICATION;
Érdemes lehet meggyőződni arról, hogy a használt szerepkör rendelkezik jogosultságokkal a replikált sémán. Ellenkező esetben előfordulhat, hogy olyan hibákba ütközik, mint a
Permission denied for schema
.
Feljegyzés
A replikációs felhasználót mindig érdemes elkülöníteni a normál rendszergazdai fióktól.
Logikai replikáció és logikai dekódolás használata
A natív logikai replikáció a legegyszerűbb módja az adatok rugalmas Azure Database for PostgreSQL-kiszolgálóból való replikálásának. A módosítások felhasználásához használhatja az SQL-felületet vagy a streamelési protokollt. Az SQL-felülettel logikai dekódolással is felhasználhatja a módosításokat.
Natív logikai replikáció
A logikai replikáció a "közzétevő" és az "előfizető" kifejezést használja.
- A közzétevő az Azure Database for PostgreSQL rugalmas kiszolgálóadatbázis, amelyről adatokat küld.
- Az előfizető a rugalmas Azure Database for PostgreSQL-kiszolgálóadatbázis, amelybe adatokat küld.
Íme néhány mintakód, a logikai replikáció kipróbálásához.
Csatlakozzon a közzétevő adatbázisához. Hozzon létre egy táblát, és adjon hozzá néhány adatot.
CREATE TABLE basic (id INTEGER NOT NULL PRIMARY KEY, a TEXT); INSERT INTO basic VALUES (1, 'apple'); INSERT INTO basic VALUES (2, 'banana');
Hozzon létre egy kiadványt a táblához.
CREATE PUBLICATION pub FOR TABLE basic;
Csatlakozzon az előfizetői adatbázishoz. Hozzon létre egy táblát ugyanazzal a sémával, mint a közzétevőn.
CREATE TABLE basic (id INTEGER NOT NULL PRIMARY KEY, a TEXT);
Hozzon létre egy előfizetést, amely csatlakozik a korábban létrehozott kiadványhoz.
CREATE SUBSCRIPTION sub CONNECTION 'host=<server>.postgres.database.azure.com user=<rep_user> dbname=<dbname> password=<password>' PUBLICATION pub;
Most már lekérdezheti a táblát az előfizetőn. Láthatja, hogy adatokat kapott a közzétevőtől.
SELECT * FROM basic;
További sorokat adhat hozzá a közzétevő táblához, és megtekintheti az előfizető módosításait.
Ha nem látja az adatokat, engedélyezze a bejelentkezési jogosultságot
azure_pg_admin
, és ellenőrizze a tábla tartalmát.ALTER ROLE azure_pg_admin login;
A logikai replikációval kapcsolatos további információkért tekintse meg a PostgreSQL dokumentációját.
Logikai replikáció használata ugyanazon a kiszolgálón található adatbázisok között
Amikor logikai replikációt szeretne beállítani az ugyanazon rugalmas Azure Database for PostgreSQL-kiszolgálópéldányon található különböző adatbázisok között, alapvető fontosságú, hogy konkrét irányelveket kövessen a jelenleg érvényben lévő implementációs korlátozások elkerülése érdekében. Egy olyan előfizetés létrehozása, amely ugyanahhoz az adatbázisfürthöz csatlakozik, csak akkor lesz sikeres, ha a replikációs pont nem ugyanabban a parancsban jön létre; ellenkező esetben a CREATE SUBSCRIPTION
hívás lefagy egy várakozási LibPQWalReceiverReceive
eseményen. Ez a Postgres motoron belüli meglévő korlátozás miatt következik be, amely a későbbi kiadásokban el lesz távolítva.
Ha hatékonyan szeretne logikai replikációt beállítani a "forrás" és a "cél" adatbázis között ugyanazon a kiszolgálón, miközben megkerüli ezt a korlátozást, kövesse az alábbi lépéseket:
Először hozzon létre egy "basic" nevű táblát, amely a forrás- és céladatbázisokban is azonos sémával rendelkezik:
-- Run this on both source and target databases
CREATE TABLE basic (id INTEGER NOT NULL PRIMARY KEY, a TEXT);
Ezután a forrásadatbázisban hozzon létre egy kiadványt a táblához, és külön hozzon létre egy logikai replikációs pontot a pg_create_logical_replication_slot
függvény használatával, amely segít elhárítani a függő problémát, amely általában akkor fordul elő, ha a pont ugyanabban a parancsban jön létre, mint az előfizetés. A beépülő modult kell használnia pgoutput
:
-- Run this on the source database
CREATE PUBLICATION pub FOR TABLE basic;
SELECT pg_create_logical_replication_slot('myslot', 'pgoutput');
Ezt követően a céladatbázisban hozzon létre egy előfizetést a korábban létrehozott kiadványhoz, biztosítva, hogy create_slot
false
a rugalmas Azure Database for PostgreSQL-kiszolgáló ne hozzon létre új pontot, és helyesen adja meg az előző lépésben létrehozott pontnevet. A parancs futtatása előtt cserélje le a kapcsolati sztring helyőrzőit a tényleges adatbázis-hitelesítő adatokra:
-- 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');
A logikai replikáció beállítása után tesztelheti azt úgy, hogy beszúr egy új rekordot a forrásadatbázis "alapszintű" táblájába, majd ellenőrzi, hogy replikálja-e a céladatbázisba:
-- Run this on the source database
INSERT INTO basic SELECT 3, 'mango';
-- Run this on the target database
TABLE basic;
Ha minden megfelelően van konfigurálva, a céladatbázis forrásadatbázisából származó új rekordnak kell megjelennie, megerősítve a logikai replikáció sikeres beállítását.
pglogical extension
Íme egy példa a pglogical konfigurálására a szolgáltatói adatbázis-kiszolgálón és az előfizetőnél. További részletekért tekintse meg a pglogical extension dokumentációját . Győződjön meg arról is, hogy elvégezte a fent felsorolt előfeltétel-feladatokat.
Telepítse a pglogical bővítményt az adatbázisba mind a szolgáltató, mind az előfizető adatbázis-kiszolgálókon.
\c myDB CREATE EXTENSION pglogical;
Ha a replikációs felhasználó nem a kiszolgálófelügyeleti felhasználó (aki létrehozta a kiszolgálót), győződjön meg arról, hogy a felhasználónak szerepköri
azure_pg_admin
tagságot ad, és replikációs és BEJELENTKEZÉSI attribútumokat rendel a felhasználóhoz. Részletekért tekintse meg a pglogical dokumentációt .GRANT azure_pg_admin to myUser; ALTER ROLE myUser REPLICATION LOGIN;
A szolgáltatói (forrás/közzétevő) adatbázis-kiszolgálón hozza létre a szolgáltató csomópontot.
select pglogical.create_node( node_name := 'provider1', dsn := ' host=myProviderServer.postgres.database.azure.com port=5432 dbname=myDB user=myUser password=myPassword');
Replikációs csoport létrehozása.
select pglogical.create_replication_set('myreplicationset');
Adja hozzá az adatbázis összes táblát a replikációs csoporthoz.
SELECT pglogical.replication_set_add_all_tables('myreplicationset', '{public}'::text[]);
Alternatív módszerként táblákat is hozzáadhat egy adott sémából (például testUser) egy alapértelmezett replikációs csoporthoz.
SELECT pglogical.replication_set_add_all_tables('default', ARRAY['testUser']);
Az előfizetői adatbázis-kiszolgálón hozzon létre egy előfizetői csomópontot.
select pglogical.create_node( node_name := 'subscriber1', dsn := ' host=mySubscriberServer.postgres.database.azure.com port=5432 dbname=myDB user=myUser password=myPasword' );
Hozzon létre egy előfizetést a szinkronizálás és a replikációs folyamat elindításához.
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=myPassword');
Ezután ellenőrizheti az előfizetés állapotát.
SELECT subscription_name, status FROM pglogical.show_subscription_status();
Figyelemfelhívás
A Pglogical jelenleg nem támogatja az automatikus DDL-replikációt. A kezdeti séma manuálisan másolható pg_dump --schema-only használatával. A DDL-utasítások a pglogical.replicate_ddl_command függvénnyel egyidejűleg végrehajthatók a szolgáltatón és az előfizetőn. Vegye figyelembe az itt felsorolt bővítmény egyéb korlátozásait.
Logikai dekódolás
A logikai dekódolás a streamelési protokollon vagy az SQL-interfészen keresztül használható.
Streamelési protokoll
A módosítások streamelési protokoll használatával történő használata gyakran előnyösebb. Létrehozhat saját fogyasztót/ összekötőt, vagy használhat egy külső szolgáltatást, például a Debeziumot.
A wal2json dokumentációjában talál egy példát a streamelési protokoll pg_recvlogical használatával.
SQL-felület
Az alábbi példában az SQL-felületet a wal2json beépülő modullal használjuk.
Hozzon létre egy pontot.
SELECT * FROM pg_create_logical_replication_slot('test_slot', 'wal2json');
SQL-parancsok kiadása. Példa:
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';
Használja fel a módosításokat.
SELECT data FROM pg_logical_slot_get_changes('test_slot', NULL, NULL, 'pretty-print', '1');
A kimenet a következőképpen fog kinézni:
{ "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"] } } ] }
Ha végzett a használattal, dobja el a pontot.
SELECT pg_drop_replication_slot('test_slot');
A logikai dekódolással kapcsolatos további információkért tekintse meg a PostgreSQL dokumentációját.
Monitor
Figyelnie kell a logikai dekódolást. A nem használt replikációs pontot el kell dobni. A pontok a változások beolvasásáig a Postgres WAL-naplókat és a vonatkozó rendszerkatalógusokat tartják. Ha az előfizető vagy a fogyasztó meghibásodik, vagy helytelenül van konfigurálva, a nem megadott naplók halmozódnak fel, és kitöltik a tárterületet. Emellett a nem megadott naplók növelik a tranzakcióazonosító körbefuttatásának kockázatát. Mindkét esetben előfordulhat, hogy a kiszolgáló elérhetetlenné válik. Ezért a logikai replikációs tárolóhelyeket folyamatosan kell használni. Ha a logikai replikációs pont már nincs használatban, azonnal dobja el.
A nézet "aktív" oszlopa pg_replication_slots
azt jelzi, hogy van-e fogyasztó csatlakoztatva egy ponthoz.
SELECT * FROM pg_replication_slots;
Állítson be riasztásokat a maximálisan használt tranzakcióazonosítókról és a rugalmas Azure Database for PostgreSQL-kiszolgálói metrikákról, hogy értesítést küldhessenek, ha az értékek a normál küszöbértékeken túllépik az értéket.
Korlátozások
Az itt dokumentált logikai replikációs korlátozások érvényesek.
Tárolóhelyek és ha feladatátvétel – Ha magas rendelkezésre állású (HA) kompatibilis kiszolgálókat használ rugalmas Azure Database for PostgreSQL-kiszolgálóval, vegye figyelembe, hogy a logikai replikációs pontok nem maradnak meg a feladatátvételi események során. A logikai replikációs pontok fenntartásához és a feladatátvétel utáni adatkonzisztenciához ajánlott a PG Feladatátvevő pontok bővítmény használata. A bővítmény engedélyezésével kapcsolatos további információkért tekintse meg a dokumentációt.
Fontos
Ha a megfelelő előfizető már nem létezik, el kell dobnia a logikai replikációs pontot az elsődleges kiszolgálón. Ellenkező esetben a WAL-fájlok az elsődleges helyen halmozódnak fel, feltöltve a tárterületet. Tegyük fel, hogy a tárolási küszöbérték túllép egy bizonyos küszöbértéket, és a logikai replikációs pont nincs használatban (egy nem elérhető előfizető miatt). Ebben az esetben a rugalmas Azure Database for PostgreSQL-kiszolgálópéldány automatikusan elveti a nem használt logikai replikációs pontot. Ez a művelet felszabadítja a halmozott WAL-fájlokat, és megakadályozza, hogy a kiszolgáló elérhetetlenné váljon a tároló betöltődött állapota miatt.
Kapcsolódó tartalom
Visszajelzés
https://aka.ms/ContentUserFeedback.
Hamarosan elérhető: 2024-ben fokozatosan kivezetjük a GitHub-problémákat a tartalom visszajelzési mechanizmusaként, és lecseréljük egy új visszajelzési rendszerre. További információ:Visszajelzés küldése és megtekintése a következőhöz: