共用方式為


適用於 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 執行)。

下一步