Azure Cosmos DB for PostgreSQL のシステム テーブルとビュー
適用対象: Azure Cosmos DB for PostgreSQL (PostgreSQL の Citus データベース拡張機能を利用)
Azure Cosmos DB for PostgreSQL では、クラスター内の分散データに関する情報を含む特殊なテーブルが作成されて管理されます。 コーディネーター ノードは、ワーカー ノードにまたがるクエリを実行する方法を計画するときに、これらのテーブルを調べます。
コーディネーター メタデータ
Azure Cosmos DB for PostgreSQL は、ディストリビューション列に基づいて、各分散テーブルを複数の論理的なシャードに分割します。 コーディネーターはその後、これらのシャードの正常性と場所に関する統計や情報を追跡するためにメタデータ テーブルを管理します。
このセクションでは、これらの各メタデータ テーブルとそのスキーマについて説明します。 これらのテーブルは、コーディネーター ノードにログインした後、SQL を使用して表示したり、クエリを実行したりできます。
注意
古いバージョンの Citus Engine を実行しているクラスターでは、後の一覧で示すテーブルの一部が提供されない場合があります。
パーティション テーブル
pg_dist_partition テーブルには、データベース内のどのテーブルが分散されているかに関するメタデータが格納されます。 また、分散テーブルごとに、分散方法に関する情報とディストリビューション列に関する詳細情報も格納されます。
Name | 種類 | Description |
---|---|---|
logicalrelid | regclass | この行が対応する分散テーブル。 この値は、pg_class システム カタログ テーブル内の relfilenode 列を参照します。 |
partmethod | char | パーティション分割/分散に使用される方法。 さまざまな分散方法に対応するこの列の値は次のとおりです。追加: 'a'、ハッシュ: 'h'、参照テーブル: 'n' |
partkey | text | ディストリビューション列に関する詳細情報 (列番号、種類、その他の関連情報など)。 |
colocationid | 整数 (integer) | このテーブルが属しているコロケーション グループ。 同じグループ内のテーブルでは、他の最適化の間での併置結合や分散ロールアップが許可されます。 この値は、pg_dist_colocation テーブル内の colocationid 列を参照します。 |
repmodel | char | データ レプリケーションに使用される方法。 さまざまなレプリケーション方法に対応するこの列の値は次のとおりです。Citus ステートメント ベースのレプリケーション: 'c'、PostgreSQL ストリーミング レプリケーション: 's'、2 フェーズ コミット (参照テーブルの場合): '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)
シャード テーブル
pg_dist_shard テーブルには、テーブルの個々のシャードに関するメタデータが格納されます。 pg_dist_shard には、シャードがどの分散テーブルに属しているかに関する情報と、シャードのディストリビューション列に関する統計が含まれています。 追加分散テーブルの場合、これらの統計は、ディストリビューション列の最小/最大値に対応します。 ハッシュ分散テーブルの場合、これらは、そのシャードに割り当てられているハッシュ トークンの範囲です。 これらの統計は、SELECT クエリ中に関連のないシャードを排除するために使用されます。
Name | 種類 | Description |
---|---|---|
logicalrelid | regclass | この行が対応する分散テーブル。 この値は、pg_class システム カタログ テーブル内の relfilenode 列を参照します。 |
shardid | bigint | このシャードに割り当てられているグローバル一意識別子。 |
shardstorage | char | このシャードに使用されるストレージの種類。 さまざまなストレージの種類が後の表で説明されています。 |
shardminvalue | text | 追加分散テーブルの場合は、このシャード内のディストリビューション列の最小値 (包含)。 ハッシュ分散テーブルの場合は、そのシャードに割り当てられている最小のハッシュ トークン値 (包含)。 |
shardmaxvalue | text | 追加分散テーブルの場合は、このシャード内のディストリビューション列の最大値 (包含)。 ハッシュ分散テーブルの場合は、そのシャードに割り当てられている最大のハッシュ トークン値 (包含)。 |
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)
シャード ストレージの種類
pg_dist_shard 内の shardstorage 列は、このシャードに使用されるストレージの種類を示します。 さまざまなシャード ストレージの種類とその表現の概要を次に示します。
ストレージ型 | shardstorage の値 | Description |
---|---|---|
TABLE | 't' | シャードに通常の分散テーブルに属するデータが格納されることを示します。 |
COLUMNAR | 'c' | シャードに列指向データが格納されることを示します。 (分散 cstore_fdw テーブルによって使用されます) |
FOREIGN | 'f' | シャードに外部データが格納されることを示します。 (分散 file_fdw テーブルによって使用されます) |
シャード情報ビュー
上で説明した低レベルのシャード メタデータ テーブルに加え、Azure Cosmos DB for PostgreSQL には、以下を簡単にチェックするための citus_shards
ビューが用意されています。
- 各シャードの場所 (ノードとポート)
- それが属しているテーブルの種類
- そのサイズ
このビューはシャードの調査、特にノード間のサイズの不均衡を見つけるのに役立ちます。
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 は、コロケーション グループを表します。
シャード配置テーブル
pg_dist_placement テーブルでは、ワーカー ノード上のシャード レプリカの場所を追跡します。 特定のノードに割り当てられているシャードの各レプリカは、シャード配置と呼ばれます。 このテーブルには、各シャード配置の正常性と場所に関する情報が格納されます。
Name | 種類 | Description |
---|---|---|
shardid | bigint | この配置に関連付けられているシャード識別子。 この値は、pg_dist_shard カタログ テーブル内の shardid 列を参照します。 |
shardstate | INT | この配置の状態を示します。 さまざまなシャードの状態が後のセクションで説明されています。 |
shardlength | bigint | 追加分散テーブルの場合は、ワーカー ノード上のシャード配置のサイズ (バイト単位)。 ハッシュ分散テーブルの場合は 0。 |
placementid | bigint | 個々の配置の一意の自動生成された識別子。 |
groupid | INT | ストリーミング レプリケーション モデルが使用されている場合、1 つのプライマリ サーバーと 0 以上のセカンダリ サーバーのグループを示します。 |
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
シャード配置の状態
Azure Cosmos DB for PostgreSQL では、配置ごとにシャードの正常性が管理されます。 ある配置のためにシステムが整合性のない状態になった場合、Azure Cosmos DB for PostgreSQL は自動的にその配置を使用不可とマークします。 配置の状態は、pg_dist_shard_placement テーブルの shardstate 列内に記録されます。 さまざまなシャード配置の状態の概要を次に示します。
状態名 | shardstate の値 | Description |
---|---|---|
FINALIZED | 1 | 新しいシャードが作成されたときの状態。 この状態のシャード配置は最新と見なされ、クエリの計画や実行で使用されます。 |
INACTIVE | 3 | この状態のシャード配置は、同じシャードの他のレプリカと同期されていないため、非アクティブと見なされます。 この状態は、この配置に対する追加、変更 (INSERT、UPDATE、DELETE)、または DDL 操作が失敗したときに発生する場合があります。 クエリ プランナーは、計画および実行中にこの状態の配置を無視します。 ユーザーは、バックグラウンド アクティビティとして、これらのシャード内のデータを終了処理されたレプリカと同期できます。 |
TO_DELETE | 4 | Azure Cosmos DB for PostgreSQL が master_apply_delete_command の呼び出しに応答してシャードの配置を削除しようとして失敗した場合、その配置はこの状態に移動されます。 ユーザーはその後、以降のバックグラウンド アクティビティとしてこれらのシャードを削除できます。 |
ワーカー ノード テーブル
pg_dist_node テーブルには、クラスター内のワーカー ノードに関する情報が含まれています。
名前 | 種類 | Description |
---|---|---|
nodeid | INT | 個々のノードの自動生成された識別子。 |
groupid | INT | ストリーミング レプリケーション モデルが使用されている場合、1 つのプライマリ サーバーと 0 以上のセカンダリ サーバーのグループを示すために使用される識別子。 既定では、nodeid と同じです。 |
nodename | text | PostgreSQL ワーカー ノードのホスト名または IP アドレス。 |
nodeport | INT | PostgreSQL ワーカー ノードがリッスンしているポート番号。 |
noderack | text | (省略可能) ワーカー ノードのラック配置の情報。 |
hasmetadata | boolean | 内部使用のために予約されています。 |
isactive | boolean | ノードがアクティブでシャード配置を受け付けているかどうか。 |
noderole | text | ノードがプライマリまたはセカンダリのどちらであるか。 |
nodecluster | text | このノードが含まれているクラスターの名前。 |
shouldhaveshards | boolean | false の場合は、既にそこに存在するシャードと併置されていない限り、シャードは再調整時にノードから移動 (ドレイン) され、新しい分散テーブルのシャードがそのノードに配置されることはありません。 |
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)
分散オブジェクト テーブル
citus.pg_dist_object テーブルには、コーディネーター ノード上で作成され、ワーカー ノードに伝達された型や関数などのオブジェクトの一覧が含まれています。 管理者がクラスターに新しいワーカー ノードを追加すると、Azure Cosmos DB for PostgreSQL によってその新しいノード上に分散オブジェクトのコピーが (オブジェクトの依存関係を満たす正しい順序で) 自動的に作成されます。
名前 | 種類 | Description |
---|---|---|
classid | oid | 分散オブジェクトのクラス |
objid | oid | 分散オブジェクトのオブジェクト ID |
objsubid | 整数 (integer) | 分散オブジェクトのオブジェクト サブ ID (attnum など) |
型 | text | pg のアップグレード中に使用される安定したアドレスの一部 |
object_names | text[] | pg のアップグレード中に使用される安定したアドレスの一部 |
object_args | text[] | pg のアップグレード中に使用される安定したアドレスの一部 |
distribution_argument_index | 整数 (integer) | 分散関数/プロシージャでのみ有効 |
colocationid | 整数 (integer) | 分散関数/プロシージャでのみ有効 |
"安定したアドレス" は、特定のサーバーとは独立に、オブジェクトを一意に識別します。 Azure Cosmos DB for PostgreSQL は、pg_identify_object_as_address() 関数で作成された安定したアドレスを使って、PostgreSQL のアップグレード中にオブジェクトを追跡します。
create_distributed_function()
によって 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 |
分散スキーマ ビュー
Citus 12.0 では、 schema ベースのシャーディングの概念が導入され システムで配布されたスキーマを示す "citus_schemas" ビューが導入されました。 ビューには分散スキーマのみが一覧表示され、ローカル スキーマは表示されません。
名前 | 種類 | 説明 |
---|---|---|
schema_name | regnamespace | 分散スキーマの名前 |
colocation_id | integer | 分散スキーマのコロケーション ID |
schema_size | text | スキーマ内のすべてのオブジェクトの人間が判読できるサイズの概要 |
schema_owner | name | スキーマを所有するロール |
次に例を示します。
schema_name | colocation_id | schema_size | schema_owner
-------------+---------------+-------------+--------------
userservice | 1 | 0 bytes | userservice
timeservice | 2 | 0 bytes | timeservice
pingservice | 3 | 632 kB | pingservice
分散テーブル ビュー
citus_tables
ビューには、Azure Cosmos DB for PostgreSQL によって管理されているすべてのテーブル (分散テーブルと参照テーブル) の概要が表示されます。 このビューには Azure Cosmos DB for PostgreSQL のメタデータ テーブルからの情報がまとめられており、ユーザーはこれらのテーブルのプロパティの概要を簡単に確認できます。
- テーブルの種類です。
- ディストリビューション列
- コロケーション グループ ID
- 人が判読できるサイズ
- シャード数
- 所有者 (データベース ユーザー)
- アクセス方法 (ヒープまたはカラム)
次に例を示します。
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 │
└────────────┴──────────────────┴─────────────────────┴───────────────┴────────────┴─────────────┴─────────────┴───────────────┘
時刻パーティション ビュー
Azure Cosmos DB for PostgreSQL には、時系列データのユース ケース用にパーティションを管理するための UDF が用意されています。 また、それが管理するパーティションを調査するための time_partitions
ビューもあります。
列:
- parent_table。パーティション分割されたテーブル
- partition_column。親テーブルのパーティション分割に使用されている列
- partition。パーティション テーブルの名前
- from_value。このパーティションに含まれる行の時刻の下限
- to_value。このパーティションに含まれる行の時刻の上限
- access_method 行ベース ストレージの場合は heap、カラム型ストレージの場合は columnar
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 │
└────────────────────────┴──────────────────┴─────────────────────────────────────────┴─────────────────────┴─────────────────────┴───────────────┘
コロケーション グループ テーブル
pg_dist_colocation テーブルには、どのテーブルのシャードがまとめて配置 (つまり併置) されるかに関する情報が含まれています。 同じコロケーション グループ内に 2 つのテーブルがある場合は、Azure Cosmos DB for PostgreSQL によって確実に、ディストリビューション列の値が同じシャードが同じワーカー ノードに配置されます。 コロケーションでは、結合の最適化、特定の分散ロールアップ、外部キーのサポートが有効になります。 シャードのコロケーションは、シャード数、レプリケーション係数、パーティション列の種類がすべて 2 つのテーブル間で一致すると推論されます。ただし、必要に応じて、分散テーブルの作成時にカスタム コロケーション グループを指定できます。
名前 | 種類 | Description |
---|---|---|
colocationid | INT | この行が対応するコロケーション グループの一意識別子。 |
shardcount | INT | このコロケーション グループ内のすべてのテーブルのシャード数。 |
replicationfactor | INT | このコロケーション グループ内のすべてのテーブルのレプリケーション係数。 |
distributioncolumntype | oid | このコロケーション グループ内のすべてのテーブルのディストリビューション列の種類。 |
SELECT * from pg_dist_colocation;
colocationid | shardcount | replicationfactor | distributioncolumntype
--------------+------------+-------------------+------------------------
2 | 32 | 2 | 20
(1 row)
リバランサー戦略テーブル
このテーブルによって、rebalance_table_shards がシャードをどこに移動するかを決定するために使用できる戦略が定義されます。
Name | 種類 | Description |
---|---|---|
default_strategy | boolean | rebalance_table_shards should が既定でこの戦略を選択するかどうか。 この列を更新するには、citus_set_default_rebalance_strategy を使用します。 |
shard_cost_function | regproc | shardid を bigint として受け取り、そのコストの概念を実数型として返す必要があるコスト関数の識別子。 |
node_capacity_function | regproc | nodeid を int として受け取り、そのノード容量の概念を実数型として返す必要がある容量関数の識別子。 |
shard_allowed_on_node_function | regproc | shardid bigint と nodeidarg int を指定した関数の識別子は、Azure Cosmos DB for PostgreSQL がノードにシャードを格納できるかどうかを示すブール値を返します。 |
default_threshold | float4 | ノードをいっぱい、または空いていると見なすためのしきい値。これにより、rebalance_table_shards がいつシャードを移動しようとするかが決定されます。 |
minimum_threshold | float4 | rebalance_table_shards() のしきい値引数が低すぎる値に設定されないようにするための保護機能。 |
Cosmos DB for PostgreSQL では、次の戦略が既定でテーブルに含まれます。
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
戦略 by_disk_size
では、すべてのシャードに同じコストが割り当てられます。 その効果として、ノードにまたがってシャード数が均等になります。 既定の戦略 by_disk_size
では、ディスク サイズ (バイト単位) に加えて、それに併置されているシャードのコストを各シャードに割り当てます。 ディスク サイズは pg_total_relation_size
を使用して計算されるため、インデックスが含まれます。 この戦略では、すべてのノード上で同じディスク領域を実現しようとします。 0.1
のしきい値に注意してください。ディスク領域の重要でない違いによって発生する不要なシャードの移動を防ぎます。
カスタム リバランサー戦略の作成
新しいシャード リバランサー戦略内で使用し、citus_add_rebalance_strategy 関数で pg_dist_rebalance_strategy に登録できる関数の例を次に示します。
ホスト名のパターンによるノード容量の例外の設定:
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 で測定される、シャードにアクセスするクエリの数による再調整:
-- 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;
ノード (アドレス '10.0.0.1') 上での特定のシャード (10000) の分離:
-- 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;
クエリ統計テーブル
Azure Cosmos DB for PostgreSQL には、クエリの実行方法と対象ユーザーに関する統計のための citus_stat_statements
が用意されています。 これは、クエリ速度に関する統計を追跡する PostgreSQL の pg_stat_statements ビューに似ています (これとの結合も可能です)。
このビューでは、マルチテナント アプリケーション内の元のテナントへのクエリをトレースできます。これは、テナントの分離を実行するタイミングを決定するのに役立ちます。
名前 | 種類 | Description |
---|---|---|
queryid | bigint | 識別子 (pg_stat_statements の結合に適しています) |
userid | oid | クエリを実行したユーザー |
dbid | oid | コーディネーターのデータベース インスタンス |
query | text | 匿名化されたクエリ文字列 |
executor | text | 使用される Citus エグゼキューター: アダプティブ、リアルタイム、タスク トラッカー、ルーター、または挿入-選択 |
partition_key | text | ルーターで実行されたクエリ内のディストリビューション列の値、それ以外は NULL |
calls | bigint | クエリが実行された回数 |
-- 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;
結果:
-[ 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
注意事項:
- 統計データはレプリケートされず、データベースのクラッシュやフェールオーバーが発生すると失われます
pg_stat_statements.max
GUC (既定値は 5000) で設定される限られた数のクエリを追跡します。- テーブルを切り詰めるには、
citus_stat_statements_reset()
関数を使用します。
分散クエリのアクティビティ
Azure Cosmos DB for PostgreSQL には、分散クエリの結果を作成するために内部的に使われるシャード固有のクエリなど、クラスター全体のクエリとロックを監視するための特殊なビューがあります。
- citus_dist_stat_activity: すべてのノード上で実行されている分散クエリを表示します。
pg_stat_activity
のスーパーセットであり、後者が使用可能なすべての場所で使用できます。 - citus_worker_stat_activity: ワーカー上のクエリ (個々のシャードに対するフラグメント クエリを含む) を表示します。
- citus_lock_waits: クラスター全体のブロックされたクエリ。
最初の 2 つのビューには、pg_stat_activity のすべての列に加え、クエリを開始したワーカーのホスト/ポートと、クラスターのコーディネーター ノードのホスト/ポートが含まれています。
たとえば、分散テーブル内の行をカウントする場合を考えてみます。
-- run from worker on localhost:9701
SELECT count(*) FROM users_table;
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
このクエリには、すべてのシャードの情報が必要です。 一部の情報は、localhost:9700
に格納されているシャード users_table_102038
に存在します。 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
query
フィールドは、カウントされるシャードからデータがコピーされていることを示しています。
注意
ルーター クエリ (マルチテナント アプリケーション内のシングルテナントなど、`SELECT
- FROM table WHERE tenant_id = X`) がトランザクション ブロックなしで実行された場合、citus_worker_stat_activity の master_query_host_name および master_query_host_port 列は NULL になります。
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;
次のビューは citus_lock_waits
です。 これがどのように動作するかを確認するために、ロックの状況を手動で生成できます。 まず、コーディネーターからテスト テーブルを設定します。
CREATE TABLE numbers AS
SELECT i, 0 AS j FROM generate_series(1,10) AS i;
SELECT create_distributed_table('numbers', 'i');
次に、コーディネーターで 2 つのセッションを使用して、次の一連のステートメントを実行できます。
-- session 1 -- session 2
------------------------------------- -------------------------------------
BEGIN;
UPDATE numbers SET j = 2 WHERE i = 1;
BEGIN;
UPDATE numbers SET j = 3 WHERE i = 1;
-- (this blocks)
その状況が citus_lock_waits
ビューに表示されます。
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
この例のクエリはコーディネーターで開始されたものですが、このビューではワーカーで開始されたクエリ間のロックの一覧も表示できます (たとえば、Azure Cosmos DB for PostgreSQL MX で実行されたもの)。
次の手順
- 一部の Azure Cosmos DB for PostgreSQL 関数によるシステム テーブルの変更方法を理解する
- ノードとテーブルの概念を確認する