Azure Cosmos DB for PostgreSQL rendszertáblák és nézetek

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

Az Azure Cosmos DB for PostgreSQL speciális táblákat hoz létre és tart fenn, amelyek információkat tartalmaznak a fürt elosztott adatairól. A koordinátor csomópont ezeket a táblákat olvassa be a lekérdezések munkavégző csomópontokon való futtatásának tervezésekor.

Koordinátor metaadatai

Az Azure Cosmos DB for PostgreSQL az egyes elosztott táblákat több logikai szegmensre osztja a terjesztési oszlop alapján. A koordinátor ezután metaadattáblákat tart fenn a szegmensek állapotával és helyével kapcsolatos statisztikák és információk nyomon követéséhez.

Ebben a szakaszban ezeket a metaadattáblákat és azok sémáját ismertetjük. Ezeket a táblákat az SQL használatával tekintheti meg és kérdezheti le a koordinátor csomópontba való bejelentkezés után.

Megjegyzés:

A Citus Engine régebbi verzióit futtató fürtök nem feltétlenül tartalmazzák az alább felsorolt táblákat.

Partíciós tábla

A pg_dist_partition tábla az adatbázis tábláinak metaadatait tárolja. Minden elosztott tábla esetében a terjesztési módszerre vonatkozó információkat és a terjesztési oszlop részletes adatait is tárolja.

Name Type Description
logikai relid regclass Elosztott tábla, amelynek ez a sor megfelel. Ez az érték a pg_class rendszerkatalógus-tábla relfilenode oszlopára hivatkozik.
partmethod Char A particionáláshoz/disztribúcióhoz használt módszer. A különböző terjesztési módszereknek megfelelő oszlop értékei hozzáfűződnek: "a", kivonat: "h", referenciatábla: "n"
partkey text Részletes információk a terjesztési oszlopról, beleértve az oszlop számát, típusát és egyéb releváns információkat.
colocationid egész szám Az a közös helycsoport, amelyhez ez a tábla tartozik. Az ugyanabban a csoportban lévő táblák lehetővé teszik a közös illesztéseket és az elosztott összesítéseket más optimalizálások között. Ez az érték a pg_dist_colocation tábla colocationid oszlopára hivatkozik.
repmodel Char Az adatreplikáláshoz használt módszer. Ennek az oszlopnak a különböző replikációs módszereknek megfelelő értékei a következők: Citus utasításalapú replikáció: "c", postgresql streamelési replikáció: 's', kétfázisú véglegesítés (referenciatáblákhoz): 't'
SELECT * from pg_dist_partition;
 logicalrelid  | partmethod |                                                        partkey                                                         | colocationid | repmodel 
---------------+------------+------------------------------------------------------------------------------------------------------------------------+--------------+----------
 github_events | h          | {VAR :varno 1 :varattno 4 :vartype 20 :vartypmod -1 :varcollid 0 :varlevelsup 0 :varnoold 1 :varoattno 4 :location -1} |            2 | c
 (1 row)

Szegmenstábla

A pg_dist_shard tábla egy tábla egyes szegmenseiről tárolja a metaadatokat. Pg_dist_shard információval rendelkezik arról, hogy mely elosztott táblaszegélyekhez tartoznak, és statisztikát tartalmaz a szegmensek terjesztési oszlopáról. A hozzáfűző elosztott táblák esetében ezek a statisztikák a terjesztési oszlop minimális/ maximális értékeinek felelnek meg. Kivonatolt táblák esetén ezek a szegmenshez rendelt kivonat jogkivonat-tartományai. Ezek a statisztikák a nem kapcsolódó szegmensek eltávolítására szolgálnak Standard kiadás LECT-lekérdezések során.

Name Type Description
logikai relid regclass Elosztott tábla, amelynek ez a sor megfelel. Ez az érték a pg_class rendszerkatalógus-tábla relfilenode oszlopára hivatkozik.
shardid bigint A szegmenshez rendelt globálisan egyedi azonosító.
shardstorage Char A szegmenshez használt tároló típusa. A különböző tárolási típusokat az alábbi táblázatban tárgyaljuk.
shardminvalue text A hozzáfűző elosztott táblák esetében a szegmensben lévő terjesztési oszlop minimális értéke (beleértve a táblázatot is). Kivonatolt táblák esetén az adott szegmenshez rendelt minimális kivonatjogkivonat-érték (beleértve a szilánkot is).
shardmaxvalue text A hozzáfűző elosztott táblák esetében a szegmensben található terjesztési oszlop maximális értéke (beleértve a táblázatot is). Kivonatolt táblák esetén az adott szegmenshez rendelt kivonat jogkivonatának maximális értéke (a teljes értéket is beleértve).
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)

