Azure Cosmos DB for PostgreSQL 시스템 테이블 및 뷰

적용 대상: PostgreSQL용 Azure Cosmos DB(Citus 데이터베이스 확장에서 PostgreSQL로 구동 )

Azure Cosmos DB for PostgreSQL은 클러스터의 분산 데이터에 대한 정보를 포함하는 특수 테이블을 만들고 유지 관리합니다. 코디네이터 노드는 작업자 노드에서 쿼리를 실행하는 방법을 계획할 때 이러한 테이블을 참조합니다.

코디네이터 메타데이터

Azure Cosmos DB for PostgreSQL은 배포 열을 기반으로 각 분산 테이블을 여러 개의 논리 분할로 나눕니다. 그런 다음 코디네이터는 메타데이터 테이블을 기본 이러한 분할된 데이터베이스의 상태 및 위치에 대한 통계 및 정보를 추적합니다.

이 섹션에서는 이러한 각 메타데이터 테이블과 해당 스키마에 대해 설명합니다. 코디네이터 노드에 로그인한 후 SQL을 사용하여 이러한 테이블을 보고 쿼리할 수 있습니다.

참고 항목

이전 버전의 Citus Engine을 실행하는 클러스터는 아래 나열된 모든 테이블을 제공하지 않을 수 있습니다.

파티션 테이블

pg_dist_partition 테이블은 배포된 데이터베이스의 테이블에 대한 메타데이터를 저장합니다. 또한 배포된 각 테이블에 대해 배포 메서드에 대한 정보와 배포 열에 대한 자세한 정보를 저장합니다.

이름 종류 설명
logicalrelid regclass 이 행이 해당하는 분산 테이블입니다. 이 값은 pg_class 시스템 카탈로그 테이블의 relfilenode 열을 참조합니다.
partmethod char 분할/배포에 사용되는 메서드입니다. 다른 배포 메서드에 해당하는 이 열의 값은 'a', 해시: 'h', 참조 테이블: 'n' 추가됩니다.
partkey text 열 번호, 형식 및 기타 관련 정보를 포함하여 배포 열에 대한 자세한 정보입니다.
colocationid 정수 이 테이블이 속한 공동 배치 그룹입니다. 동일한 그룹의 테이블은 다른 최적화 간에 공동 배치된 조인 및 분산 롤업을 허용합니다. 이 값은 pg_dist_colocation 테이블의 공동 배치 열을 참조합니다.
repmodel char 데이터 복제본(replica)에 사용되는 메서드입니다. 다른 복제본(replica)tion 메서드에 해당하는 이 열의 값은 Citus 문 기반 복제본(replica)tion: 'c', postgresql 스트리밍 복제본(replica)tion: '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 쿼리 중에 관련 없는 분할된 데이터베이스를 정리하는 데 사용됩니다.

이름 종류 설명
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 값 설명
TABLE 't' 해당 분할이 정규 분산 테이블에 속하는 데이터를 저장함을 나타냅니다.
원주 '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_placementt 테이블은 작업자 노드에서 분할 복제본의 위치를 추적합니다. 특정 노드에 할당된 분할된 데이터베이스의 각 복제본을 ‘분할된 데이터베이스 배치’라고 합니다. 이 표에서는 각 분할된 데이터베이스 배치의 상태 및 위치에 대한 정보를 저장합니다.

이름 종류 설명
shardid bigint 이 배치와 연결된 분할된 데이터베이스 식별자입니다. 이 값은 pg_dist_shard 카탈로그 테이블의 shardid 열을 참조합니다.
shardstate int 이 배치의 상태를 설명합니다. 다양한 분할 상태에 대해서는 아래 섹션에서 설명합니다.
shardlength bigint 추가 분산 테이블의 경우 작업자 노드의 분할된 데이터베이스 배치 크기(바이트)입니다. 해시 분산 테이블의 경우 0입니다.
placementid bigint 개별 배치마다 자동으로 생성되는 고유 식별자입니다.
groupid int 스트리밍 복제본(replica)tion 모델을 사용할 때 하나의 주 서버와 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은 자동으로 시스템을 사용할 수 없음으로 표시합니다. 배치 상태는 shardstate 열 내의 pg_dist_shard_placement 테이블에 기록됩니다. 다양한 분할된 데이터베이스 배치 상태에 대한 간략한 개요는 다음과 같습니다.

