適用于 PostgreSQL 系統資料表和檢視的 Azure Cosmos DB
適用于: 適用于 PostgreSQL 的 Azure Cosmos DB (由 Citus 資料庫延伸模組 支援 PostgreSQL)
適用于 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 | 老 | 分散式物件的類別 |
objid | 老 | 分散式物件的物件識別碼 |
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 | 老 | 這個共置群組中所有資料表的散發資料行類型。 |
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 | 老 | 執行查詢的使用者 |
dbid | 老 | 協調器的資料庫實例 |
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 函式 如何改變系統資料表
- 檢閱節點和資料表的概念