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.
Not
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.
Adı | Tür | Açıklama |
---|---|---|
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.
Adı | Tür | Açıklama |
---|---|---|
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 | Açıklama |
---|---|---|
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.
Adı | Tür | Açıklama |
---|---|---|
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 | Açıklama |
---|---|---|
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. |
TEMBEL | 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.
Adı | Tür | Açıklama |
---|---|---|
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. |
etkin değil | 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).
Adı | Tür | Açıklama |
---|---|---|
classid | 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.
Adı | Tür | Açıklama |
---|---|---|
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 | Adı | Ş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.
Adı | Tür | Açıklama |
---|---|---|
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.
Adı | Tür | Açıklama |
---|---|---|
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_size
hesaplanır, bu nedenle dizinleri içerir. Bu strateji, her düğümde aynı disk alanını elde etmeye çalışır. eşiğine 0.1
dikkat 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şleviyle pg_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.
Adı | Tür | Açıklama |
---|---|---|
queryid | bigint | tanımlayıcı (pg_stat_statements birleşimler için iyidir) |
kullanıcı kimliği | Oıd | sorguyu çalıştıran kullanıcı |
dbid | 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_activity
olduğ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_activity
gö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_102038
iç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.
Not
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_activity
oluş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
- Bazı PostgreSQL için Azure Cosmos DB işlevlerinin sistem tablolarını nasıl değiştirdiğini öğrenin
- Düğüm ve tablo kavramlarını gözden geçirme