State name Shardstate 값 설명
완료 1 새 분할된 데이터베이스가 만들어지는 상태입니다. 이 상태의 분할된 데이터베이스 배치는 최신 상태로 간주되며 쿼리 계획 및 실행에 사용됩니다.
비활성 3 이 상태의 분할된 데이터베이스 배치는 동일한 분할된 데이터베이스의 다른 복제본(replica) 동기화되지 않아 비활성 상태로 간주됩니다. 이 배치에 대한 추가, 수정(INSERT, UPDATE, DELETE) 또는 DDL 작업이 실패할 때 상태가 발생할 수 있습니다. 쿼리 플래너는 계획 및 실행 중에 이 상태의 배치를 무시합니다. 사용자는 이러한 분할된 데이터베이스의 데이터를 백그라운드 작업으로 완료된 복제본(replica) 동기화할 수 있습니다.
TO_DELETE 4 Azure Cosmos DB for PostgreSQL이 master_apply_delete_command 호출에 응답하여 분할 배치를 삭제하려고 시도했다가 실패하면 해당 배치가 이 상태로 이동됩니다. 그러면 사용자는 이러한 분할된 데이터베이스를 후속 백그라운드 작업으로 삭제할 수 있습니다.

작업자 노드 테이블

pg_dist_node 테이블에는 클러스터의 작업자 노드에 대한 정보가 포함되어 있습니다.

이름 종류 설명
nodeid int 개별 노드에 대한 자동 생성된 식별자입니다.
groupid int 스트리밍 복제본(replica)tion 모델을 사용할 때 하나의 주 서버와 0개 이상의 보조 서버 그룹을 나타내는 데 사용되는 식별자입니다. 기본적으로 nodeid와 동일합니다.
nodename text PostgreSQL 작업자 노드의 호스트 이름 또는 IP 주소입니다.
nodeport int PostgreSQL 작업자 노드가 수신 대기하는 포트 번호입니다.
noderack text (선택 사항)작업자 노드에 대한 랙 배치 정보입니다.
hasmetadata 부울 값 내부용으로 예약되어 있습니다.
Isactive 부울 값 노드가 활성 상태이고 분할 배치를 수락하는지 여부입니다.
noderole text 노드가 주 노드인지 보조 노드인지 여부
nodecluster text 이 노드를 포함하는 클러스터의 이름입니다.
shouldhaveshards 부울 값 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은 (개체 종속성을 충족하기에 올바른 순서로) 분산 개체의 복사본을 새 노드에 자동으로 만듭니다.

이름 종류 설명
Classid oid 분산 개체의 클래스입니다.
Objid oid 분산 개체의 개체 ID
objsubid 정수 분산 개체의 개체 하위 ID(예: attnum)
type text pg 업그레이드 중에 사용되는 안정적인 주소의 일부입니다.
object_names text[] pg 업그레이드 중에 사용되는 안정적인 주소의 일부입니다.
object_args text[] pg 업그레이드 중에 사용되는 안정적인 주소의 일부입니다.
distribution_argument_index 정수 분산 함수/프로시저에만 유효합니다.
colocationid 정수 분산 함수/프로시저에만 유효합니다.

“안정적인 주소”는 특정 서버와 독립적으로 개체를 고유하게 식별합니다. 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에서는 스키마 기반 분할 개념을 소개하고 이를 통해 시스템에 배포된 스키마를 보여주는 'citus_schemas' 뷰를 도입했습니다. 보기에는 분산 스키마만 나열되고 로컬 스키마는 표시되지 않습니다.

이름 종류 설명
schema_name regnamespace 분산 스키마의 이름
colocation_id 정수 분산 스키마의 공동 배치 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은 Timeseries 데이터 사용 사례에 대한 파티션을 관리하는 UDF를 제공합니다. 또한 관리하는 파티션을 검사하기 위한 time_partitions 뷰를 유지 관리합니다.

