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


Rugalmas fürtök az Azure Database for PostgreSQL-ben

Az Azure Database for PostgreSQL szolgáltatásának rugalmas fürtjei a PostgreSQL-hez készült nyílt forráskódú Citus-bővítmény részeként felügyelt ajánlatok, amelyek lehetővé teszik a PostgreSQL horizontális feldarabolását.

Bár a Citus csak egy bővítmény, több PostgreSQL-példányt is összekapcsol. Ha egy rugalmas Azure Database for PostgreSQL-kiszolgálópéldányt helyez üzembe a Citussal, az egyetlen erőforrásként több PostgreSQL-példány kezelését és konfigurációját kezeli. Emellett automatikusan beállítja a csomópontokat, és ismerteti őket a Citus-bővítménysel.

A szolgáltatás rugalmas fürtöi két horizontális skálázási modellt kínálnak: soralapú skálázást és sémaalapú horizontális skálázást. Ha többet szeretne megtudni, tekintse meg a horizontális skálázási modellek nyílt forráskódú dokumentációját.

Architektúra

A rugalmas fürtök egy vagy több rugalmas Azure Database for PostgreSQL-kiszolgálópéldányból állnak. Ezek a példányok automatikusan ismertetik egymást, és egy Citus-fürt létrehozásához kapcsolódnak egymáshoz. A csomópontoknak ugyanahhoz a számítási és tárolási szinthez kell tartozniuk, és egységesen fel- vagy leskálázhatók magasabb vagy alacsonyabb szintekre.

A rugalmas fürtök rugalmas kiszolgálók (úgynevezett csomópontok) példányait használják a "megosztott semmi" architektúra egymással való összehangolásához. Az architektúra lehetővé teszi az adatbázis skálázását is, ha további csomópontokat ad hozzá a fürthöz.

Ha az 5432-s port használatával csatlakozik a fürthöz, a kijelölt koordinátor csomóponton lesz. A rugalmas fürtök lehetővé teszik a kapcsolatok terheléselosztását a fürtön belül egy ötös tétel hash módszerrel, ha a 7432-s porton keresztül csatlakozik. A 7432 használatával továbbra is a koordinátorként kijelölt csomóponton landolt. Bizonyos fürtszintű műveletek, például a táblák elosztása esetén előfordulhat, hogy az 5432-s porton keresztül kell csatlakoznia. Határozottan javasoljuk, hogy mindig csatlakozzon az 5432-s porton, amikor alkalmazásséma-frissítéseket és hasonló módosításokat tervez végrehajtani. Ha rugalmas fürtökön engedélyezi a PgBouncert, a 8432-es port használatával egyensúlyozhatja a kapcsolatokat a PgBouncer-példányok között minden csomóponton (vagy használhatja a 6432-es portot a kijelölt koordinátor számára).

A Cosmos DB for PostgreSQL-hez hasonlóan a csomópontcímek nem lesznek külsőleg elérhetővé téve. Ha például pg_dist_nodea Citus metaadattábláit tekinti meg, akkor azt tapasztalhatja, hogy az összes csomópont azonos IP-címmel rendelkezik, mint a példában, 10.7.0.254 de különböző portszámokat.

select nodeid, nodename, nodeport from pg_dist_node;
 nodeid |  nodename  | nodeport
--------+------------+----------
      1 | 10.7.0.254 |     7000
      2 | 10.7.0.254 |     7001
 
(2 rows)

Az Azure infrastruktúrájában ezek a csomópontok különböző virtuális gépeken élnek, annak ellenére, hogy úgy tűnhet, hogy ugyanazon a gépen különböző portok.

A Citusról a hivatalos nyílt forráskódú projektdokumentációban olvashat bővebben.

Alapértelmezés szerint a Citus használatával létrehozott táblák és sémák nem lesznek automatikusan elosztva a fürt között. El kell döntenie egy skálázási modellt, és vagy el kell osztania a sémákat, vagy el kell döntenie, hogy soralapú horizontális skálázással osztja el a táblaadatokat.

