Csomópontok és táblák az Azure Cosmos DB for PostgreSQL-ben

A KÖVETKEZŐKRE VONATKOZIK: Azure Cosmos DB for PostgreSQL (a Citus adatbázisbővítménye a PostgreSQL-re)

Csomópontok

Az Azure Cosmos DB for PostgreSQL lehetővé teszi a PostgreSQL-kiszolgálók (úgynevezett csomópontok) számára, hogy egy "megosztott semmit" architektúrában összehangolják egymással. A fürtök csomópontjai együttesen több adatot tárolnak, és több processzormagot használnak, mint amennyi egyetlen kiszolgálón lehetséges lenne. 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.

Koordinátor és munkavállalók

Minden fürtnek van egy koordinátori csomópontja és több feldolgozója. Az alkalmazások elküldik a lekérdezéseiket a koordinátor csomópontnak, amely továbbítja azokat az érintett dolgozóknak, és összegyűjti az eredményeket.

Az Azure Cosmos DB for PostgreSQL lehetővé teszi, hogy az adatbázis-rendszergazda táblákat és/vagy sémákat terjesszen , különböző sorokat tárolva különböző feldolgozó csomópontokon. Az elosztott táblák és/vagy sémák az Azure Cosmos DB for PostgreSQL teljesítményének kulcsai. A táblák és/vagy sémák elosztásának sikertelensége teljesen a koordinátori csomóponton marad, és nem tudja kihasználni a gépközi párhuzamosság előnyeit.

Az elosztott táblákon lévő összes lekérdezés esetében a koordinátor vagy egyetlen feldolgozó csomópontra irányítja, vagy több különböző területen párhuzamosítja, attól függően, 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 koordinátor a metaadattáblák megtekintésével dönti el, hogy mi a teendő. Ezek a táblák nyomon követik a feldolgozó csomópontok DNS-nevét és állapotát, valamint az adatok csomópontok közötti elosztását.

Táblázattípusok

A fürtökben öt táblatípus található, amelyek mindegyike más-más módon van tárolva a csomópontokon, és különböző célokra használatos.

1. típus: Elosztott táblák

Az első típus és a leggyakoribb az elosztott táblák. Úgy tűnik, hogy az SQL-utasítások normál táblái, de vízszintesen vannak particionálva a munkavégző csomópontok között. Ez azt jelenti, hogy a tábla sorai különböző csomópontokon, szegmensek nevű töredéktáblákban vannak tárolva.

Az Azure Cosmos DB for PostgreSQL nem csak SQL- és DDL-utasításokat futtat egy fürtben. Az elosztott tábla sémájának módosítása kaszkádolt, így a tábla összes szegmense frissíthető a feldolgozók között.

Terjesztési oszlop

Az Azure Cosmos DB for PostgreSQL algoritmikus skálázást használ a sorok szegmensekhez való hozzárendeléséhez. A hozzárendelés determinisztikus módon történik a terjesztési oszlopnak nevezett táblaoszlop értéke alapján. A fürt rendszergazdájának ezt az oszlopot kell kijelölnie egy tábla terjesztésekor. A teljesítmény és a funkcionalitás szempontjából fontos a megfelelő választás.

2. típus: Referenciatáblák

A referenciatáblák olyan elosztott táblák, amelyek teljes tartalma egyetlen szegmensre van koncentrálva. A szegmens minden feldolgozón replikálódik. Bármely feldolgozó lekérdezései helyileg hozzáférhetnek a referenciaadatokhoz, anélkül, hogy a hálózat többletterhelése sorokat kér egy másik csomóponttól. A referenciatáblák nem rendelkeznek terjesztési oszlopokkal, mert nem kell egymástól elkülöníteni a szegmenseket soronként.

A referenciatáblák általában kicsik, és a munkavégző csomópontokon futó lekérdezések szempontjából releváns adatok tárolására szolgálnak. Ilyenek például a számbavételi értékek, például a rendelési állapotok vagy a termékkategóriák.

3. típus: Helyi táblák

Az Azure Cosmos DB for PostgreSQL használatakor a koordinátor csomópont, amelyhez csatlakozik, egy normál PostgreSQL-adatbázis. Létrehozhat rendes táblákat a koordinátoron, és dönthet úgy, hogy nem szilánkok.

A helyi táblák jó jelöltje olyan kis adminisztratív táblák, amelyek nem vesznek részt az illesztési lekérdezésekben. Ilyen például az users alkalmazás bejelentkezésére és hitelesítésére szolgáló táblázat.

4. típus: Helyi felügyelt táblák

Az Azure Cosmos DB for PostgreSQL automatikusan hozzáadhat helyi táblákat a metaadatokhoz, ha egy helyi tábla és egy referenciatábla között idegen kulcshivatkozás található. Emellett a helyileg felügyelt táblák manuálisan is létrehozhatók create_reference_table citus_add_local_table_to_metadata függvény normál helyi táblákon való végrehajtásával. A metaadatokban található táblák felügyelt tábláknak minősülnek, és bármely csomópontról lekérdezhetők, a Citus tudja, hogy a koordinátorhoz kell irányítania az adatokat a helyi felügyelt táblából. Az ilyen táblák helyiként jelennek meg citus_tables nézetben.

5. típus: Sématáblák

A Citus 12.0-s verziójában bevezetett sémaalapú horizontális skálázás esetén az elosztott sémák automatikusan társítva lesznek az egyes társhelycsoportokhoz. Az ezekben a sémákban létrehozott táblák automatikusan megosztott elosztott táblákká alakulnak szilánkkulcs nélkül. Ezek a táblák sématábláknak minősülnek, és sémaként jelennek meg citus_tables nézetben.

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

A pg_dist_shard koordinátor metaadattáblája a rendszer minden elosztott táblájának egyes szegmenseihez tartalmaz egy sort. A sor egyezik a szegmensazonosítóval egy kivonattér egész számtartományával (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 koordinátor 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ó. Melyik feldolgozó? Ezt teljes egészében a metaadattáblák határozzák meg. A szegmensek munkavégzőhöz való leképezését szegmenselhelyezésnek nevezzük.

A koordinátor 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 szegmensazonosítót 102027 tároló csomópontot.

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 │
└─────────┴───────────┴──────────┘

Következő lépések