열:

  • parent_table: 분할된 테이블입니다.
  • partition_column: 부모 테이블이 분할된 열입니다.
  • partition: 파티션 테이블 이름입니다.
  • 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 테이블에는 함께 배치하거나 공동 배치해야 하는 테이블의 분할된 데이터베이스에 대한 정보가 포함되어 있습니다. 두 테이블이 동일한 공동 배치 그룹에 있는 경우 Azure Cosmos DB for PostgreSQL은 배포 열 값이 같은 분할된 데이터베이스가 동일한 작업자 노드에 배치되도록 합니다. 공동 배치를 사용하면 조인 최적화, 특정 분산 롤업 및 외래 키 지원을 사용할 수 있습니다. 분할된 데이터베이스 공동 배치는 분할된 데이터베이스 수, 복제본(replica)tion 요소 및 파티션 열 형식이 모두 두 테이블 간에 일치할 때 유추되지만, 원하는 경우 분산 테이블을 만들 때 사용자 지정 공동 배치 그룹을 지정할 수 있습니다.

이름 종류 설명
colocationid int 이 행이 해당하는 공동 배치 그룹의 고유 식별자입니다.
shardcount int 이 공동 배치 그룹의 모든 테이블에 대한 분할된 데이터베이스 수
replicationfactor int 이 공동 배치 그룹의 모든 테이블에 대한 복제 요소입니다.
distributioncolumntype oid 이 공동 배치 그룹의 모든 테이블에 대한 배포 열의 형식입니다.
SELECT * from pg_dist_colocation;
  colocationid | shardcount | replicationfactor | distributioncolumntype 
 --------------+------------+-------------------+------------------------
			 2 |         32 |                 2 |                     20
  (1 row)

Rebalancer 전략 테이블

이 표에서는 rebalance_table_shards 분할된 데이터베이스를 이동할 위치를 결정하는 데 사용할 수 있는 전략을 정의합니다.

이름 종류 설명
default_strategy 부울 값 rebalance_table_shards 기본적으로 이 전략을 선택해야 하는지 여부입니다. citus_set_default_rebalance_strategy 사용하여 이 열 업데이트
shard_cost_function regproc cost 함수의 식별자이며, 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;
    
  • 노드의 특정 분할(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;
    

쿼리 통계 테이블

Azure Cosmos DB for PostgreSQL은 쿼리 실행 방법 및 대상에 대한 통계의 citus_stat_statements를 제공합니다. 쿼리 속도에 대한 통계를 추적하는 PostgreSQL의 pg_stat_statements 뷰와 유사합니다(조인될 수 있음).

이 보기는 다중 테넌트 애플리케이션에서 원래 테넌트에 대한 쿼리를 추적할 수 있으므로 테넌트 격리를 수행할 시기를 결정하는 데 도움이 됩니다.

이름 종류 설명
queryid bigint 식별자(pg_stat_statements 조인에 적합)
userId oid 쿼리를 실행한 사용자
dbid oid 코디네이터의 데이터베이스 인스턴스
쿼리 text 익명화된 쿼리 문자열
실행자 text Citus 실행기 사용: 적응, 실시간, 작업-추적기, 라우터 또는 삽입-선택
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;

Results:

-[ 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

주의 사항:

  • 통계 데이터는 복제되지 않으며, 데이터베이스 크래시 또는 장애 조치(failover) 후 삭제됩니다.
  • GUC(기본값 5000)로 설정된 pg_stat_statements.max 제한된 수의 쿼리를 추적합니다.
  • 테이블을 자르려면 함수를 citus_stat_statements_reset() 사용합니다.

분산 쿼리 작업

Azure Cosmos DB for PostgreSQL은 분산 쿼리 결과를 빌드하기 위해 내부적으로 사용되는 분할 관련 쿼리를 포함하여 클러스터 전체의 쿼리 및 잠금을 지켜보는 특수 보기를 제공합니다.

  • 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 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');

그런 다음 코디네이터에서 두 세션을 사용하여 다음 명령문 시퀀스를 실행할 수 있습니다.

-- 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로 실행).

다음 단계