Tables et vues système Azure Cosmos DB for PostgreSQL

S’APPLIQUE À : Azure Cosmos DB for PostgreSQL (avec l’extension de base de données Citus pour PostgreSQL)

Azure Cosmos DB for PostgreSQL crée et gère des tables spéciales qui contiennent des informations sur les données distribuées dans le cluster. Le nœud coordinateur consulte ces tables lors de la planification de l’exécution de requêtes sur les nœuds Worker.

Métadonnées du coordinateur

Azure Cosmos DB for PostgreSQL divise chaque table distribuée en plusieurs partitions logiques en fonction de la colonne de distribution. Le coordinateur gère ensuite les tables de métadonnées pour effectuer le suivi des statistiques et des informations sur l’intégrité et l’emplacement de ces partitions.

Dans cette section, nous décrivons chacune de ces tables de métadonnées et leur schéma. Vous pouvez afficher et interroger ces tables à l’aide de SQL après vous être connecté au nœud coordinateur.

Notes

Il se peut que des clusters exécutant des versions antérieures du Citus Engine ne proposent pas toutes les tables répertoriées ci-dessous.

Table de partition

La table pg_dist_partition stocke les métadonnées sur les tables de la base de données qui sont distribuées. Pour chaque table distribuée, elle stocke également des informations sur la méthode de distribution et des informations détaillées sur la colonne de distribution.

Nom Type Description
logicalrelid regclass Table distribuée à laquelle cette ligne correspond. Cette valeur fait référence à la colonne relfilenode de la table du catalogue système pg_class.
partmethod char Méthode utilisée pour le partitionnement/la distribution. Les valeurs de cette colonne correspondant aux différentes méthodes de distribution sont Append : « a », Hash : « h », table de référence : « n »
partkey text Informations détaillées sur la colonne de distribution, y compris le numéro de colonne, le type et d’autres informations pertinentes.
colocationid entier Groupe de colocation auquel cette table appartient. Les tables dans le même groupe autorisent les jointures colocalisées et les cumuls distribués entre autres optimisations. Cette valeur fait référence à la colonne colocationid de la table pg_dist_colocation.
repmodel char Méthode utilisée pour la réplication des données. Les valeurs de cette colonne correspondant aux différentes méthodes de réplication sont les suivantes : Réplication basée sur une instruction Citus : « c », réplication de streaming PostgreSQL : « s », validation en deux phases (pour les tables de référence) : « 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)

Table partition

La table pg_dist_shard stocke les métadonnées relatives aux partitions individuelles d’une table. Pg_dist_shard contient des informations sur la table distribuée à laquelle appartiennent les partitions et des statistiques sur la colonne de distribution pour partitions. Pour des tables distribuées append, ces statistiques correspondent aux valeurs min/max de la colonne de distribution. Pour des tables distribuées par hachage, il s’agit de plages de jetons de hachage affectées à cette partition. Ces statistiques sont utilisées pour nettoyer les partitions non liés pendant les requêtes SELECT.

Nom Type Description
logicalrelid regclass Table distribuée à laquelle cette ligne correspond. Cette valeur fait référence à la colonne relfilenode de la table du catalogue système pg_class.
shardid bigint Identificateur général unique affecté à la partition.
shardstorage char Type de stockage utilisé pour cette partition. Les différents types de stockage sont décrits dans le tableau ci-dessous.
shardminvalue text Pour les tables distribuées append, valeur minimale de la colonne de distribution dans cette partition (valeur incluse). Pour les tables distribuées hash, il s’agit de la valeur minimale de jetons de hachage affectées à cette partition (valeur incluse).
shardmaxvalue text Pour les tables distribuées append, valeur maximale de la colonne de distribution dans cette partition (valeur incluse). Pour les tables distribuées hash, il s’agit de la valeur maximale de jetons de hachage affectées à cette partition (valeur incluse).
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)

Type de stockage Azure

La colonne shardstorage dans pg_dist_shard indique le type de stockage utilisé pour la partition. Vous trouverez ci-dessous un bref aperçu des différents types de stockage de partition et de leur représentation.

