Dane rozproszone w Azure Database for PostgreSQL — skalowanie (Citus)Distributed data in Azure Database for PostgreSQL – Hyperscale (Citus)

W tym artykule opisano trzy typy tabel w Azure Database for PostgreSQL — funkcja Citus).This article outlines the three table types in Azure Database for PostgreSQL – Hyperscale (Citus). Pokazuje, jak tabele rozproszone są przechowywane jako fragmentów, i sposób, w jaki fragmentów są umieszczane w węzłach.It shows how distributed tables are stored as shards, and the way that shards are placed on nodes.

Typy tableTable types

Istnieją trzy typy tabel w grupie serwerów ze skalą (Citus), z których każdy jest używany do różnych celów.There are three types of tables in a Hyperscale (Citus) server group, each used for different purposes.

Typ 1: tabele rozproszoneType 1: Distributed tables

Pierwszy typ, a najpopularniejsze, są tabelami rozproszonymi.The first type, and most common, is distributed tables. Wyglądają one jako normalne tabele do instrukcji SQL, ale są one podzielone na partycje w węzłach procesu roboczego.They appear to be normal tables to SQL statements, but they're horizontally partitioned across worker nodes. Oznacza to, że wiersze tabeli są przechowywane w różnych węzłach w tabelach fragmentów o nazwie fragmentów.What this means is that the rows of the table are stored on different nodes, in fragment tables called shards.

Funkcja przeskalowania (Citus) jest uruchamiana nie tylko SQL, ale instrukcje języka DDL w całym klastrze.Hyperscale (Citus) runs not only SQL but DDL statements throughout a cluster. Zmiana schematu rozproszonej tabeli kaskadowej w celu zaktualizowania wszystkich fragmentów tabeli między pracownikami.Changing the schema of a distributed table cascades to update all the table's shards across workers.

Kolumna dystrybucjiDistribution column

Funkcja przeskaling (Citus) używa algorytmu fragmentowania do przypisywania wierszy do fragmentów.Hyperscale (Citus) uses algorithmic sharding to assign rows to shards. Przypisanie jest wykonywane w sposób deterministyczny na podstawie wartości kolumny tabeli zwanej kolumną dystrybucji.The assignment is made deterministically based on the value of a table column called the distribution column. Administrator klastra musi wyznaczyć tę kolumnę podczas dystrybucji tabeli.The cluster administrator must designate this column when distributing a table. Wybór właściwego wyboru jest istotny dla wydajności i funkcjonalności.Making the right choice is important for performance and functionality.

Typ 2: tabele odwołańType 2: Reference tables

Tabela referencyjna jest typem rozproszonej tabeli, której cała zawartość jest skoncentrowana na jednym fragmentu.A reference table is a type of distributed table whose entire contents are concentrated into a single shard. Fragmentu jest replikowana na każdym procesie roboczym.The shard is replicated on every worker. Zapytania dotyczące dowolnego pracownika mogą uzyskać dostęp do informacji referencyjnych lokalnie, bez narzutu sieciowego żądającego wierszy z innego węzła.Queries on any worker can access the reference information locally, without the network overhead of requesting rows from another node. Tabele referencyjne nie mają kolumny dystrybucji, ponieważ nie ma potrzeby odróżniania oddzielnych fragmentów na wiersz.Reference tables have no distribution column because there's no need to distinguish separate shards per row.

Tabele odwołań są zwykle małe i są używane do przechowywania danych, które są istotne dla zapytań uruchomionych w dowolnym węźle procesu roboczego.Reference tables are typically small and are used to store data that's relevant to queries running on any worker node. Przykładem są wartości wyliczane, takie jak Stany zamówień lub kategorie produktów.An example is enumerated values like order statuses or product categories.

Typ 3: tabele lokalneType 3: Local tables

W przypadku używania funkcji Citus (preskalowanie) węzeł koordynatora, z którym nawiązujesz połączenie, jest zwykłą bazą danych PostgreSQL.When you use Hyperscale (Citus), the coordinator node you connect to is a regular PostgreSQL database. Można utworzyć zwykłe tabele na koordynatorze i zrezygnować z ich fragmentu.You can create ordinary tables on the coordinator and choose not to shard them.

Dobrym kandydatem do tabel lokalnych byłyby małe tabele administracyjne, które nie uczestniczą w zapytaniach sprzężenia.A good candidate for local tables would be small administrative tables that don't participate in join queries. Przykładem jest tabela użytkownicy do logowania i uwierzytelniania aplikacji.An example is a users table for application sign-in and authentication.

FragmentówShards

W poprzedniej sekcji opisano, jak tabele rozproszone są przechowywane jako fragmentów w węzłach procesu roboczego.The previous section described how distributed tables are stored as shards on worker nodes. W tej sekcji omówiono więcej szczegółów technicznych.This section discusses more technical details.

pg_dist_shardTabela metadanych w koordynatorze zawiera wiersz dla każdej fragmentu tabeli rozproszonej w systemie.The pg_dist_shard metadata table on the coordinator contains a row for each shard of each distributed table in the system. Wiersz jest zgodny z IDENTYFIKATORem fragmentu z zakresem liczb całkowitych w przestrzeni skrótów (shardminvalue, shardmaxvalue).The row matches a shard ID with a range of integers in a hash space (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)

Jeśli węzeł koordynatora chce określić, które fragmentu przechowuje wiersz github_events , miesza wartość kolumny dystrybucji w wierszu.If the coordinator node wants to determine which shard holds a row of github_events, it hashes the value of the distribution column in the row. Następnie węzeł sprawdzi, który ' zakres fragmentu zawiera wartość zmieszaną.Then the node checks which shard's range contains the hashed value. Zakresy są zdefiniowane, aby obraz funkcji skrótu był ich rozłącznym złożeniem.The ranges are defined so that the image of the hash function is their disjoint union.

FragmentuShard placements

Załóżmy, że fragmentu 102027 jest skojarzony z danym wierszem.Suppose that shard 102027 is associated with the row in question. Wiersz jest odczytywany lub zapisywana w tabeli o nazwie github_events_102027 w jednym z procesów roboczych.The row is read or written in a table called github_events_102027 in one of the workers. Który proces roboczy?Which worker? Jest to określane całkowicie przez tabele metadanych.That's determined entirely by the metadata tables. Mapowanie elementu fragmentu na proces roboczy jest nazywane rozmieszczeniem fragmentu.The mapping of shard to worker is known as the shard placement.

Węzeł koordynator ponownie zapisuje zapytania do fragmentów odwołujących się do określonych tabel, takich jak github_events_102027 i uruchamia te fragmenty na odpowiednich procesach roboczych.The coordinator node rewrites queries into fragments that refer to the specific tables like github_events_102027 and runs those fragments on the appropriate workers. Oto przykład zapytania uruchamianego w tle, aby znaleźć węzeł przechowujący fragmentu o IDENTYFIKATORze 102027.Here's an example of a query run behind the scenes to find the node holding shard ID 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 │
└─────────┴───────────┴──────────┘

Następne krokiNext steps