Szegmenstároló-típusok

A pg_dist_shard szegmenstár oszlopa a szegmenshez használt tároló típusát jelzi. Az alábbiakban röviden áttekintjük a különböző szegmenstároló-típusokat és azok ábrázolását.

Tárhelytípusa Shardstorage érték Leírás
TÁBLÁZAT 't' Azt jelzi, hogy a szegmens egy normál elosztott táblához tartozó adatokat tárol.
OSZLOPOS "c" Azt jelzi, hogy a szegmens oszlopos adatokat tárol. (Elosztott cstore_fdw táblák használják)
KÜLFÖLDI "f" Azt jelzi, hogy a szegmens külföldi adatokat tárol. (Elosztott file_fdw táblák használják)

Szegmensinformációs nézet

Az Azure Cosmos DB for PostgreSQL a fent ismertetett alacsony szintű szegmens metaadatainak táblázatán kívül a következő nézeteket citus_shards is biztosítja:

  • Az egyes szegmensek helye (csomópont és port),
  • Milyen típusú táblához tartozik, és
  • Mérete

Ez a nézet segít a szegmensek vizsgálatában, többek között a csomópontok közötti méretbeli egyensúlyhiányok megtalálásában.

SELECT * FROM citus_shards;
.
 table_name | shardid | shard_name   | citus_table_type | colocation_id | nodename  | nodeport | shard_size
------------+---------+--------------+------------------+---------------+-----------+----------+------------
 dist       |  102170 | dist_102170  | distributed      |            34 | localhost |     9701 |   90677248
 dist       |  102171 | dist_102171  | distributed      |            34 | localhost |     9702 |   90619904
 dist       |  102172 | dist_102172  | distributed      |            34 | localhost |     9701 |   90701824
 dist       |  102173 | dist_102173  | distributed      |            34 | localhost |     9702 |   90693632
 ref        |  102174 | ref_102174   | reference        |             2 | localhost |     9701 |       8192
 ref        |  102174 | ref_102174   | reference        |             2 | localhost |     9702 |       8192
 dist2      |  102175 | dist2_102175 | distributed      |            34 | localhost |     9701 |     933888
 dist2      |  102176 | dist2_102176 | distributed      |            34 | localhost |     9702 |     950272
 dist2      |  102177 | dist2_102177 | distributed      |            34 | localhost |     9701 |     942080
 dist2      |  102178 | dist2_102178 | distributed      |            34 | localhost |     9702 |     933888

A colocation_id a közös elhelyezési csoportra hivatkozik.

Szegmenselhelyezési táblázat

A pg_dist_placement tábla nyomon követi a szegmensreplikák helyét a feldolgozó csomópontokon. Egy adott csomóponthoz rendelt szegmens minden replikáját szegmenselhelyezésnek nevezzük. Ez a táblázat az egyes szegmenselhelyezések állapotával és helyével kapcsolatos információkat tárolja.

Name Type Description
shardid bigint Az elhelyezéshez társított szegmensazonosító. Ez az érték a pg_dist_shard katalógustábla szegmenses oszlopára hivatkozik.
shardstate egész Az elhelyezés állapotát ismerteti. A különböző szegmensállapotokat az alábbi szakaszban tárgyaljuk.
szegmenshossz bigint A hozzáfűző elosztott táblák esetében a szegmenselhelyezés mérete a feldolgozó csomóponton bájtban. Kivonatolt táblák esetén nulla.
elhelyezési azonosító bigint Egyedi automatikusan létrehozott azonosító minden egyes elhelyezéshez.
groupid egész A streamelési replikációs modell használatakor egy elsődleges kiszolgálóból és nulla vagy több másodlagos kiszolgálóból álló csoportot jelöl.
SELECT * from pg_dist_placement;
  shardid | shardstate | shardlength | placementid | groupid
 ---------+------------+-------------+-------------+---------
   102008 |          1 |           0 |           1 |       1
   102008 |          1 |           0 |           2 |       2
   102009 |          1 |           0 |           3 |       2
   102009 |          1 |           0 |           4 |       3
   102010 |          1 |           0 |           5 |       3
   102010 |          1 |           0 |           6 |       4
   102011 |          1 |           0 |           7 |       4

Szegmensek elhelyezési állapotai

