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.
Feljegyzé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.
Név | Típus | Leírás |
---|---|---|
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 | bejárónő | 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 | bejárónő | 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 metszésére szolgálnak a SELECT-lekérdezések során.
Név | Típus | Leírás |
---|---|---|
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 | bejárónő | 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.
Név | Típus | Leírás |
---|---|---|
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 | 0 | 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 (INSERT, UPDATE, DELETE) vagy egy DDL-művelet nem sikerül 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.
Név | Típus | Leírás |
---|---|---|
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).
Név | Típus | Leírás |
---|---|---|
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.
Név | Típus | Leírás |
---|---|---|
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ó.
Név | Típus | Leírás |
---|---|---|
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.
Név | Típus | Leírás |
---|---|---|
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_size
minden 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_size
az 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.
Név | Típus | Leírás |
---|---|---|
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 |
végrendeleti végrehajtó | 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_activity
haszná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_activity
jelenik 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_102038
van, amely történetesen a következő helyen localhost:9700
van 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.
Feljegyzés
Ha útválasztó-lekérdezés (pl. egybérlős több-bérlős alkalmazásban, "SELECT"
- 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_activity
hozhat 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
- Megtudhatja, hogy egyes Azure Cosmos DB for PostgreSQL-függvények hogyan módosítják a rendszertáblákat
- A csomópontok és táblák fogalmainak áttekintése
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: