Uzly a tabulky ve službě Azure Cosmos DB for PostgreSQL

PLATÍ PRO: Azure Cosmos DB for PostgreSQL (využívající rozšíření databáze Citus do PostgreSQL)

Uzly

Azure Cosmos DB for PostgreSQL umožňuje, aby servery PostgreSQL (označované jako uzly) vzájemně koordinovaly v architektuře "shared nothing". Uzly v clusteru souhrnně obsahují více dat a používají více jader procesoru, než by bylo možné na jednom serveru. Architektura také umožňuje škálování databáze přidáním dalších uzlů do clusteru.

Koordinátor a pracovníci

Každý cluster má koordinační uzel a více pracovních procesů. Aplikace odesílají své dotazy do koordinačního uzlu, který je předává příslušným pracovníkům a shromažďuje jejich výsledky.

Azure Cosmos DB for PostgreSQL umožňuje správci databáze distribuovat tabulky nebo schémata a ukládat různé řádky do různých pracovních uzlů. Distribuované tabulky a/nebo schémata jsou klíčem k výkonu služby Azure Cosmos DB for PostgreSQL. Nedaří se distribuovat tabulky nebo schémata úplně na koordinačním uzlu a nemůžou využívat výhod paralelismu mezi počítači.

Pro každý dotaz v distribuovaných tabulkách ho koordinátor buď směruje do jednoho pracovního uzlu, nebo ho paralelizuje mezi několika v závislosti na tom, jestli se požadovaná data nacházejí v jednom uzlu nebo více. Při horizontálním dělení založeném na schématu směruje koordinátor dotazy přímo do uzlu, který je hostitelem schématu. V horizontálním dělení založeném na schématu i horizontálním dělení na základě řádků se koordinátor rozhodne, co má dělat v tabulkách metadat. Tyto tabulky sledují názvy DNS a stav pracovních uzlů a distribuci dat mezi uzly.

Typy tabulek

V clusteru je pět typů tabulek, z nichž každý je uložený jinak na uzlech a používá se pro různé účely.

Typ 1: Distribuované tabulky

Prvním typem a nejběžnějším typem jsou distribuované tabulky. Zdá se, že se jedná o normální tabulky příkazů SQL, ale jsou horizontálně rozdělené mezi pracovní uzly. To znamená, že řádky tabulky jsou uložené na různých uzlech v tabulkách fragmentů označovaných jako horizontální oddíly.

Azure Cosmos DB for PostgreSQL spouští nejen příkazy SQL, ale i DDL v celém clusteru. Změna schématu distribuovaných tabulek tak, aby se aktualizovaly všechny horizontální oddíly tabulky napříč pracovními procesy.

Distribuční sloupec

Azure Cosmos DB for PostgreSQL používá algoritmické horizontální dělení k přiřazování řádků horizontálním oddílům. Přiřazení se deterministicky provádí na základě hodnoty sloupce tabulky označovaného jako distribuční sloupec. Správce clusteru musí tento sloupec určit při distribuci tabulky. Správná volba je důležitá pro výkon a funkčnost.

Typ 2: Referenční tabulky

Referenční tabulka je typ distribuované tabulky, jejíž celý obsah je soustředěný do jednoho horizontálního oddílu. Horizontální oddíl se replikuje do každého pracovního procesu. Dotazy na jakéhokoli pracovního procesu mají přístup k referenčním informacím místně bez síťové režie při vyžádání řádků z jiného uzlu. Referenční tabulky nemají žádný distribuční sloupec, protože není potřeba rozlišovat samostatné horizontální oddíly na řádek.

Referenční tabulky jsou obvykle malé a používají se k ukládání dat, která jsou relevantní pro dotazy spuštěné na jakémkoli pracovním uzlu. Příkladem jsou výčtové hodnoty, jako jsou stavy objednávek nebo kategorie produktů.

Typ 3: Místní tabulky

Pokud používáte Službu Azure Cosmos DB for PostgreSQL, je koordinační uzel, ke kterému se připojujete, běžnou databází PostgreSQL. V koordinátoru můžete vytvořit běžné tabulky a zvolit, že je nebudete horizontálně dělit.

Vhodným kandidátem pro místní tabulky by byly malé tabulky pro správu, které se neúčastní dotazů spojení. Příkladem je users tabulka pro přihlašování a ověřování aplikací.

Typ 4: Místní spravované tabulky

Azure Cosmos DB for PostgreSQL může automaticky přidávat místní tabulky do metadat, pokud existuje odkaz na cizí klíč mezi místní tabulkou a referenční tabulkou. Kromě toho je možné místně spravované tabulky vytvořit ručně spuštěním create_reference_table citus_add_local_table_to_metadata funkce v běžných místních tabulkách. Tabulky, které jsou přítomné v metadatech, se považují za spravované tabulky a dají se dotazovat z libovolného uzlu. Citus ví, že se má směrovat do koordinátora za účelem získání dat z místní spravované tabulky. Tyto tabulky se v zobrazení citus_tables zobrazují jako místní.

Typ 5: Tabulky schématu

S horizontálním dělením založeným na schématu zavedeným v Citus 12.0 se distribuovaná schémata automaticky přidružují k jednotlivým skupinám kolokace. Tabulky vytvořené v těchto schématech se automaticky převedou na společné distribuované tabulky bez klíče horizontálního dělení. Tyto tabulky jsou považovány za tabulky schématu a zobrazují se jako schéma v citus_tables zobrazení.

Střepy

Předchozí část popisuje, jak se distribuované tabulky ukládají jako horizontální oddíly na pracovních uzlech. Tato část popisuje podrobnější technické podrobnosti.

Tabulka pg_dist_shard metadat v koordinátoru obsahuje řádek pro každý horizontální oddíl každé distribuované tabulky v systému. Řádek odpovídá ID horizontálního oddílu s rozsahem celých čísel v prostoru hash (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)

Pokud koordinační uzel chce určit, který horizontální oddíl obsahuje řádek github_events, zatřiďuje hodnotu distribučního sloupce v řádku. Uzel pak zkontroluje, který rozsah horizontálních oddílů obsahuje hodnotu hash. Rozsahy jsou definovány tak, aby obrázek funkce hash byl jejich nesouvislý sjednocení.

Umístění horizontálních oddílů

Předpokládejme, že 102027 horizontálních oddílů je přidružený k příslušnému řádku. Řádek se přečte nebo zapíše do tabulky volané github_events_102027 v jednom z pracovních procesů. Který pracovník? To je určeno zcela tabulkami metadat. Mapování horizontálních oddílů na pracovní proces se označuje jako umístění horizontálních oddílů.

Koordinační uzel přepíše dotazy do fragmentů, které odkazují na konkrétní tabulky, jako jsou github_events_102027 a spouští tyto fragmenty u příslušných pracovních procesů. Tady je příklad dotazu spuštěného na pozadí a vyhledání uzlu, který obsahuje ID horizontálního oddílu 102027.

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

Další kroky