PostgreSQL için Azure Cosmos DB sistem tabloları ve görünümleri

ŞUNLAR IÇIN GEÇERLIDIR: PostgreSQL için Azure Cosmos DB (PostgreSQL'e citus veritabanı uzantısıyla desteklenir)

PostgreSQL için Azure Cosmos DB, kümedeki dağıtılmış veriler hakkında bilgi içeren özel tablolar oluşturur ve bunları korur. Koordinatör düğümü, çalışan düğümleri arasında sorgu çalıştırmayı planlarken bu tablolara başvurur.

Koordinatör Meta Verileri

PostgreSQL için Azure Cosmos DB, dağıtılan her tabloyu dağıtım sütununa göre birden çok mantıksal parçaya böler. Ardından koordinatör, bu parçaların durumu ve konumu hakkındaki istatistikleri ve bilgileri izlemek için meta veri tablolarını tutar.

Bu bölümde, bu meta veri tablolarının her birini ve şemalarını açıklayacağız. Koordinatör düğümünde oturum açtıktan sonra SQL kullanarak bu tabloları görüntüleyebilir ve sorgulayabilirsiniz.

Dekont

Citus Altyapısı'nın eski sürümlerini çalıştıran kümeler aşağıda listelenen tüm tabloları sunmayabilir.

Bölüm tablosu

pg_dist_partition tablosu, veritabanındaki hangi tabloların dağıtıldığına ilişkin meta verileri depolar. Her dağıtılmış tablo için, dağıtım yöntemi hakkındaki bilgileri ve dağıtım sütunu hakkında ayrıntılı bilgileri de depolar.

Veri Akışı Adı Tür Tanım
logicalrelid regclass Bu satırın karşılık gelen dağıtılmış tablo. Bu değer, pg_class sistem kataloğu tablosundaki relfilenode sütununa başvurur.
partmethod char Bölümleme /dağıtım için kullanılan yöntem. Bu sütunun farklı dağıtım yöntemlerine karşılık gelen değerleri şunlardır: 'a', karma: 'h', başvuru tablosu: 'n'
partkey text Sütun numarası, tür ve diğer ilgili bilgiler de dahil olmak üzere dağıtım sütunu hakkında ayrıntılı bilgiler.
colocationid integer Bu tablonun ait olduğu ortak konum grubu. Aynı gruptaki tablolar, diğer iyileştirmeler arasında birlikte bulunan birleştirmelere ve dağıtılmış toplamalara izin verir. Bu değer, pg_dist_colocation tablosundaki colocationid sütununa başvurur.
repmodel char Veri çoğaltma için kullanılan yöntem. Bu sütunun farklı çoğaltma yöntemlerine karşılık gelen değerleri şunlardır: Citus deyimi tabanlı çoğaltma: 'c', postgresql akış çoğaltması: 's', iki aşamalı işleme (başvuru tabloları için): '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)

Parça tablosu

pg_dist_shard tablosu, tablonun tek tek parçalarıyla ilgili meta verileri depolar. Pg_dist_shard, dağıtılmış tablo parçalarının ait olduğu bilgiler ve parçalar için dağıtım sütunuyla ilgili istatistikler bulunur. Dağıtılmış tabloları ekleme için, bu istatistikler dağıtım sütununun en düşük / en yüksek değerlerine karşılık gelir. Karma dağıtılmış tablolar için bu parçaya atanmış karma belirteç aralıklarıdır. Bu istatistikler, SELECT sorguları sırasında ilgisiz parçaları ayıklamak için kullanılır.

Veri Akışı Adı Tür Tanım
logicalrelid regclass Bu satırın karşılık gelen dağıtılmış tablo. Bu değer, pg_class sistem kataloğu tablosundaki relfilenode sütununa başvurur.
shardid bigint Bu parçaya atanan genel benzersiz tanımlayıcı.
parça fırtınası char Bu parça için kullanılan depolama türü. Aşağıdaki tabloda farklı depolama türleri ele alınmıştı.
shardminvalue text Dağıtılmış tabloları ekleme için, bu parçadaki dağıtım sütununun en düşük değeri (dahil). Karma dağıtılmış tablolar için, bu parçaya atanan en düşük karma belirteci değeri (dahil).
shardmaxvalue text Dağıtılmış tabloları ekleme için, bu parçadaki dağıtım sütununun en büyük değeri (dahil). Karma dağıtılmış tablolar için, bu parçaya atanan karma belirteç değeri üst sınırı (dahil).
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)

Parça Depolama Türleri

pg_dist_shard'daki parça deposu sütunu, parça için kullanılan depolama türünü gösterir. Farklı parça depolama türlerine ve bunların gösterimine kısa bir genel bakış aşağıdadır.