Az Azure Cosmos DB for PostgreSQL elhelyezésenként kezeli a szegmensek állapotát. Ha egy elhelyezés inkonzisztens állapotba helyezi a rendszert, az Azure Cosmos DB for PostgreSQL automatikusan elérhetetlenként jelöli meg. Az elhelyezés állapota a pg_dist_shard_placement táblában, a shardstate oszlopban van rögzítve. Az alábbiakban röviden áttekintjük a különböző szegmenselhelyezési állapotokat:

Állam neve Shardstate-érték Leírás
VÉGLEGESÍTETT 1 A rendszer létrehozza az állapot új szegmenseit. Az ebben az állapotban lévő szegmenselhelyezések naprakésznek minősülnek, és a lekérdezések tervezésében és végrehajtásában használatosak.
INAKTÍV 3 Az ebben az állapotban lévő szegmenselhelyezések inaktívnak minősülnek, mivel nem szinkronizálódnak ugyanazon szegmens más replikáival. Az állapot akkor fordulhat elő, ha egy hozzáfűzés, módosítás (IN Standard kiadás RT, UPDATE, DELETE) vagy egy DDL-művelet nem sikerül ehhez az elhelyezéshez. A lekérdezéstervező figyelmen kívül hagyja az ebben az állapotban lévő elhelyezéseket a tervezés és a végrehajtás során. A felhasználók szinkronizálhatják az ezekben a szegmensekben lévő adatokat egy véglegesített replikával háttértevékenységként.
TO_DELETE 4 Ha az Azure Cosmos DB for PostgreSQL egy master_apply_delete_command hívásra válaszul megkísérli elvetni a szegmensek elhelyezését, az elhelyezés ebbe az állapotba kerül. A felhasználók ezt követően háttértevékenységként törölhetik ezeket a szegmenseket.

Feldolgozó csomópont táblája

A pg_dist_node tábla információkat tartalmaz a fürt feldolgozó csomópontjairól.

Name Type Description
nodeid egész Egy adott csomópont automatikus azonosítója.
groupid egész A streamelési replikációs modell használatakor egy elsődleges kiszolgáló és egy nulla vagy több másodlagos kiszolgáló csoportjának jelölésére használt azonosító. Alapértelmezés szerint ugyanaz, mint a nodeid.
csomópontnév text A PostgreSQL-feldolgozó csomópont állomásneve vagy IP-címe.
nodeport egész Portszám, amelyen a PostgreSQL-feldolgozó csomópont figyel.
noderack text (Nem kötelező) A munkavégző csomópont állványelhelyezési információi.
hasmetadata Logikai Belső használatra van fenntartva.
isactive Logikai Azt jelzi, hogy a csomópont aktív-e a szegmenselhelyezések elfogadásában.
noderole text A csomópont elsődleges vagy másodlagos
nodecluster text A csomópontot tartalmazó fürt neve
shouldhaveshards Logikai Ha hamis, a rendszer az újraegyensúlyozáskor eltávolítja a szegmenseket a csomópontról (kiüríti), és az új elosztott táblákból származó szegmensek sem lesznek elhelyezve a csomóponton, kivéve, ha már vannak szilánkok a csomóponton
SELECT * from pg_dist_node;
 nodeid | groupid | nodename  | nodeport | noderack | hasmetadata | isactive | noderole | nodecluster | shouldhaveshards
--------+---------+-----------+----------+----------+-------------+----------+----------+-------------+------------------
      1 |       1 | localhost |    12345 | default  | f           | t        | primary  | default     | t
      2 |       2 | localhost |    12346 | default  | f           | t        | primary  | default     | t
      3 |       3 | localhost |    12347 | default  | f           | t        | primary  | default     | t
(3 rows)

Elosztott objektumtábla

A citus.pg_dist_object tábla a koordinátor csomóponton létrehozott és a feldolgozó csomópontokra propagált objektumok, például típusok és függvények listáját tartalmazza. Amikor egy rendszergazda új feldolgozó csomópontokat ad hozzá a fürthöz, az Azure Cosmos DB for PostgreSQL automatikusan létrehozza az elosztott objektumok másolatait az új csomópontokon (a megfelelő sorrendben az objektumfüggőségek kielégítése érdekében).

Name Type Description
classid Oid Az elosztott objektum osztálya
objid Oid Az elosztott objektum objektumazonosítója
objsubid egész szám Az elosztott objektum objektumalazonosítója, például attnum
típus text A pg-frissítések során használt stabil cím része
object_names szöveg[] A pg-frissítések során használt stabil cím része
object_args szöveg[] A pg-frissítések során használt stabil cím része
distribution_argument_index egész szám Csak elosztott függvényekre/eljárásokra érvényes
colocationid egész szám Csak elosztott függvényekre/eljárásokra érvényes

