Tabel dan tampilan sistem Azure Cosmos DB for PostgreSQL
BERLAKU UNTUK: Azure Cosmos DB for PostgreSQL (didukung oleh ekstensi database Citus ke PostgreSQL)
Azure Cosmos DB for PostgreSQL membuat dan memelihara tabel khusus yang berisi informasi tentang data terdistribusi dalam kluster. Node koordinator berkonsultasi dengan tabel ini saat merencanakan cara menjalankan kueri di seluruh node pekerja.
Metadata Koordinator
Azure Cosmos DB for PostgreSQL membagi setiap tabel terdistribusi menjadi beberapa pecahan logis berdasarkan kolom distribusi. Koordinator kemudian mempertahankan tabel metadata untuk melacak statistik dan informasi tentang kesehatan dan lokasi pecahan ini.
Di bagian ini, kami menjelaskan masing-masing tabel metadata dan skemanya. Anda dapat melihat dan membuat kueri tabel ini menggunakan SQL setelah masuk ke node koordinator.
Catatan
kluster yang menjalankan versi Citus Engine yang lebih lama mungkin tidak menawarkan semua tabel yang tercantum di bawah ini.
Tabel partisi
Tabel pg_dist_partiotion menyimpan metadata tentang tabel dalam database yang terdistribusi. Untuk setiap tabel terdistribusi, informasi tentang metode distribusi dan informasi terperinci tentang kolom distribusi juga disimpan.
Nama | Tipe | Deskripsi |
---|---|---|
logicalrelid | regclass | Tabel terdistribusi yang terkait dengan baris ini. Nilai ini mereferensikan kolom relfilenode dalam tabel katalog sistem pg_class. |
partmethod | char | Metode yang digunakan untuk partisi / distribusi. Nilai kolom ini yang terkait dengan metode distribusi yang berbeda ditambahkan: 'a', hash: 'h', tabel referensi: 'n' |
partkey | text | Detail informasi tentang kolom distribusi termasuk nomor kolom, jenis, dan informasi terkait lainnya. |
colocationid | Integer | Grup kolokasi tempat tabel ini berada. Tabel dalam grup yang sama memungkinkan gabungan yang dikolokasi dan rollup terdistribusi di antara pengoptimalan lainnya. Nilai ini mereferensikan kolom colocationid dalam pg_dist_colocation tabel. |
repmodel | char | Metode yang digunakan untuk replikasi data. Nilai kolom ini yang sesuai dengan metode replikasi yang berbeda adalah: Replikasi berbasis pernyataan Citus: 'c', replikasi streaming postgresql: 's', komitmen dua fase (untuk tabel referensi): '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)
Tabel shard
Tabel pg_dist_shard menyimpan metadata tentang setiap shard tabel. Pg_dist_shard berisi informasi tentang shard tabel terdistribusi mana yang termasuk, dan statistik tentang kolom distribusi untuk shard. Untuk lampiran tabel terdistribusi, statistik ini sesuai dengan nilai min / maks dari kolom distribusi. Untuk tabel terdistribusi hash, statistik ini merupakan rentang token hash yang ditetapkan untuk shard itu. Statistik ini digunakan untuk memangkas shard yang tidak terkait selama kueri SELECT.
Nama | Tipe | Deskripsi |
---|---|---|
logicalrelid | regclass | Tabel terdistribusi yang terkait dengan baris ini. Nilai ini mereferensikan kolom relfilenode dalam tabel katalog sistem pg_class. |
shardid | bigint | Pengidentifikasi unik global yang ditetapkan untuk shard ini. |
shardstorage | char | Jenis penyimpanan yang digunakan untuk shard ini. Jenis penyimpanan yang berbeda dibahas dalam tabel di bawah ini. |
shardminvalue | text | Untuk lampiran tabel terdistribusi, nilai minimum kolom distribusi dalam shard ini (inklusif). Untuk tabel terdistribusi hash, nilai token hash minimum yang ditetapkan untuk shard itu (inklusif). |
shardmaxvalue | text | Untuk lampiran tabel terdistribusi, nilai maksimum kolom distribusi dalam shard ini (inklusif). Untuk tabel terdistribusi hash, nilai token hash maksimum yang ditetapkan untuk shard itu (inklusif). |
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)
Jenis Penyimpanan Pecahan
Kolom shardstorage dalam pg_dist_shard menunjukkan jenis penyimpanan yang digunakan untuk shard. Gambaran umum singkat tentang berbagai jenis penyimpanan shard dan representasinya di bawah ini.
Jenis Penyimpanan | Nilai shardstorage | Deskripsi |
---|---|---|
TABLE | 't' | Menunjukkan bahwa shard menyimpan data milik tabel terdistribusi reguler. |
KOLUMNAR | 'c' | Menunjukkan bahwa shard menyimpan data columnar. (Digunakan oleh tabel cstore_fdw terdistribusi) |
ASING | 'f' | Menunjukkan bahwa shard menyimpan data asing. (Digunakan oleh tabel file_fdw terdistribusi) |
Tampilan informasi pecahan
Selain tabel metadata shard tingkat rendah yang dijelaskan di atas, Azure Cosmos DB for PostgreSQL menyediakan citus_shards
tampilan untuk memeriksa dengan mudah:
- Di mana setiap pecahan adalah (node, dan port),
- Meja seperti apa yang dimilikinya, dan
- Ukurannya
Tampilan ini membantu Anda memeriksa pecahan untuk menemukan, antara lain, ketidakseimbangan ukuran di seluruh node.
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 mengacu pada kelompok kolokasi.
Tabel penempatan shard
Tabel pg_dist_placement melacak lokasi replika shard pada node pekerja. Setiap replika shard yang ditetapkan ke node tertentu disebut penempatan shard. Tabel ini menyimpan informasi tentang kesehatan dan lokasi setiap penempatan shard.
Nama | Tipe | Deskripsi |
---|---|---|
shardid | bigint | Pengidentifikasi shard yang terkait dengan penempatan ini. Nilai ini mereferensikan kolom shardid dalam tabel katalog pg_dist_shard. |
shardstate | int | Menjelaskan status penempatan ini. Berbagai status shard dibahas di bagian berikut. |
shardlength | bigint | Untuk tabel terdistribusi lampiran, ukuran penempatan shard pada node pekerja dalam byte. Untuk tabel terdistribusi hash, nol. |
placementid | bigint | Pengidentifikasi otomatis yang unik untuk setiap penempatan individu. |
groupid | int | Menunjukkan sekelompok satu server utama dan nol atau lebih server sekunder saat model replikasi streaming digunakan. |
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
Status Penempatan Shard
Azure Cosmos DB for PostgreSQL mengelola kesehatan shard per penempatan. Jika penempatan menempatkan sistem dalam keadaan tidak konsisten, Azure Cosmos DB for PostgreSQL secara otomatis menandainya sebagai tidak tersedia. Status penempatan dicatat dalam tabel pg_dist_shard_placement, di dalam kolom shardstate. Berikut adalah gambaran umum singkat dari berbagai status penempatan shard:
Nama negara | Nilai Shardstate | Deskripsi |
---|---|---|
DISELESAIKAN | 1 | Status shard baru dibuat. Penempatan shard dalam keadaan ini dianggap mutakhir dan digunakan dalam perencanaan dan eksekusi kueri. |
TIDAK AKTIF | 3 | Penempatan Shard dalam keadaan ini dianggap tidak aktif karena tidak sinkron dengan replika lain dari shard yang sama. Status dapat terjadi saat penambahan, modifikasi (SISIPKAN, PERBARUI, HAPUS), atau operasi DDL gagal dilakukan untuk penempatan ini. Perencana kueri akan mengabaikan penempatan dalam keadaan ini selama perencanaan dan eksekusi. Pengguna dapat menyinkronkan data dalam pecahan ini dengan replika yang diselesaikan sebagai aktivitas latar belakang. |
TO_DELETE | 4 | Jika Azure Cosmos DB for PostgreSQL mencoba menghilangkan penempatan shard sebagai respons terhadap panggilan master_apply_delete_command dan gagal, penempatan dipindahkan ke status ini. Pengguna kemudian dapat menghapus shard ini sebagai aktivitas latar belakang berikutnya. |
Tabel node pekerja
Tabel pg_dist_node berisi informasi tentang node pekerja dalam kluster.
Nama | Tipe | Deskripsi |
---|---|---|
nodeid | int | Pengidentifikasi otomatis untuk node individual. |
groupid | int | Pengidentifikasi digunakan untuk menunjukkan sekelompok satu server utama dan nol atau lebih banyak server sekunder saat model replikasi streaming digunakan. Secara default sama dengan nodeid. |
nodename | text | Nama Host atau Alamat IP node pekerja PostgreSQL. |
nodeport | int | Nomor port di mana node pekerja PostgreSQL mendengarkan. |
noderack | text | (Opsional) Informasi penempatan rak untuk node pekerja. |
hasmetadata | Boolean | Dicadangkan untuk penggunaan internal. |
isaktif | Boolean | Apakah node aktif menerima penempatan shard. |
noderole | text | Apakah node adalah primer atau sekunder |
nodecluster | text | Nama kluster yang memuat node ini |
shouldhaveshards | Boolean | Jika salah, shard akan dipindahkan dari node (dikeringkan) saat menyeimbangkan kembali, shard dari tabel terdistribusi baru juga tidak akan ditempatkan pada node, kecuali jika dikolokasi dengan shard yang sudah ada |
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)
Tabel objek terdistribusi
Tabel citus.pg_dist_object berisi objek seperti jenis dan fungsi yang telah dibuat pada node koordinator dan disebarluaskan ke node pekerja. Ketika administrator menambahkan simpul pekerja baru ke kluster, Azure Cosmos DB for PostgreSQL secara otomatis membuat salinan objek terdistribusi pada simpul baru (dalam urutan yang benar untuk memenuhi dependensi objek).
Nama | Tipe | Deskripsi |
---|---|---|
classid | oid | Kelas objek terdistribusi |
objid | oid | ID objek dari objek terdistribusi |
objsubid | Integer | Sub ID objek dari objek terdistribusi, misalnya, attnum |
jenis | text | Bagian dari alamat stabil yang digunakan selama pemutakhiran pg |
object_names | text[] | Bagian dari alamat stabil yang digunakan selama pemutakhiran pg |
object_args | text[] | Bagian dari alamat stabil yang digunakan selama pemutakhiran pg |
distribution_argument_index | Integer | Hanya valid untuk fungsi/prosedur terdistribusi |
colocationid | Integer | Hanya valid untuk fungsi/prosedur terdistribusi |
“Alamat stabil” secara unik mengidentifikasi objek dari server tertentu secara independen. Azure Cosmos DB for PostgreSQL melacak objek selama peningkatan PostgreSQL menggunakan alamat stabil yang dibuat dengan fungsi pg_identify_object_as_address().
Berikutcontoh cara create_distributed_function()
menambahkan entri ke tabel 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 |
Tampilan skema terdistribusi
Citus 12.0 memperkenalkan konsep sharding berbasis skema dan dengan tampilan 'citus_schemas'', yang menunjukkan skema mana yang telah didistribusikan dalam sistem. Tampilan hanya mencantumkan skema terdistribusi, skema lokal tidak ditampilkan.
Nama | Tipe | Deskripsi |
---|---|---|
nama_skema | regnamespace | Nama skema terdistribusi |
colocation_id | Integer | ID kolokasi skema terdistribusi |
schema_size | text | Ringkasan ukuran yang dapat dibaca manusia dari semua objek dalam skema |
schema_owner | nama | Peran yang memiliki skema |
Berikut adalah contohnya:
schema_name | colocation_id | schema_size | schema_owner
-------------+---------------+-------------+--------------
userservice | 1 | 0 bytes | userservice
timeservice | 2 | 0 bytes | timeservice
pingservice | 3 | 632 kB | pingservice
Tampilan tabel terdistribusi
Tampilan memperlihatkan citus_tables
ringkasan semua tabel yang dikelola oleh Azure Cosmos DB for PostgreSQL (tabel terdistribusi dan referensi). Tampilan ini menggabungkan informasi dari tabel metadata Azure Cosmos DB for PostgreSQL untuk gambaran umum yang mudah dibaca manusia dari properti tabel ini:
- Jenis tabel
- Kolom distribusi
- ID grup colocation
- Ukuran yang dapat dibaca manusia
- jumlah shard
- Pemilik (pengguna database)
- Metode akses (heap atau kolum kolumnar)
Berikut adalah contohnya:
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 │
└────────────┴──────────────────┴─────────────────────┴───────────────┴────────────┴─────────────┴─────────────┴───────────────┘
Tampilan partisi waktu
Azure Cosmos DB for PostgreSQL menyediakan UDF untuk mengelola partisi untuk kasus penggunaan Data Timeseries. Ini juga mempertahankan time_partitions
pandangan untuk memeriksa partisi yang dikelolanya.
Kolom:
- parent_table tabel yang dipartisi
- partition_column kolom tempat tabel induk dipartisi
- mempartisi nama tabel partisi
- from_value batas bawah pada waktunya untuk baris di partisi ini
- to_value batas atas tepat waktu untuk baris di partisi ini
- access_method heap untuk penyimpanan berbasis baris, dan kolumnar untuk penyimpanan kolumnar
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 │
└────────────────────────┴──────────────────┴─────────────────────────────────────────┴─────────────────────┴─────────────────────┴───────────────┘
Tabel grup kolokasi
Tabel pg_dist_colocation berisi informasi tentang shard tabel mana yang harus ditempatkan bersama-sama, atau dikolokasi. Ketika dua tabel berada dalam grup kolokasi yang sama, Azure Cosmos DB for PostgreSQL memastikan pecahan dengan nilai kolom distribusi yang sama akan ditempatkan pada simpul pekerja yang sama. Kolokasi memungkinkan pengoptimalan gabungan, rollup terdistribusi tertentu, dan dukungan kunci asing. Kolokasi pecahan disimpulkan ketika shard dihitung, faktor replikasi, dan jenis kolom partisi semuanya cocok antara dua tabel; namun, grup kolokasi kustom dapat ditentukan saat membuat tabel terdistribusi, jika diinginkan.
Nama | Tipe | Deskripsi |
---|---|---|
colocationid | int | Pengidentifikasi unik untuk grup kolokasi yang sesuai dengan baris ini. |
shardcount | int | Jumlah shard untuk semua tabel dalam grup kolokasi ini |
replikasifactor | int | Faktor replikasi untuk semua tabel dalam kelompok kolokasi ini. |
distributioncolumntype | oid | Jenis kolom distribusi untuk semua tabel dalam grup kolokasi ini. |
SELECT * from pg_dist_colocation;
colocationid | shardcount | replicationfactor | distributioncolumntype
--------------+------------+-------------------+------------------------
2 | 32 | 2 | 20
(1 row)
Tabel strategi penyeimbang
Tabel ini menjelaskan strategi yang rebalance_table_shards gunakan untuk menentukan tempat memindahkan shard.
Nama | Tipe | Deskripsi |
---|---|---|
default_strategy | Boolean | Apakah rebalance_table_shards harus memilih strategi ini secara default. Gunakan citus_set_default_rebalance_strategy untuk memperbarui kolom ini |
shard_cost_function | regproc | Pengidentifikasi untuk fungsi biaya, yang harus mengambil shardid sebagai bigint, dan mengembalikan gagasannya tentang biaya, sebagai jenis nyata |
node_capacity_function | regproc | Pengidentifikasi untuk fungsi kapasitas, yang harus mengambil nodeid sebagai int, dan mengembalikan gagasannya tentang kapasitas node sebagai jenis nyata |
shard_allowed_on_node_function | regproc | Pengidentifikasi untuk fungsi yang diberikan shardid bigint, dan nodeidarg int, mengembalikan boolean untuk apakah Azure Cosmos DB for PostgreSQL dapat menyimpan shard pada simpul |
default_threshold | float4 | Ambang batas untuk menganggap node terlalu penuh atau terlalu kosong, yang menentukan kapan rebalance_table_shards harus mencoba memindahkan shard |
minimum_threshold | float4 | Perlindungan untuk mencegah argumen ambang batas rebalance_table_shards() diatur terlalu rendah |
Secara default Cosmos DB for PostgreSQL dikirim dengan strategi ini dalam tabel:
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
Strategi by_disk_size
ini menetapkan setiap shard dengan biaya yang sama. Efeknya adalah untuk menyamakan jumlah shard di seluruh node. Strategi default, by_disk_size
, menetapkan biaya ke setiap shard yang cocok dengan ukuran disknya dalam byte ditambah pecahan yang dikolokasikan dengannya. Ukuran disk dihitung menggunakan pg_total_relation_size
, termasuk indeks. Strategi ini mencoba untuk mencapai ruang disk yang sama pada setiap node. Perhatikan ambang batas 0.1
, mencegah gerakan pecahan yang tidak perlu yang disebabkan oleh perbedaan ruang disk yang tidak signifikan.
Membuat strategi penyeimbang kustom
Berikut contoh fungsi yang dapat digunakan dalam strategi penyeimbang shard baru, dan terdaftar di pg_dist_rebalance_strategy dengan fungsi citus_add_rebalance_strategy.
Mengatur pengecualian kapasitas node dengan pola hostname:
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;
Menyeimbangkan kembali dengan jumlah kueri yang masuk ke shard, sebagaimana diukur oleh 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;
Mengisolasi shard tertentu (10000) pada node (alamat ‘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;
Tabel statistik kueri
Azure Cosmos DB for PostgreSQL menyediakan citus_stat_statements
statistik tentang bagaimana kueri dijalankan, dan untuk siapa. Hal ini dianalogikan dengan (dan dapat digabungkan dengan) tampilan pg_stat_statements di PostgreSQL, yang melacak statistik tentang kecepatan kueri.
Tampilan ini dapat melacak kueri ke penyewa asal dalam aplikasi multipenyewa, yang membantu memutuskan kapan harus melakukan isolasi penyewa.
Nama | Tipe | Deskripsi |
---|---|---|
queryid | bigint | pengidentifikasi (cocok untuk gabungan pg_stat_statements) |
id pengguna | oid | pengguna yang menjalankan kueri |
dbid | oid | instans koordinator database |
pertanyaan | text | string kueri anonim |
eksekutor | text | Eksekutor Citus yang digunakan: adaptif, real-time, pelacak tugas, router, atau insert-select |
partition_key | text | nilai kolom distribusi dalam kueri yang dieksekusi router, yang lain NULL |
panggilan | bigint | berapa kali kueri dijalankan |
-- 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;
Hasil:
-[ 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
Peringatan:
- Data statistik tidak direplikasi, dan tidak akan bertahan dari crash atau kegagalan database
- Melacak sejumlah kueri terbatas, yang ditetapkan oleh GUC (default 5000)
pg_stat_statements.max
- Untuk memotong tabel, gunakan fungsi
citus_stat_statements_reset()
Aktivitas Kueri Terdistribusi
Azure Cosmos DB for PostgreSQL menyediakan tampilan khusus untuk menonton kueri dan kunci di seluruh kluster, termasuk kueri khusus shard yang digunakan secara internal untuk membangun hasil kueri terdistribusi.
- citus_dist_stat_activity: menunjukkan kueri terdistribusi yang mengeksekusi pada semua node. Superset
pg_stat_activity
, dapat digunakan di mana pun yang terakhir berada. - citus_worker_stat_activity: menunjukkan kueri pada pekerja, termasuk kueri fragmen terhadap setiap shard.
- citus_lock_waits: Kueri yang diblokir di seluruh kluster.
Dua tampilan pertama mencakup semua kolom pg_stat_activity ditambah host host/port pekerja yang memulai kueri dan host/port node koordinator kluster.
Misalnya, pertimbangkan untuk menghitung baris dalam tabel terdistribusi:
-- run from worker on localhost:9701
SELECT count(*) FROM users_table;
Kita dapat melihat bahwa kueri muncul di 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
Kueri ini memerlukan informasi dari semua shard. Beberapa informasi dalam shard users_table_102038
, yang kebetulan disimpan di localhost:9700
. Kita bisa melihat kueri yang mengakses shard dengan melihat tampilan 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
Bidang query
menunjukkan data yang disalin keluar dari shard yang akan dihitung.
Catatan
Jika kueri router (misalnya penyewa tunggal di aplikasi multi-penyewa, 'PILIH
- DARI tabel TEMPAT tenant_id = X') dieksekusi tanpa blok transaksi, maka master_query_host_name dan kolom master_query_host_port akan menjadi NULL dalam citus_worker_stat_activity.
Berikut adalah contoh kueri berguna yang dapat Anda buat menggunakan 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;
Tampilan selanjutnya adalah citus_lock_waits
. Untuk melihat cara kerjanya, kita dapat membuat situasi penguncian secara manual. Pertama kita akan menyiapkan tabel tes dari koordinator:
CREATE TABLE numbers AS
SELECT i, 0 AS j FROM generate_series(1,10) AS i;
SELECT create_distributed_table('numbers', 'i');
Kemudian, dengan menggunakan dua sesi pada koordinator, kita dapat menjalankan urutan pernyataan ini:
-- session 1 -- session 2
------------------------------------- -------------------------------------
BEGIN;
UPDATE numbers SET j = 2 WHERE i = 1;
BEGIN;
UPDATE numbers SET j = 3 WHERE i = 1;
-- (this blocks)
Tampilan citus_lock_waits
menunjukkan situasi.
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
Dalam contoh ini kueri berasal dari koordinator, tetapi tampilan juga dapat mencantumkan kunci antara kueri yang berasal dari pekerja (dijalankan dengan Azure Cosmos DB for PostgreSQL MX misalnya).
Langkah berikutnya
- Pelajari bagaimana beberapa fungsi Azure Cosmos DB for PostgreSQL mengubah tabel sistem
- Tinjau konsep node dan tabel