Depolama Türü Shardstorage değeri Tanım
TABLO 't' Parçanın normal bir dağıtılmış tabloya ait verileri depoladığını gösterir.
SÜTUNLU 'c' Parçanın sütunlu verileri depoladığını gösterir. (Dağıtılmış cstore_fdw tabloları tarafından kullanılır)
YABANCI 'f' Parçanın yabancı verileri depoladığını gösterir. (Dağıtılmış file_fdw tabloları tarafından kullanılır)

Parça bilgileri görünümü

Yukarıda açıklanan alt düzey parça meta veri tablosuna ek olarak, PostgreSQL için Azure Cosmos DB kolayca denetlenecek bir citus_shards görünüm sağlar:

  • Her parçanın olduğu yer (düğüm ve bağlantı noktası),
  • Ne tür bir tabloya ait olduğunu ve
  • Boyutu

Bu görünüm, düğümler arasındaki tüm boyut dengesizliklerini bulmak için parçaları incelemenize yardımcı olur.

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

colocation_id birlikte bulundurma grubuna başvurur.

Parça yerleştirme tablosu

pg_dist_placement tablosu, çalışan düğümlerindeki parça çoğaltmalarının konumunu izler. Belirli bir düğüme atanan bir parçanın her çoğaltmasına parça yerleştirme adı verilir. Bu tablo, her parça yerleşiminin durumu ve konumu hakkında bilgi depolar.

Veri Akışı Adı Tür Tanım
shardid bigint Bu yerleştirmeyle ilişkili parça tanımlayıcısı. Bu değer, pg_dist_shard katalog tablosundaki parçalı sütuna başvurur.
shardstate int Bu yerleştirmenin durumunu açıklar. Aşağıdaki bölümde farklı parça durumları açıklanmıştır.
parça boyu bigint Dağıtılmış tabloları ekleme için, çalışan düğümündeki parça yerleşiminin bayt cinsinden boyutu. Karma dağıtılmış tablolar için sıfır.
placementid bigint Her bir yerleştirme için benzersiz otomatik oluşturulan tanımlayıcı.
groupid int Akış çoğaltma modeli kullanıldığında bir birincil sunucu ve sıfır veya daha fazla ikincil sunucudan oluşan bir grubu belirtir.
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

Parça Yerleştirme Durumları

PostgreSQL için Azure Cosmos DB parça durumunu yerleştirme temelinde yönetir. Bir yerleştirme sistemi tutarsız bir duruma getirirse PostgreSQL için Azure Cosmos DB otomatik olarak kullanılamaz olarak işaretler. Yerleştirme durumu, shardstate sütununun içindeki pg_dist_shard_placement tablosuna kaydedilir. Aşağıda farklı parça yerleştirme durumlarının kısa bir genel bakışı yer alır:

Eyalet adı Shardstate değeri Tanım
KESİNLEŞMİŞ 1 Yeni parçaların oluşturulduğu durum. Bu durumdaki parça yerleşimleri güncel kabul edilir ve sorgu planlama ve yürütmede kullanılır.
ETKİN OLMAYAN 3 Bu durumdaki parça yerleşimleri, aynı parçanın diğer çoğaltmalarıyla eşitlenmemiş olması nedeniyle devre dışı olarak kabul edilir. Ekleme, değişiklik (INSERT, UPDATE, DELETE) veya bu yerleştirme için bir DDL işlemi başarısız olduğunda durum oluşabilir. Sorgu planlayıcısı, planlama ve yürütme sırasında bu durumdaki yerleşimleri yoksayar. Kullanıcılar bu parçalardaki verileri son haline getirilmiş bir çoğaltmayla arka plan etkinliği olarak eşitleyebilir.
TO_DELETE 4 PostgreSQL için Azure Cosmos DB bir master_apply_delete_command çağrısına yanıt olarak parça yerleşimini bırakmayı denerse ve başarısız olursa yerleştirme bu duruma taşınır. Kullanıcılar daha sonra arka plan etkinliği olarak bu parçaları silebilir.

Çalışan düğümü tablosu

pg_dist_node tablosu, kümedeki çalışan düğümleri hakkında bilgi içerir.