A "stabil címek" egyedileg azonosítják az objektumokat egy adott kiszolgálótól függetlenül. Az Azure Cosmos DB for PostgreSQL a PostgreSQL-frissítés során nyomon követi az objektumokat a pg_identify_object_as_address() függvénnyel létrehozott stabil címek használatával.

Íme egy példa arra, hogyan create_distributed_function() ad hozzá bejegyzéseket a citus.pg_dist_object táblához:

CREATE TYPE stoplight AS enum ('green', 'yellow', 'red');

CREATE OR REPLACE FUNCTION intersection()
RETURNS stoplight AS $$
DECLARE
        color stoplight;
BEGIN
        SELECT *
          FROM unnest(enum_range(NULL::stoplight)) INTO color
         ORDER BY random() LIMIT 1;
        RETURN color;
END;
$$ LANGUAGE plpgsql VOLATILE;

SELECT create_distributed_function('intersection()');

-- will have two rows, one for the TYPE and one for the FUNCTION
TABLE citus.pg_dist_object;
-[ RECORD 1 ]---------------+------
classid                     | 1247
objid                       | 16780
objsubid                    | 0
type                        |
object_names                |
object_args                 |
distribution_argument_index |
colocationid                |
-[ RECORD 2 ]---------------+------
classid                     | 1255
objid                       | 16788
objsubid                    | 0
type                        |
object_names                |
object_args                 |
distribution_argument_index |
colocationid                |

Elosztott sémák nézet

A Citus 12.0 bevezette a sémaalapú horizontális skálázás fogalmát, és ezzel együtt a "citus_schemas" nézetet, amely bemutatja, hogy mely sémák lettek elosztva a rendszerben. A nézet csak az elosztott sémákat listázza, a helyi sémák nem jelennek meg.

Name Type Description
schema_name regnamespace Az elosztott séma neve
colocation_id egész szám Az elosztott séma helymeghatározási azonosítója
schema_size text A sémán belüli összes objektum emberi olvasható méretének összegzése
schema_owner név A séma tulajdonosa szerepkör

Például:

 schema_name | colocation_id | schema_size | schema_owner
-------------+---------------+-------------+--------------
 userservice |             1 | 0 bytes     | userservice
 timeservice |             2 | 0 bytes     | timeservice
 pingservice |             3 | 632 kB      | pingservice

Elosztott táblák nézet

A citus_tables nézet az Azure Cosmos DB for PostgreSQL által felügyelt összes táblát (elosztott és referenciatáblákat) jeleníti meg. A nézet az Azure Cosmos DB for PostgreSQL metaadattábláiból származó információkat egyesíti a táblatulajdonságok egyszerű, ember által olvasható áttekintéséhez:

  • Táblatípus
  • Terjesztési oszlop
  • Közös elhelyezési csoport azonosítója
  • Emberi olvasásra alkalmas méret
  • Szegmensek száma
  • Tulajdonos (adatbázis-felhasználó)
  • Hozzáférési módszer (halom vagy oszlopos)

Például:

SELECT * FROM citus_tables;
┌────────────┬──────────────────┬─────────────────────┬───────────────┬────────────┬─────────────┬─────────────┬───────────────┐
│ table_name │ citus_table_type │ distribution_column │ colocation_id │ table_size │ shard_count │ table_owner │ access_method │
├────────────┼──────────────────┼─────────────────────┼───────────────┼────────────┼─────────────┼─────────────┼───────────────┤
│ foo.test   │ distributed      │ test_column         │             1 │ 0 bytes    │          32 │ citus       │ heap          │
│ ref        │ reference        │ <none>              │             2 │ 24 GB      │           1 │ citus       │ heap          │
│ test       │ distributed      │ id                  │             1 │ 248 TB     │          32 │ citus       │ heap          │
└────────────┴──────────────────┴─────────────────────┴───────────────┴────────────┴─────────────┴─────────────┴───────────────┘

Időpartíciók nézet

Az Azure Cosmos DB for PostgreSQL UDF-eket biztosít az időbélyegek adathasználati eset partícióinak kezeléséhez. Emellett fenntartja a time_partitions felügyelt partíciók vizsgálatának nézetét is.