Type de stockage Valeur shardstorage Description
TABLE « t » Indique que shard stocke les données appartenant à une table distribuée normale.
COLUMNAR « c » Indique que shard stocke les données en colonnes. (Utilisé par les tables de cstore_fdw distribuées)
FOREIGN « f » Indique que shard stocke des données étrangères. (Utilisé par les tables de file_fdw distribuées)

Vue des informations sur les partitions

En plus de la table de métadonnées de partition de bas niveau décrite ci-dessus, Azure Cosmos DB for PostgreSQL fournit une vue citus_shards qui permet de vérifier facilement :

  • l’emplacement de chaque partition (nœud et port) ;
  • le type de table auquel elle appartient ;
  • sa taille.

Cette vue vous permet d’examiner les partitions pour trouver, entre autres, tout déséquilibre de taille entre les nœuds.

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

L’identificateur colocation_id fait référence au groupe de colocalisation.

Table de sélection élective de partition

La table pg_dist_placement suit l’emplacement des réplicas de partition sur les nœuds Worker. Chaque réplica d’une partition affectée à un nœud spécifique est appelé une sélection élective de partition. Cette table stocke des informations relatives à l’intégrité et l’emplacement de chaque sélection élective de partition.

Nom Type Description
shardid bigint Identificateur de partition associé à ce sélection élective. Cette valeur fait référence à la colonne shardid de la table du catalogue pg_dist_shard.
shardstate int Décrit l’état de cette sélection élective. Les différents états de partition sont décrits dans la section ci-dessous.
shardlength bigint Pour des tables distribuées append, taille en octets de la sélection élective de partition sur le nœud Worker. Pour les tables de hachage distribuées, zéro.
placementid bigint Identificateur unique généré automatiquement pour chaque sélection élective individuelle.
groupid int Distingue un groupe d’un serveur principal et zéro, un ou plusieurs serveurs secondaires lors de l’utilisation du modèle de réplication de streaming.
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

États de sélection élective de partition

Azure Cosmos DB for PostgreSQL gère l’intégrité des partitions sur la base de leur sélection élective. Si une sélection élective place le système dans un état incohérent, Azure Cosmos DB for PostgreSQL la marque automatiquement comme indisponible. L’état de sélection élective est enregistré dans la table pg_dist_shard_placement, dans la colonne shardstate. Voici un bref aperçu des différents états de sélection élective de partition :

Nom de l’état Valeur shardstate Description
FINALIZED 1 L’état dans lequel les nouvelles partitions sont créées. Les sélections électives de partition dans cet état sont considérées à jour et utilisées dans la planification et l’exécution des requêtes.
INACTIVE 3 Les sélections électives de partition dans cet état sont considérés comme inactifs en raison d’une désynchronisation avec d’autres réplicas de la même partition. L’état peut se produire lorsqu’une opération d’ajout, de modification (INSERT, UPDATE, DELETE) ou de DDL échoue pour cet emplacement. Le planificateur de requêtes ignorera les sélections électives dans cet état au cours de la planification et de l’exécution. Les utilisateurs peuvent synchroniser les données de ces partitions avec un réplica finalisé en tant qu’activité en arrière-plan.
TO_DELETE 4 Si Azure Cosmos DB for PostgreSQL tente de supprimer une sélection élective de partition en réponse à un appel de master_apply_delete_command et échoue, le placement est déplacé vers cet état. Les utilisateurs peuvent ensuite supprimer ces partitions en tant qu’activité d’arrière-plan suivante.

Table de nœud Worker

La table pg_dist_node contient des informations sur les nœuds Worker du cluster.