Veri Akışı Adı Tür Tanım
nodeid int Tek bir düğüm için otomatik olarak oluşturulan tanımlayıcı.
groupid int Akış çoğaltma modeli kullanıldığında bir birincil sunucu grubunu ve sıfır veya daha fazla ikincil sunucu grubunu belirtmek için kullanılan tanımlayıcı. Varsayılan olarak nodeid ile aynıdır.
nodename text PostgreSQL çalışan düğümünün Ana Bilgisayar Adı veya IP Adresi.
nodeport int PostgreSQL çalışan düğümünü dinleyen bağlantı noktası numarası.
noderack text (İsteğe bağlı) Çalışan düğümü için raf yerleştirme bilgileri.
Hasmetadata boolean dahili kullanım için ayrılmıştır.
ısactive boolean Düğümün parça yerleşimlerini kabul ederek etkin olup olmadığı.
noderole text Düğümün birincil mi yoksa ikincil mi olduğu
nodecluster text Bu düğümü içeren kümenin adı
shouldhaveshards boolean False ise, parçalar yeniden dengelenirken düğümden taşınır (boşaltılır) veya yeni dağıtılmış tablolardaki parçalar zaten orada bulunan parçalarla birlikte bulunmadıkları sürece düğüme yerleştirilmez
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)

Dağıtılmış nesne tablosu

citus.pg_dist_object tablosu, koordinatör düğümünde oluşturulmuş ve çalışan düğümlerine yayılan türler ve işlevler gibi nesnelerin listesini içerir. Bir yönetici kümeye yeni çalışan düğümleri eklediğinde, PostgreSQL için Azure Cosmos DB yeni düğümlerde dağıtılmış nesnelerin kopyalarını otomatik olarak oluşturur (nesne bağımlılıklarını karşılamak için doğru sırada).

Veri Akışı Adı Tür Tanım
Classıd Oıd Dağıtılmış nesnenin sınıfı
Objid Oıd Dağıtılmış nesnenin Nesne Kimliği
objsubid integer Dağıtılmış nesnenin nesne alt kimliği, örneğin, attnum
tür text Pg yükseltmeleri sırasında kullanılan kararlı adresin bir bölümü
object_names metin[] Pg yükseltmeleri sırasında kullanılan kararlı adresin bir bölümü
object_args metin[] Pg yükseltmeleri sırasında kullanılan kararlı adresin bir bölümü
distribution_argument_index integer Yalnızca dağıtılmış işlevler/yordamlar için geçerlidir
colocationid integer Yalnızca dağıtılmış işlevler/yordamlar için geçerlidir

"Kararlı adresler", nesneleri belirli bir sunucudan bağımsız olarak benzersiz olarak tanımlar. PostgreSQL için Azure Cosmos DB, pg_identify_object_as_address() işleviyle oluşturulan kararlı adresleri kullanarak PostgreSQL yükseltmesi sırasında nesneleri izler.

Aşağıda tabloya girdilerin nasıl create_distributed_function() eklediğine ilişkin bir örnek verilmiştir 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                |

Dağıtılmış şemalar görünümü

Citus 12.0 şema tabanlı parçalama kavramını ve bununla birlikte sistemde hangi şemaların dağıtıldığını gösteren 'citus_schemas'' görünümünü tanıttı. Görünümde yalnızca dağıtılmış şemalar listelenir, yerel şemalar görüntülenmez.

Veri Akışı Adı Tür Tanım
Schema_name regnamespace Dağıtılmış şemanın adı
colocation_id integer Dağıtılmış şemanın ortak konum kimliği
schema_size text Şemadaki tüm nesnelerin okunabilir boyut özeti
schema_owner name Şemanın sahibi olan rol

Örnek:

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

Dağıtılmış tablolar görünümü

Görünümde citus_tables PostgreSQL için Azure Cosmos DB (dağıtılmış ve başvuru tabloları) tarafından yönetilen tüm tabloların özeti gösterilir. Görünüm, postgreSQL için Azure Cosmos DB meta veri tablolarındaki bilgileri birleştirerek bu tablo özelliklerine kolay ve okunabilir bir genel bakış sağlar:

  • Tablo türü
  • Dağıtım sütunu
  • Birlikte bulundurma grubu kimliği
  • İnsan tarafından okunabilen boyut
  • Parça sayısı
  • Sahip (veritabanı kullanıcısı)
  • Access yöntemi (yığın veya sütunlu)

Örnek:

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

Zaman bölümleri görünümü

PostgreSQL için Azure Cosmos DB, Timeseries Data kullanım örneğinin bölümlerini yönetmek için UDF'ler sağlar. Ayrıca, yönettiği bölümleri incelemek için bir time_partitions görünüm de tutar.