Oszlopok:

  • a particionált tábla parent_table
  • a szülőtábla particionálására szolgáló oszlop partition_column
  • partíciótábla nevének particionálása
  • from_value a partíció sorainak időkorlátja alacsonyabb
  • to_value a partíció sorainak időkorlátjának felső határa
  • access_method halom soralapú tároláshoz és oszlopos tároláshoz
SELECT * FROM time_partitions;
┌────────────────────────┬──────────────────┬─────────────────────────────────────────┬─────────────────────┬─────────────────────┬───────────────┐
│      parent_table      │ partition_column │                partition                │     from_value      │      to_value       │ access_method │
├────────────────────────┼──────────────────┼─────────────────────────────────────────┼─────────────────────┼─────────────────────┼───────────────┤
│ github_columnar_events │ created_at       │ github_columnar_events_p2015_01_01_0000 │ 2015-01-01 00:00:00 │ 2015-01-01 02:00:00 │ columnar      │
│ github_columnar_events │ created_at       │ github_columnar_events_p2015_01_01_0200 │ 2015-01-01 02:00:00 │ 2015-01-01 04:00:00 │ columnar      │
│ github_columnar_events │ created_at       │ github_columnar_events_p2015_01_01_0400 │ 2015-01-01 04:00:00 │ 2015-01-01 06:00:00 │ columnar      │
│ github_columnar_events │ created_at       │ github_columnar_events_p2015_01_01_0600 │ 2015-01-01 06:00:00 │ 2015-01-01 08:00:00 │ heap          │
└────────────────────────┴──────────────────┴─────────────────────────────────────────┴─────────────────────┴─────────────────────┴───────────────┘

Társhelycsoport táblája

A pg_dist_colocation tábla információkat tartalmaz arról, hogy mely táblák szegmenseit kell egymáshoz helyezni, vagy hogy melyiket kell egymás mellett elhelyezni. Ha két tábla ugyanabban a közös elhelyezési csoportban van, az Azure Cosmos DB for PostgreSQL biztosítja, hogy az azonos terjesztési oszlopértékekkel rendelkező szegmensek ugyanazon a munkavégző csomóponton legyenek elhelyezve. A kolocation lehetővé teszi az illesztés optimalizálását, bizonyos elosztott összesítéseket és a külső kulcsok támogatását. A szegmensek közötti elhelyezés akkor következik be, ha a szegmensek száma, a replikációs tényezők és a partícióoszlop-típusok megegyeznek két tábla között; az elosztott táblák létrehozásakor azonban igény szerint egyéni társhelycsoport is megadható.

Name Type Description
colocationid egész Ennek a sornak az egyedi azonosítója annak a helycsoportnak felel meg, amely ennek a sornak felel meg.
szegmensszám egész Szilánkok száma ebben a közös elhelyezési csoportban lévő összes táblához
replicationfactor egész Replikációs tényező az ebben a közös elhelyezési csoportban lévő összes táblához.
distributioncolumntype Oid Az ebben a helycsoportban lévő összes tábla terjesztési oszlopának típusa.
SELECT * from pg_dist_colocation;
  colocationid | shardcount | replicationfactor | distributioncolumntype 
 --------------+------------+-------------------+------------------------
			 2 |         32 |                 2 |                     20
  (1 row)

Újraegyensúlyozó stratégia táblázata

Ez a táblázat olyan stratégiákat határoz meg, amelyekkel rebalance_table_shards meghatározhatja a szegmensek áthelyezésének helyét.

Name Type Description
default_strategy Logikai Azt határozza meg, hogy a rebalance_table_shards alapértelmezés szerint ezt a stratégiát kell-e választania. Az oszlop frissítése a citus_set_default_rebalance_strategy használatával
shard_cost_function regproc Egy költségfüggvény azonosítója, amelynek egy shardidot nagy méretűnek kell lennie, és a költség fogalmát valós típusként kell visszaadnia
node_capacity_function regproc Egy kapacitásfüggvény azonosítója, amelynek egy csomópontazonosítót kell intnek tekintenie, és valós típusként adja vissza a csomópontkapacitás fogalmát
shard_allowed_on_node_function regproc A shardid bigintet és nodeidarg intet adó függvény azonosítója logikai értéket ad vissza annak függvényében, hogy az Azure Cosmos DB for PostgreSQL képes-e tárolni a szegmenst a csomóponton
default_threshold float4 A csomópont túl megtelt vagy túl üresnek ítélt értékének küszöbértéke, amely meghatározza, hogy a rebalance_table_shards mikor próbálja meg áthelyezni a szegmenseket
minimum_threshold float4 A rebalance_table_shards() küszöbértékargumentumának túl alacsonyra állítását megakadályozó védelem

