適用於 PostgreSQL 系統數據表和檢視的 Azure Cosmos DB
適用於: Azure Cosmos DB for PostgreSQL (由 PostgreSQL 的超大規模 (Citus) 資料庫延伸模組提供)
適用於 PostgreSQL 的 Azure Cosmos DB 會建立和維護包含叢集中分散式數據相關信息的特殊數據表。 協調器節點在規劃如何跨背景工作節點執行查詢時,會參考這些數據表。
協調器元數據
適用於 PostgreSQL 的 Azure Cosmos DB 會根據散發數據行,將每個分散式數據表分割成多個邏輯分區。 協調器接著會維護元數據表,以追蹤這些分區健康情況和位置的統計數據和資訊。
在本節中,我們會描述這些元數據表及其架構。 登入協調器節點之後,您可以使用 SQL 來檢視和查詢這些資料表。
注意
執行舊版 Citus 引擎的叢集可能無法提供下列所有數據表。
數據分割數據表
pg_dist_partition數據表會儲存資料庫中哪些數據表的元數據。 針對每個分散式數據表,它也會儲存散發方法的相關信息,以及散發數據行的詳細資訊。
名稱 | 類型 | 描述 |
---|---|---|
logicalrelid | regclass | 此數據列對應的分散式數據表。 這個值會參考pg_class系統目錄數據表中的 relfilenode 數據行。 |
partmethod | char | 用於數據分割/散發的方法。 對應至不同散發方法的這個數據行值是附加:'a',哈希: 'h',參考數據表: 'n' |
partkey | text | 散發數據行的詳細資訊,包括數據行編號、類型和其他相關信息。 |
colocationid | 整數 | 此數據表所屬的共置群組。 相同群組中的數據表允許與其他優化之間的共置聯結和分散式匯總。 這個值會參考pg_dist_colocation數據表中的共置數據行。 |
repmodel | char | 用於數據復寫的方法。 對應至不同復寫方法的這個數據行值包括:Citus 語句型復寫:'c'、postgresql 串流復寫:'s'、雙階段認可(適用於參考數據表):'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 查詢期間剪除不相關的分區。
名稱 | 類型 | 描述 |
---|---|---|
logicalrelid | regclass | 此數據列對應的分散式數據表。 這個值會參考pg_class系統目錄數據表中的 relfilenode 數據行。 |
分區識別碼 | 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資料行表示用於分區的記憶體類型。 以下是不同分區記憶體類型的簡短概觀及其表示法。
儲存區類型 | 分區記憶體值 | 描述 |
---|---|---|
TABLE | 't' | 指出分區會儲存屬於一般分散式數據表的數據。 |
柱 狀 | 'c' | 表示分區會儲存單欄式數據。 (由分散式cstore_fdw數據表使用) |
FOREIGN | 'f' | 表示分區會儲存外部數據。 (分散式file_fdw數據表使用) |
分區信息檢視
除了上述低階分區元數據表之外,適用於 PostgreSQL 的 Azure Cosmos DB 還提供一個 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數據表會追蹤背景工作節點上分區複本的位置。 指派給特定節點之分區的每個複本都稱為分區放置。 此數據表會儲存每個分區放置健康情況和位置的相關信息。
名稱 | 類型 | 描述 |
---|---|---|
分區識別碼 | bigint | 與此放置相關聯的分區標識碼。 這個值會參考pg_dist_shard目錄數據表中的shardid數據行。 |
shardstate | int | 描述此位置的狀態。 下列章節將討論不同的分區狀態。 |
shardlength | bigint | 針對附加分散式數據表,分區位置在背景工作節點上的大小以位元組為單位。 如果是哈希分散式數據表,則為零。 |
placementid | bigint | 每個個別放置的唯一自動產生標識碼。 |
groupid | int | 表示使用串流復寫模型時,一部主伺服器和零或多個輔助伺服器的群組。 |
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
分區放置狀態
適用於 PostgreSQL 的 Azure Cosmos DB 會根據每個位置管理分區健康情況。 如果放置讓系統處於不一致的狀態,適用於 PostgreSQL 的 Azure Cosmos DB 會自動將其標示為無法使用。 放置狀態會記錄在 shardstate 數據行內的pg_dist_shard_placement數據表中。 以下是不同分區放置狀態的簡短概觀:
狀態名稱 | Shardstate 值 | 描述 |
---|---|---|
完成 | 1 | 系統會在 中建立新的分區狀態。 此狀態中的分區位置會視為最新狀態,並用於查詢規劃和執行。 |
無效 | 3 | 此狀態中的分區位置會被視為非使用中,因為與其他相同分區複本同步。 當這個位置的附加、修改(INSERT、UPDATE、DELETE)或 DDL 作業失敗時,就會發生狀態。 查詢規劃工具會在規劃和執行期間忽略此狀態中的位置。 用戶可以將這些分區中的數據與完成的複本同步處理為背景活動。 |
TO_DELETE | 4 | 如果適用於 PostgreSQL 的 Azure Cosmos DB 嘗試卸載分區位置以回應master_apply_delete_command呼叫並失敗,則會將放置移至此狀態。 然後,使用者可以將這些分區刪除為後續的背景活動。 |
背景工作節點數據表
pg_dist_node數據表包含叢集中背景工作節點的相關信息。
名稱 | 類型 | 描述 |
---|---|---|
nodeid | int | 個別節點的自動產生識別碼。 |
groupid | int | 使用串流復寫模型時,用來表示一部主伺服器和零或多個輔助伺服器的群組標識符。 根據預設,它與 nodeid 相同。 |
節點名稱 | 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)
Distributed 對象數據表
citus.pg_dist_object數據表包含物件清單,例如在協調器節點上建立並傳播至背景工作節點的物件和函式。 當系統管理員將新的背景工作節點新增至叢集時,適用於PostgreSQL的 Azure Cosmos DB 會自動在新節點上建立分散式對象的複本(以正確順序滿足物件相依性)。
名稱 | 類型 | 描述 |
---|---|---|
classid | oid | 分散式對象的類別 |
objid | oid | 分散式對象的物件識別碼 |
objsubid | 整數 | 分散式對象的物件子標識碼,例如 attnum |
type | text | pg 升級期間使用的穩定位址的一部分 |
object_names | text[] | pg 升級期間使用的穩定位址的一部分 |
object_args | text[] | pg 升級期間使用的穩定位址的一部分 |
distribution_argument_index | 整數 | 僅適用於分散式函式/程式 |
colocationid | 整數 | 僅適用於分散式函式/程式 |
「穩定位址」可唯一識別與特定伺服器無關的物件。 適用於 PostgreSQL 的 Azure Cosmos DB 會在 PostgreSQL 升級期間,使用以 pg_identify_object_as_address() 函式建立的穩定地址來追蹤物件。
以下是如何將 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 引進了架構型分區化的概念,並透過其「citus_schemas」檢視來顯示系統中已散發的架構。 檢視只會列出分散式架構,不會顯示本機架構。
名稱 | 類型 | 描述 |
---|---|---|
schema_name | regnamespace | 分散式架構的名稱 |
colocation_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 管理的所有數據表摘要(分散式和參考數據表)。 此檢視會結合適用於 PostgreSQL 的 Azure Cosmos DB 元數據數據表中的資訊,以方便人類閱讀這些數據表屬性的概觀:
- 資料表類型
- 散發資料行
- 共置群組標識碼
- 人類可讀取的大小
- 分區計數
- 擁有者 (資料庫使用者)
- 存取方法 (堆積或單列)
以下是範例:
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 │
└────────────┴──────────────────┴─────────────────────┴───────────────┴────────────┴─────────────┴─────────────┴───────────────┘
時間分割區檢視
適用於 PostgreSQL 的 Azure Cosmos DB 提供 UDF 來管理 Timeseries 數據使用案例的數據分割。 它也會維護檢視 time_partitions
,以檢查它所管理的數據分割。
資料行:
- parent_table分割的數據表
- partition_column父數據表分割所在的數據行
- 分割 分割區數據表的名稱
- from_value此分割區中數據列的時間下限
- to_value此分割區中數據列的時間上限
- access_method數據列式記憶體的堆積,以及單欄式記憶體的單欄式記憶體
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數據表包含哪些數據表的分區應該放在一起或 共置的相關信息。 當兩個數據表位於相同的共置群組中時,適用於PostgreSQL的 Azure Cosmos DB 可確保具有相同散發數據行值的分區會放在相同的背景工作節點上。 共置可啟用聯結優化、特定分散式匯總和外鍵支援。 當分區計數、復寫因數和分割區數據行類型都符合兩個數據表時,會推斷分區共置;不過,如有需要,可以在建立分散式數據表時指定自定義共置群組。
名稱 | 類型 | 描述 |
---|---|---|
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可用來判斷要移動分區的位置的策略。
名稱 | 類型 | 描述 |
---|---|---|
default_strategy | boolean | rebalance_table_shards是否應該預設選擇此策略。 使用citus_set_default_rebalance_strategy更新此數據行 |
shard_cost_function | regproc | 成本函式的標識碼,其必須採用shardid作為 bigint,並傳回其成本概念,作為類型real |
node_capacity_function | regproc | 容量函式的標識碼,該函式必須採用 nodeid 作為 int,並傳回其節點容量概念為類型 real |
shard_allowed_on_node_function | regproc | 指定 shardid bigint 和 nodeidarg int 之函式的標識符會傳回布爾值,指出適用於 PostgreSQL 的 Azure Cosmos DB 是否可以將分區儲存在節點上 |
default_threshold | float4 | 判斷節點太滿或太空白的臨界值,這會決定何時應該嘗試移動分區rebalance_table_shards |
minimum_threshold | float4 | 防止rebalance_table_shards() 的臨界值自變數設定太低的保障 |
根據預設,適用於 PostgreSQL 的 Cosmos DB 隨附於數據表中的這些策略:
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
臨界值,它可防止因磁碟空間中微不足道的差異而造成不必要的分區移動。
建立自定義重新平衡策略
以下是可在新的分區重新平衡器策略中使用的函式範例,並在pg_dist_rebalance_strategy中向 citus_add_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;
隔離節點上的特定分區 (10000) (位址為 '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;
查詢統計數據數據表
適用於 PostgreSQL 的 Azure Cosmos DB 提供 citus_stat_statements
如何執行查詢,以及針對誰執行查詢的統計數據。 這類似於 PostgreSQL中的pg_stat_statements 檢視,其會追蹤查詢速度的相關統計數據。
此檢視可以追蹤多租使用者應用程式中原始租用戶的查詢,這有助於決定何時進行租用戶隔離。
名稱 | 類型 | 描述 |
---|---|---|
queryid | bigint | 識別碼 (適用於pg_stat_statements聯結) |
userid | oid | 執行查詢的使用者 |
dbid | oid | 協調器的資料庫實例 |
query | text | 匿名查詢字串 |
執行者 | text | 使用 Citus 執行程式:adaptive、real-time、task-tracker、router 或 insert-select |
partition_key | text | 路由器執行查詢中的散發數據行值,否則為 NULL |
通話 | 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
警示:
- 統計數據數據不會復寫,而且不會在資料庫當機或故障轉移中倖存下來
- 追蹤 GUC 所
pg_stat_statements.max
設定的有限查詢數目(預設值 5000) - 若要截斷數據表,請使用 函
citus_stat_statements_reset()
式
分散式查詢活動
適用於 PostgreSQL 的 Azure Cosmos DB 提供特殊檢視來監看整個叢集的查詢和鎖定,包括內部用來建置分散式查詢結果的分區特定查詢。
- citus_dist_stat_activity:顯示在所有節點上執行的分散式查詢。 的超集
pg_stat_activity
,無論後者在哪裡都能使用。 - citus_worker_stat_activity:顯示背景工作角色的查詢,包括針對個別分區的片段查詢。
- citus_lock_waits:整個叢集遭到封鎖的查詢。
前兩個檢視包括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
此查詢需要來自所有分區的資訊。 某些信息位於 分區 users_table_102038
中,這恰好儲存在 中 localhost:9700
。 我們可以查看檢視來查看存取分區的 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 數據表 WHERE tenant_id = X') 在沒有交易區塊的情況下執行,master_query_host_name和master_query_host_port數據行會在citus_worker_stat_activity中為 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');
然後,在協調器上使用兩個會話,我們可以執行這個語句序列:
-- 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
在此範例中,查詢源自協調器,但檢視也可以列出源自背景工作角色的查詢之間的鎖定(例如,使用適用於PostgreSQL的 Azure Cosmos DB MX 執行)。
下一步
- 瞭解一些 適用於 PostgreSQL 的 Azure Cosmos DB 函式 如何改變系統數據表
- 檢閱節點和數據表的概念