Nom Type Description
nodeId int Identificateur généré automatiquement pour un nœud individuel.
groupid int Identificateur utilisé pour distinguer un groupe d’un serveur principal et zéro, un ou plusieurs serveurs secondaires lors de l’utilisation du modèle de réplication de streaming. Par défaut, il est identique au nodeid.
nodename text Nom d’hôte ou adresse IP du nœud Worker PostgreSQL.
nodeport int Numéro de port sur lequel le nœud worker PostgreSQL écoute.
noderack text (Facultatif) Informations de sélection élective du rack pour le nœud Worker.
hasmetadata boolean Réservé à un usage interne.
isactive boolean Indique si le nœud est actif et accepte les sélections électives de partition.
noderole text Si le nœud est un nœud principal ou secondaire
nodecluster text Nom du cluster contenant ce nœud
shouldhaveshards boolean Si la valeur est false, les partitions sont déplacées hors du nœud (drainées) lors du rééquilibrage, et les partitions de nouvelles tables distribuées sont placées sur le nœud, sauf s’ils sont colocalisés avec des partitions déjà présentes.
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)

Table d’objet distribuée

La table citus.pg_dist_object contient une liste d’objets tels que les types et les fonctions qui ont été créés sur le nœud coordinateur et propagés aux nœuds Worker. Lorsqu’un administrateur ajoute de nouveaux nœuds Worker au cluster, Azure Cosmos DB for PostgreSQL crée automatiquement des copies des objets distribués sur les nouveaux nœuds (dans le bon ordre pour répondre aux dépendances des objets).

Nom Type Description
classid oid Classe de l’objet distribué
objid oid ID d’objet de l’objet distribué
objsubid entier Sous-ID d’objet de l’objet distribué, par exemple, attnum
type text Partie de l’adresse stable utilisée lors des mises à niveau de pg
object_names text[] Partie de l’adresse stable utilisée lors des mises à niveau de pg
object_args text[] Partie de l’adresse stable utilisée lors des mises à niveau de pg
distribution_argument_index entier Valide uniquement pour les fonctions/procédures distribuées
colocationid entier Valide uniquement pour les fonctions/procédures distribuées

Les adresses stables identifient de manière unique les objets indépendamment d’un serveur spécifique. Azure Cosmos DB for PostgreSQL effectue le suivi des objets au cours d’une mise à niveau PostgreSQL à l’aide d’adresses stables créées avec la fonction pg_identify_object_as_address().

Voici un exemple de comment create_distributed_function() ajoute des entrées à la table citus.pg_dist_object :

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                |

Vue de schémas distribués

Citus 12.0 a introduit le concept de partitionnement basé sur le schéma, et avec lui la vue « citus_schemas », qui montre quels schémas ont été distribués dans le système. La vue liste uniquement les schémas distribués ; les schémas locaux ne sont pas affichés.

Nom Type Description
schema_name regnamespace Nom du schéma distribué
colocation_id entier ID de colocalisation du schéma distribué
schema_size texte Synthèse de la taille (lisible par l’homme) de tous les objets dans le schéma
schema_owner name Rôle propriétaire du schéma

Voici un exemple :

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

Vue des tables distribuées

La vue citus_tables présente un résumé de toutes les tables gérées par Azure Cosmos DB for PostgreSQL (tables distribuées et de référence). La vue combine les informations des tables de métadonnées Azure Cosmos DB for PostgreSQL pour offrir une vue d’ensemble conviviale des propriétés de table suivantes :

  • Type de la table
  • Colonne de distribution
  • ID de groupe de colocalisation
  • Taille explicite
  • Nombre de partitions
  • Propriétaire (utilisateur de base de données)
  • Méthode d’accès (segment de mémoire ou en colonnes)

Voici un exemple :

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

Vue des partitions de temps

Azure Cosmos DB pour PostgreSQL fournit des fonctions définies par l’utilisateur (UDF) permettant de gérer des partitions pour le cas d’utilisation des données de série chronologique. Il tient également à jour une vue time_partitions pour inspecter les partitions qu’il gère.

Colonnes :

  • parent_table : table partitionnée
  • partition_column : colonne sur laquelle la table parente est partitionnée
  • partition : nom d’une table de partition
  • from_value : limite temporelle inférieure pour les lignes de cette partition
  • to_value : limite temporelle supérieure pour les lignes de cette partition
  • access_method : heap pour le stockage basé sur les lignes et columnar pour le stockage en colonnes
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          │
└────────────────────────┴──────────────────┴─────────────────────────────────────────┴─────────────────────┴─────────────────────┴───────────────┘