Alapértelmezés szerint a Cosmos DB for PostgreSQL a következő stratégiákat tartalmazza a táblázatban:

SELECT * FROM pg_dist_rebalance_strategy;
-[ RECORD 1 ]-------------------+-----------------------------------
Name                            | by_shard_count
default_strategy                | false
shard_cost_function             | citus_shard_cost_1
node_capacity_function          | citus_node_capacity_1
shard_allowed_on_node_function  | citus_shard_allowed_on_node_true
default_threshold               | 0
minimum_threshold               | 0
-[ RECORD 2 ]-------------------+-----------------------------------
Name                            | by_disk_size
default_strategy                | true
shard_cost_function             | citus_shard_cost_by_disk_size
node_capacity_function          | citus_node_capacity_1
shard_allowed_on_node_function  | citus_shard_allowed_on_node_true
default_threshold               | 0.1
minimum_threshold               | 0.01

A stratégia by_disk_size minden szegmenst ugyanazzal a költséggel rendel hozzá. Ennek az a hatása, hogy kiegyenlíti a szegmensek számát a csomópontok között. Az alapértelmezett stratégia by_disk_sizeminden egyes szegmenshez hozzárendel egy költséget, amely megfelel a lemezméretének bájtban, valamint a vele együtt lévő szegmensekének. A lemezméret kiszámítása pg_total_relation_sizeaz indexeket is magában foglalja. Ez a stratégia minden csomóponton ugyanazt a lemezterületet próbálja elérni. Figyelje meg a küszöbértéket 0.1, amely megakadályozza a lemezterület jelentéktelen eltérései által okozott szükségtelen szegmensmozgást.

Egyéni kiegyensúlyozó stratégiák létrehozása

Az alábbi példák olyan függvényekre mutatnak be példákat, amelyek az új szegmens-újraegyensúlyozó stratégiákban használhatók, és amelyeket a pg_dist_rebalance_strategy regisztrálnak a citus_add_rebalance_strategy függvénnyel.

  • Csomópont kapacitáskivételének beállítása állomásnévminta szerint:

    CREATE FUNCTION v2_node_double_capacity(nodeidarg int)
        RETURNS boolean AS $$
        SELECT
            (CASE WHEN nodename LIKE '%.v2.worker.citusdata.com' THEN 2 ELSE 1 END)
        FROM pg_dist_node where nodeid = nodeidarg
        $$ LANGUAGE sql;
    
  • A szegmensre ható lekérdezések számának újraegyensúlyozása a citus_stat_statements alapján:

    -- example of shard_cost_function
    
    CREATE FUNCTION cost_of_shard_by_number_of_queries(shardid bigint)
        RETURNS real AS $$
        SELECT coalesce(sum(calls)::real, 0.001) as shard_total_queries
        FROM citus_stat_statements
        WHERE partition_key is not null
            AND get_shard_id_for_distribution_column('tab', partition_key) = shardid;
    $$ LANGUAGE sql;
    
  • Adott szegmens (10000) elkülönítése egy csomóponton (cím: '10.0.0.1'):

    -- example of shard_allowed_on_node_function
    
    CREATE FUNCTION isolate_shard_10000_on_10_0_0_1(shardid bigint, nodeidarg int)
        RETURNS boolean AS $$
        SELECT
            (CASE WHEN nodename = '10.0.0.1' THEN shardid = 10000 ELSE shardid != 10000 END)
        FROM pg_dist_node where nodeid = nodeidarg
        $$ LANGUAGE sql;
    
    -- The next two definitions are recommended in combination with the above function.
    -- This way the average utilization of nodes is not impacted by the isolated shard.
    CREATE FUNCTION no_capacity_for_10_0_0_1(nodeidarg int)
        RETURNS real AS $$
        SELECT
            (CASE WHEN nodename = '10.0.0.1' THEN 0 ELSE 1 END)::real
        FROM pg_dist_node where nodeid = nodeidarg
        $$ LANGUAGE sql;
    CREATE FUNCTION no_cost_for_10000(shardid bigint)
        RETURNS real AS $$
        SELECT
            (CASE WHEN shardid = 10000 THEN 0 ELSE 1 END)::real
        $$ LANGUAGE sql;
    

Lekérdezési statisztikai tábla

Az Azure Cosmos DB for PostgreSQL statisztikát nyújt citus_stat_statements a lekérdezések végrehajtásának módjáról, és arról, hogy kinek. A PostgreSQL pg_stat_statements nézetéhez hasonló (és összekapcsolható), amely nyomon követi a lekérdezés sebességére vonatkozó statisztikákat.