Sütun:

  • Bölümlenmiş tabloyu parent_table
  • Üst tablonun bölümlendiği sütunu partition_column
  • bölüm tablosunun adını bölümleme
  • Bu bölümdeki satırlar için zaman içinde alt sınır from_value
  • Bu bölümdeki satırlar için zaman içinde üst sınır to_value
  • Satır tabanlı depolama için access_method yığını ve sütunlu depolama için sütunlu
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          │
└────────────────────────┴──────────────────┴─────────────────────────────────────────┴─────────────────────┴─────────────────────┴───────────────┘

Birlikte bulundurma grubu tablosu

pg_dist_colocation tablosu, hangi tabloların parçalarının bir araya yerleştirilmesi veya birlikte bulunması gerektiği hakkında bilgi içerir. İki tablo aynı ortak konum grubunda olduğunda PostgreSQL için Azure Cosmos DB, aynı dağıtım sütunu değerlerine sahip parçaların aynı çalışan düğümlerine yerleştirilmesini sağlar. Birlikte bulundurma birleştirme iyileştirmelerini, belirli dağıtılmış toplamaları ve yabancı anahtar desteğini etkinleştirir. Parça sayıları, çoğaltma faktörleri ve bölüm sütun türlerinin tümü iki tablo arasında eşleştiğinde parça birlikte bulundurması çıkarılır; ancak, isterseniz dağıtılmış tablo oluşturulurken özel bir birlikte bulundurma grubu belirtilebilir.

Veri Akışı Adı Tür Tanım
colocationid int Bu satırın karşılık gelen ortak konum grubu için benzersiz tanımlayıcı.
shardcount int Bu birlikte bulundurma grubundaki tüm tablolar için parça sayısı
replicationfactor int Bu ortak konum grubundaki tüm tablolar için çoğaltma faktörü.
distributioncolumntype Oıd Bu birlikte bulundurma grubundaki tüm tablolar için dağıtım sütununun türü.
SELECT * from pg_dist_colocation;
  colocationid | shardcount | replicationfactor | distributioncolumntype 
 --------------+------------+-------------------+------------------------
			 2 |         32 |                 2 |                     20
  (1 row)

Yeniden dengeleyici stratejisi tablosu

Bu tablo, rebalance_table_shards parçaların nereye taşındığını belirlemek için kullanabileceği stratejileri tanımlar.

Veri Akışı Adı Tür Tanım
default_strategy boolean rebalance_table_shards bu stratejiyi varsayılan olarak seçip seçmeyeceğini. Bu sütunu güncelleştirmek için citus_set_default_rebalance_strategy kullanın
shard_cost_function regproc Bir parçalı parça değerini bigint olarak alması ve maliyet gösterimini gerçek tür olarak döndürmesi gereken bir maliyet işlevinin tanımlayıcısı
node_capacity_function regproc Bir nodeid değerini int olarak alması ve düğüm kapasitesi gösterimini gerçek tür olarak döndürmesi gereken kapasite işlevinin tanımlayıcısı
shard_allowed_on_node_function regproc shardid bigint ve nodeidarg int verilen bir işlevin tanımlayıcısı, PostgreSQL için Azure Cosmos DB'nin parçanın düğümde depolanıp depolanmadığına ilişkin boole değeri verir
default_threshold float4 Bir düğümün çok dolu veya çok boş olduğunu kabul etmek için eşik, rebalance_table_shards parçaları taşımaya ne zaman çalışması gerektiğini belirler
minimum_threshold float4 rebalance_table_shards() eşik bağımsız değişkeninin çok düşük ayarlanmasını önlemeye yönelik bir koruma

PostgreSQL için Cosmos DB varsayılan olarak tabloda şu stratejilerle birlikte gösterilir:

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

Strateji by_disk_size , her parçaya aynı maliyeti atar. Bunun etkisi, parça sayısını düğümler arasında eşitlemektir. Varsayılan strateji olan by_disk_size, disk boyutuyla eşleşen her parçaya bayt cinsinden artı birlikte bulunan parçaların maliyetini atar. Disk boyutu kullanılarak pg_total_relation_sizehesaplanır, bu nedenle dizinleri içerir. Bu strateji, her düğümde aynı disk alanını elde etmeye çalışır. eşiğine 0.1dikkat edin, disk alanında önemsiz farklılıklardan kaynaklanan gereksiz parça hareketini engeller.

Özel yeniden dengeleyici stratejileri oluşturma

Aşağıda, yeni parça yeniden dengeleyici stratejilerinde kullanılabilen ve citus_add_rebalance_strategy işleviylepg_dist_rebalance_strategy kaydedilen işlevlere örnekler verilmiştir.

  • Konak adı düzenine göre düğüm kapasitesi özel durumu ayarlama:

    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;
    
  • Citus_stat_statements ölçüldükçe parçaya giden sorgu sayısına göre yeniden dengeleme:

    -- 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;
    
  • Düğümde belirli bir parça (10000) yalıtılıyor ('10.0.0.1' adresi):

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