Table de groupe de colocation

La table pg_dist_colocation contient des informations sur les tables partitions devant être placées ensemble ou colocalisée. Lorsque deux tables se trouvent dans le même groupe de colocalisation, Azure Cosmos DB for PostgreSQL garantit que les partitions avec les mêmes valeurs de colonne de distribution seront placées sur les mêmes nœuds Worker. La colocation active les optimisations de jointure, certains rollups distribués et la prise en charge de clé étrangère. La colocalisation de partition est déduite lorsque le nombre de partitions, les facteurs de réplication et les types de colonne de partition correspondent tous entre deux tables. Toutefois, un groupe de colocalisation personnalisé peut être spécifié lors de la création d’une table distribuée, si vous le souhaitez.

Nom Type Description
colocationid int Identificateur unique du groupe de colocation auquel cette ligne correspond.
shardcount int Nombre de partitions pour toutes les tables de ce groupe de colocation
replicationfactor int Facteur de réplication pour toutes les tables de ce groupe de colocation.
distributioncolumntype oid Type de la colonne de distribution pour toutes les tables de ce groupe de colocation.
SELECT * from pg_dist_colocation;
  colocationid | shardcount | replicationfactor | distributioncolumntype 
 --------------+------------+-------------------+------------------------
			 2 |         32 |                 2 |                     20
  (1 row)

Table de stratégie de rééquilibrage

Ce tableau définit les stratégies que rebalance_table_shards peut utiliser pour déterminer où déplacer les partitions.

Nom Type Description
default_strategy boolean Indique si rebalance_table_shards doit choisir cette stratégie par défaut. Utiliser citus_set_default_rebalance_strategy pour mettre à jour cette colonne
shard_cost_function regproc Identificateur d’une fonction cost, qui doit prendre un shardid en tant que bigint et retourner sa notion de cost comme type réel
node_capacity_function regproc Identificateur d’une fonction capacity, qui doit prendre un nodeid en tant que int et retourner sa notion de node capacity (capacité de nœud) comme type réel
shard_allowed_on_node_function regproc Identificateur pour une fonction qui, avec un shardid bigint et un nodeidarg int donnés, retourne une valeur booléenne indiquant si Azure Cosmos DB for PostgreSQL peut stocker la partition sur le nœud
default_threshold float4 Seuil pour estimer qu’un nœud est trop plein ou trop vide, qui détermine quand le rebalance_table_shards doit essayer de déplacer les partitions
minimum_threshold float4 Protection permettant d’empêcher de définir l’argument du seuil rebalance_table_shards() à un niveau trop bas

Par défaut, Azure Cosmos DB for PostgreSQL est fourni avec les stratégies suivantes dans la table :

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

La stratégie by_disk_size affecte à chaque partition le même coût. Son effet est d’égaliser le nombre de partition entre les nœuds. La stratégie par défaut, by_disk_size, attribue un coût à chaque partition correspondant à sa taille de disque en octets plus celle des partitions colocalisées avec. La taille du disque est calculée à l’aide de pg_total_relation_size, ce qui signifie qu’elle comprend des index. Cette stratégie tente d’obtenir le même espace disque sur chaque nœud. Notez le seuil de 0.1, qui empêche les mouvements de partition inutiles causés par des différences non significatives dans l’espace disque.

Création de stratégies de rééquilibrage personnalisées