Ez a nézet le tudja követni a lekérdezéseket egy több-bérlős alkalmazásból származó bérlőkre, ami segít eldönteni, hogy mikor végezze el a bérlői elkülönítést.

Name Type Description
queryid bigint azonosító (jó pg_stat_statements illesztésekhez)
felhasználóazonosító Oid a lekérdezést futtató felhasználó
Dbid Oid a koordinátor adatbázispéldánya
Lekérdezés text anonimizált lekérdezési sztring
Executor text Citus-végrehajtó: adaptív, valós idejű, feladatkövető, útválasztó vagy insert-select
partition_key text a terjesztési oszlop értéke az útválasztó által végrehajtott lekérdezésekben, máskülönben NULL
Hívások bigint a lekérdezés futtatásának száma
-- create and populate distributed table
create table foo ( id int );
select create_distributed_table('foo', 'id');
insert into foo select generate_series(1,100);

-- enable stats
-- pg_stat_statements must be in shared_preload libraries
create extension pg_stat_statements;

select count(*) from foo;
select * from foo where id = 42;

select * from citus_stat_statements;

Eredmények:

-[ RECORD 1 ]-+----------------------------------------------
queryid       | -909556869173432820
userid        | 10
dbid          | 13340
query         | insert into foo select generate_series($1,$2)
executor      | insert-select
partition_key |
calls         | 1
-[ RECORD 2 ]-+----------------------------------------------
queryid       | 3919808845681956665
userid        | 10
dbid          | 13340
query         | select count(*) from foo;
executor      | adaptive
partition_key |
calls         | 1
-[ RECORD 3 ]-+----------------------------------------------
queryid       | 5351346905785208738
userid        | 10
dbid          | 13340
query         | select * from foo where id = $1
executor      | adaptive
partition_key | 42
calls         | 1

Ellenmondások:

  • A statisztikai adatok nincsenek replikálva, és nem fogják túlélni az adatbázis összeomlását vagy feladatátvételét
  • A GUC által pg_stat_statements.max beállított korlátozott számú lekérdezés nyomon követhető (alapértelmezett 5000)
  • A tábla csonkításához használja a függvényt citus_stat_statements_reset()

Elosztott lekérdezési tevékenység

Az Azure Cosmos DB for PostgreSQL speciális nézeteket biztosít a lekérdezések és zárolások megtekintéséhez a fürt teljes területén, beleértve az elosztott lekérdezések eredményeinek létrehozásához belsőleg használt szegmensspecifikus lekérdezéseket is.

  • citus_dist_stat_activity: az összes csomóponton végrehajtó elosztott lekérdezéseket jeleníti meg. A szuperkészlet , pg_stat_activityhasználható, ahol az utóbbi van.
  • citus_worker_stat_activity: a feldolgozók lekérdezéseit jeleníti meg, beleértve az egyes szegmensek töredezett lekérdezéseit is.
  • citus_lock_waits: Blokkolt lekérdezések a fürtben.

Az első két nézet tartalmazza a pg_stat_activity összes oszlopát, valamint a lekérdezést kezdeményező feldolgozó gazdagépét/portját, valamint a fürt koordinátor csomópontjának állomását/portját.

Fontolja meg például egy elosztott tábla sorainak megszámlálásával:

-- run from worker on localhost:9701

SELECT count(*) FROM users_table;

Láthatjuk, hogy a lekérdezés a következő helyen citus_dist_stat_activityjelenik meg:

SELECT * FROM citus_dist_stat_activity;

-[ RECORD 1 ]----------+----------------------------------
query_hostname         | localhost
query_hostport         | 9701
master_query_host_name | localhost
master_query_host_port | 9701
transaction_number     | 1
transaction_stamp      | 2018-10-05 13:27:20.691907+03
datid                  | 12630
datname                | postgres
pid                    | 23723
usesysid               | 10
usename                | citus
application\_name      | psql
client\_addr           | 
client\_hostname       | 
client\_port           | -1
backend\_start         | 2018-10-05 13:27:14.419905+03
xact\_start            | 2018-10-05 13:27:16.362887+03
query\_start           | 2018-10-05 13:27:20.682452+03
state\_change          | 2018-10-05 13:27:20.896546+03
wait\_event_type       | Client
wait\_event            | ClientRead
state                  | idle in transaction
backend\_xid           | 
backend\_xmin          | 
query                  | SELECT count(*) FROM users_table;
backend\_type          | client backend

