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

下一步