Voici des exemples de fonctions qui peuvent être utilisées dans les nouvelles stratégies de rééquilibrage partition et enregistrées dans le pg_dist_rebalance_strategy avec la fonction citus_add_rebalance_strategy.

  • Définition d’une exception de capacité de nœud par modèle de nom d’hôte :

    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;
    
  • Rééquilibrage en fonction du nombre de requêtes qui accèdent à un partition, tel qu’il est mesuré par le citus_stat_statements:

    -- 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;
    
  • Isolation d’une partition spécifique (10000) sur un nœud (adresse 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;
    

Table des statistiques sur les requêtes

Azure Cosmos DB for PostgreSQL fournit citus_stat_statements pour des statistiques sur la façon dont les requêtes sont exécutées et pour qui. Elle est analogue à (et peut être joint avec) la vue pg_stat_statements dans PostgreSQL, qui effectue le suivi des statistiques sur la vitesse des requêtes.

Cette vue peut suivre les requêtes jusqu’aux locataires d’origine dans une application multilocataire, ce qui permet de décider quand procéder à l’isolation des locataires.

Nom Type Description
queryid bigint identificateur (correct pour les jointures de pg_stat_statements)
userid oid utilisateur qui a exécuté la requête
dbid oid instance de base de données du coordinateur
query text chaîne de requête anonyme
exécuteur text Citus executor utilisé : adaptatif, en temps réel, suivi des tâches, routeur ou insert-select
partition_key text valeur de la colonne de distribution dans les requêtes exécutées par le routeur, sinon NULL
calls bigint nombre de fois où la requête a été exécutée
-- 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;

Résultats :

-[ 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

Avertissements :

  • Les données de statistiques ne sont pas répliquées et ne survivent pas à des pannes de base de données ou à un basculement
  • Effectue le suivi d’un nombre limité de requêtes, défini par le pg_stat_statements.max GUC (par défaut 5000)
  • Pour tronquer la table, utilisez la fonction citus_stat_statements_reset()

Activité des requêtes distribuées

Azure Cosmos DB for PostgreSQL fournit des affichages spéciaux pour surveiller les requêtes et les verrous dans le cluster, y compris les requêtes spécifiques à une partition utilisées en interne pour générer les résultats des requêtes distribuées.

  • citus_dist_stat_activity : affiche les requêtes distribuées qui s’exécutent sur tous les nœuds. Sur-ensemble de pg_stat_activity, utilisable partout où se trouve ce dernier.
  • citus_worker_stat_activity : affiche les requêtes sur les Workers, y compris les requêtes de fragment sur les partitions individuels.
  • citus_lock_waits : Requêtes bloquées dans le cluster.

Les deux premières vues incluent toutes les colonnes de pg_stat_activity plus l’hôte/port hôte du Worker qui a initié la requête et l’hôte/port du nœud coordinateur du cluster.

Par exemple, envisagez de compter les lignes dans une table distribuée :

-- run from worker on localhost:9701

SELECT count(*) FROM users_table;

Nous pouvons voir que la requête apparaît dans citus_dist_stat_activity :

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

Cette requête nécessite des informations de toutes les partitions. Certaines informations se trouvent dans la partition users_table_102038, qui est stockée dans localhost:9700. Nous pouvons voir une requête qui accède à la partition en examinant l’affichage 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

Le champ query affiche les données copiées en dehors de la partition à compter.

Notes

Si une requête de routeur (par exemple, un locataire unique dans une application multi-entité, `SELECT

  • FROM_table_WHERE_tenant_id = X’) est exécutée sans bloc de transaction, alors les colonnes master_query_host_name et master_query_host_port seront NULL dans citus_worker_stat_activity.

Voici des exemples de requêtes utiles que vous pouvez générer à l’aide de citus_worker_stat_activity :

-- 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;

La vue suivante est citus_lock_waits. Pour voir comment elle fonctionne, nous pouvons générer une situation de verrouillage manuellement. Tout d’abord, nous allons configurer une table de test à partir du coordinateur :

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

Ensuite, à l’aide de deux sessions sur le coordinateur, nous pouvons exécuter cette séquence d’instructions :

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

L’affichage citus_lock_waits montre la situation.

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

Dans cet exemple, les requêtes proviennent du coordinateur, mais l’affichage peut également répertorier les verrous entre les requêtes provenant de rôles de travail (exécutées, par exemple, avec Azure Cosmos DB for PostgreSQL MX).

Étapes suivantes