Ez a lekérdezés minden szegmensből származó információt igényel. Az információk egy része szegmensben users_table_102038van, amely történetesen a következő helyen localhost:9700van tárolva: . A szegmenshez hozzáférő lekérdezések a nézet megtekintésével tekinthetők meg citus_worker_stat_activity :

SELECT * FROM citus_worker_stat_activity;

-[ RECORD 1 ]----------+-----------------------------------------------------------------------------------------
query_hostname         | localhost
query_hostport         | 9700
master_query_host_name | localhost
master_query_host_port | 9701
transaction_number     | 1
transaction_stamp      | 2018-10-05 13:27:20.691907+03
datid                  | 12630
datname                | postgres
pid                    | 23781
usesysid               | 10
usename                | citus
application\_name      | citus
client\_addr           | ::1
client\_hostname       | 
client\_port           | 51773
backend\_start         | 2018-10-05 13:27:20.75839+03
xact\_start            | 2018-10-05 13:27:20.84112+03
query\_start           | 2018-10-05 13:27:20.867446+03
state\_change          | 2018-10-05 13:27:20.869889+03
wait\_event_type       | Client
wait\_event            | ClientRead
state                  | idle in transaction
backend\_xid           | 
backend\_xmin          | 
query                  | COPY (SELECT count(*) AS count FROM users_table_102038 users_table WHERE true) TO STDOUT
backend\_type          | client backend

A query mező azt mutatja, hogy a megszámlálni kívánt szegmensből kimásolt adatok.

Megjegyzés:

Ha útválasztó-lekérdezés (pl. egybérlős több-bérlős alkalmazásban, "Standard kiadás LECT

  • FROM table WHERE tenant_id = X') tranzakcióblokk nélkül lesz végrehajtva, majd master_query_host_name és master_query_host_port oszlopok NULL értékűek lesznek citus_worker_stat_activity.

Az alábbiakban néhány hasznos lekérdezést talál, amelyeket a következőkkel citus_worker_stat_activityhozhat létre:

-- active queries' wait events on a certain node

SELECT query, wait_event_type, wait_event
  FROM citus_worker_stat_activity
 WHERE query_hostname = 'xxxx' and state='active';

-- active queries' top wait events

SELECT wait_event, wait_event_type, count(*)
  FROM citus_worker_stat_activity
 WHERE state='active'
 GROUP BY wait_event, wait_event_type
 ORDER BY count(*) desc;

-- total internal connections generated per node by Azure Cosmos DB for PostgreSQL

SELECT query_hostname, count(*)
  FROM citus_worker_stat_activity
 GROUP BY query_hostname;

-- total internal active connections generated per node by Azure Cosmos DB for PostgreSQL

SELECT query_hostname, count(*)
  FROM citus_worker_stat_activity
 WHERE state='active'
 GROUP BY query_hostname;

A következő nézet a következő citus_lock_waits. Annak megtekintéséhez, hogy hogyan működik, manuálisan is létrehozhatunk zárolási helyzetet. Először beállítunk egy teszttáblát a koordinátortól:

CREATE TABLE numbers AS
  SELECT i, 0 AS j FROM generate_series(1,10) AS i;
SELECT create_distributed_table('numbers', 'i');

Ezután két munkamenetet használva a koordinátoron futtathatjuk ezt az utasítássorozatot:

-- session 1                           -- session 2
-------------------------------------  -------------------------------------
BEGIN;
UPDATE numbers SET j = 2 WHERE i = 1;
                                       BEGIN;
                                       UPDATE numbers SET j = 3 WHERE i = 1;
                                       -- (this blocks)

A citus_lock_waits nézet a helyzetet mutatja.

SELECT * FROM citus_lock_waits;

-[ RECORD 1 ]-------------------------+----------------------------------------
waiting_pid                           | 88624
blocking_pid                          | 88615
blocked_statement                     | UPDATE numbers SET j = 3 WHERE i = 1;
current_statement_in_blocking_process | UPDATE numbers SET j = 2 WHERE i = 1;
waiting_node_id                       | 0
blocking_node_id                      | 0
waiting_node_name                     | coordinator_host
blocking_node_name                    | coordinator_host
waiting_node_port                     | 5432
blocking_node_port                    | 5432

Ebben a példában a lekérdezések a koordinátortól származnak, de a nézet a feldolgozóktól származó lekérdezések közötti zárolásokat is listázhatja (például az Azure Cosmos DB for PostgreSQL MX használatával).

Következő lépések