Megosztás a következőn keresztül:


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:

  1. Logikai replikáció

    1. 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.
    2. 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.
  2. 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

  1. Nyissa meg a kiszolgálóparaméterek lapját a portálon.

  2. Állítsa be a kiszolgálóparamétert wal_level a következőre logical: .

  3. Ha pglogicális bővítményt szeretne használni, keressen rá a shared_preload_libraries, és azure.extensions a paraméterekre, és válasszon pglogical a legördülő listából.

  4. 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 a WARNING: out of background worker slots.

  5. Mentse a módosításokat, és indítsa újra a kiszolgálót a módosítások alkalmazásához.

  6. 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.

  7. Adjon meg rendszergazdai felhasználói replikációs engedélyeket.

    ALTER ROLE <adminname> WITH REPLICATION;
    
  8. É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.

  1. 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');
    
  2. Hozzon létre egy kiadványt a táblához.

    CREATE PUBLICATION pub FOR TABLE basic;
    
  3. 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);
    
  4. 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;
    
  5. 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.

  1. 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;
    
  2. 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;
    
  3. 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');
    
  4. Replikációs csoport létrehozása.

    select pglogical.create_replication_set('myreplicationset');
    
  5. 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']);
    
  6. 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' );
    
  7. 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');
    
  8. 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.

  1. Hozzon létre egy pontot.

    SELECT * FROM pg_create_logical_replication_slot('test_slot', 'wal2json');
    
  2. 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';
    
  3. 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"]
                            }
                   }
          ]
    }
    
  4. 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.