Sorgu istatistikleri tablosu

PostgreSQL için Azure Cosmos DB sorguların nasıl ve kim için yürütülmekte olduğu hakkında istatistikler sağlar citus_stat_statements . PostgreSQL'de sorgu hızıyla ilgili istatistikleri izleyen pg_stat_statements görünümüne benzer (ve bu görünümle birleştirilebilir).

Bu görünüm, çok kiracılı bir uygulamadaki kaynak kiracılara yönelik sorguları izleyebilir ve bu da kiracı yalıtımının ne zaman gerçekleştirildiğine karar verirken yardımcı olur.

Veri Akışı Adı Tür Tanım
Queryıd bigint tanımlayıcı (pg_stat_statements birleşimler için iyidir)
kullanıcı kimliği Oıd sorguyu çalıştıran kullanıcı
Dbıd Oıd koordinatörün veritabanı örneği
query text anonimleştirilmiş sorgu dizesi
Executor text Kullanılan Citus yürütücüsü: uyarlamalı, gerçek zamanlı, görev izleyicisi, yönlendirici veya insert-select
partition_key text yönlendirici tarafından yürütülen sorgularda dağıtım sütununun değeri, değilse NULL
Aramalar bigint sorgunun kaç kez çalıştırıldığı
-- 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;

Sonuçlar:

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

Uyarılar:

  • İstatistik verileri çoğaltılmıyor ve veritabanı kilitlenmelerine veya yük devretmeye devam etmeyecek
  • GUC tarafından ayarlanan sınırlı sayıda sorguyu pg_stat_statements.max izler (varsayılan 5000)
  • Tabloyu kesilmek için işlevini kullanın citus_stat_statements_reset()

Dağıtılmış Sorgu Etkinliği

PostgreSQL için Azure Cosmos DB, dağıtılmış sorgular için sonuçları oluşturmak için dahili olarak kullanılan parçaya özgü sorgular dahil olmak üzere küme genelinde sorguları ve kilitleri izlemek için özel görünümler sağlar.

  • citus_dist_stat_activity: Tüm düğümlerde yürütülen dağıtılmış sorguları gösterir. üst kümesi, ikincisinin pg_stat_activityolduğu her yerde kullanılabilir.
  • citus_worker_stat_activity: Tek tek parçalara yönelik parça sorguları da dahil olmak üzere çalışanlarla ilgili sorguları gösterir.
  • citus_lock_waits: Küme genelinde engellenen sorgular.

İlk iki görünüm, pg_stat_activity tüm sütunlarının yanı sıra sorguyu başlatan çalışanın ana bilgisayar/bağlantı noktasını ve kümenin koordinatör düğümünün ana bilgisayar/bağlantı noktasını içerir.

Örneğin, dağıtılmış tablodaki satırları saymayı göz önünde bulundurun:

-- run from worker on localhost:9701

SELECT count(*) FROM users_table;

Sorgunun içinde citus_dist_stat_activitygöründüğünü görebiliriz:

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

Bu sorgu tüm parçalardan bilgi gerektirir. Bilgilerin bazıları içinde depolanmış olan parça users_table_102038içindedir localhost:9700. Görünüme bakarak citus_worker_stat_activity parçaya erişen bir sorgu görebiliriz:

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

alanında query , sayılacak parçadan kopyalanan veriler gösterilir.

Dekont

Bir yönlendirici sorgusu (örneğin, çok kiracılı bir uygulamada tek kiracılı bir sorguysa, 'SELECT

  • FROM tablosu WHERE tenant_id = X') bir işlem bloğu olmadan yürütülür, ardından master_query_host_name ve master_query_host_port sütunları citus_worker_stat_activity null olur.

Aşağıda kullanarak citus_worker_stat_activityoluşturabileceğiniz yararlı sorgu örnekleri verilmiştir:

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

Sonraki görünüm şeklindedir citus_lock_waits. Nasıl çalıştığını görmek için el ile bir kilitleme durumu oluşturabiliriz. İlk olarak koordinatörden bir test tablosu ayarlayacağız:

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

Ardından, koordinatörde iki oturum kullanarak şu deyim dizisini çalıştırabiliriz:

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

Görünümde citus_lock_waits durum gösterilir.

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

Bu örnekte sorgular koordinatörden kaynaklanmıştır, ancak görünüm çalışanlardan kaynaklanan sorgular arasındaki kilitleri de listeleyebilir (örneğin PostgreSQL için Azure Cosmos DB MX ile yürütülür).

Sonraki adımlar