Az elosztott táblákon lévő lekérdezések esetében a lekérdezett csomópont vagy egyetlen csomóponthoz irányítja, vagy több csomóponton párhuzamosítja. A döntés attól függ, hogy a szükséges adatok egyetlen csomóponton vagy több csomóponton találhatók-e. Sémaalapú horizontális skálázás esetén a koordinátor közvetlenül a sémát futtató csomópontra irányítja a lekérdezéseket. A sémaalapú skálázás és a soralapú horizontális skálázás esetén a csomópont a metaadattáblák megtekintésével dönti el, hogy mi a teendő. Ezek a táblák nyomon követik a csomópontok helyét és állapotát, valamint az adatok csomópontok közötti elosztását.

Miután az adatok el vannak terjesztve az egyik szegmensmodell használatával, bármelyik csomóponthoz csatlakozhat a DML (Adatmódosítási nyelv) műveletek végrehajtásához (SELECT, UPDATE, INSERT, DELETE). Minden csomópont tartalmazza a lekérdezéshez szükséges adatok megkereséséhez szükséges metaadatokat, és képes beszerezni a lekérdezés megválaszolásához.

A DDL (Data Definition Language) és a fürtszintű műveletek jelenleg a koordinátori szerepkört tartalmazó csomópontra korlátozódnak. Győződjön meg arról, hogy DDL- és fürtszintű műveleteket hajt végre úgy, hogy a 7432-s port helyett az 5432-s porthoz csatlakozik.

A rugalmas fürtöket új csomópontok hozzáadásával és az adatok újraegyensúlyozásával skálázhatja fel. Az újraegyensúlyozás egy online művelet, és nem blokkolja a futó számítási feladatokat.

Szilánkok

Az előző szakasz azt ismertette, hogy az elosztott táblák hogyan tárolódnak szegmensekként a feldolgozó csomópontokon. Ez a szakasz további technikai részleteket tárgyal ezekről a szegmensekről.

A pg_dist_shard metaadattábla egy sort tartalmaz a rendszer egyes elosztott tábláinak egyes szegmenseihez. A sor megfelel egy szegmensazonosítónak (shardid) egy kivonattérben (shardminvalue, shardmaxvalue).

SELECT * from pg_dist_shard;
logicalrelid  | shardid | shardstorage | shardminvalue | shardmaxvalue
---------------+---------+--------------+---------------+---------------
 github_events |  102026 | t            | 268435456     | 402653183
 github_events |  102027 | t            | 402653184     | 536870911
 github_events |  102028 | t            | 536870912     | 671088639
 github_events |  102029 | t            | 671088640     | 805306367
 
 (4 rows)

Ha a csomópont meg szeretné határozni, hogy melyik szegmens tartalmaz egy sort github_events, kivonatot ad a sor terjesztési oszlopának értékéről. Ezután a csomópont ellenőrzi, hogy melyik szegmens tartománya tartalmazza a kivonatolt értéket. A tartományok úgy vannak definiálva, hogy a kivonatfüggvény képe a különálló egyesítésük legyen.

Szegmenselhelyezések

Tegyük fel, hogy a szegmens 102027 a szóban forgó sorhoz van társítva. A sor egy, az egyik feldolgozóban hívott github_events_102027 táblában olvasható vagy írható. A metaadattáblákban tárolt információk alapján a bővítmény határozza meg, hogy mi az adott feldolgozó. A szegmensek munkavégzőhöz való leképezését szegmenselhelyezésnek nevezzük.

A csomópont a lekérdezéseket olyan töredékekre írja át, amelyek az adott táblákra hivatkoznak, például github_events_102027 a megfelelő feldolgozókon futtatják ezeket a töredékeket. Íme egy példa egy olyan lekérdezésre, amely a színfalak mögött fut, és megkeresi a szegmenst tároló csomópontot 102027 azonosítóval.

SELECT
    shardid,
    node.nodename,
    node.nodeport
FROM pg_dist_placement placement
JOIN pg_dist_node node
  ON placement.groupid = node.groupid
 AND node.noderole = 'primary'::noderole
WHERE shardid = 102027;
┌─────────┬───────────┬──────────┐
│ shardid │ nodename  │ nodeport │
├─────────┼───────────┼──────────┤
│  102027 │ localhost │     5433 │
└─────────┴───────────┴──────────┘