Azure Cosmos DB for PostgreSQL 시스템 테이블 및 뷰
적용 대상: Azure Cosmos DB for PostgreSQL(PostgreSQL에 대한 Citus 데이터베이스 확장 기반)
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 | 데이터 복제에 사용되는 메서드입니다. 다른 복제 방법에 해당하는 이 열의 값은 Citus 문 기반 복제: 'c', postgresql 스트리밍 복제: '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 | 스트리밍 복제 모델을 사용할 때 하나의 주 서버와 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 | 이 상태의 분할된 데이터베이스 배치는 동일한 분할된 데이터베이스의 다른 복제본과 동기화되지 않아 비활성 상태로 간주됩니다. 이 배치에 대한 추가, 수정(INSERT, UPDATE, DELETE) 또는 DDL 작업이 실패할 때 상태가 발생할 수 있습니다. 쿼리 플래너는 계획 및 실행 중에 이 상태의 배치를 무시합니다. 사용자는 이러한 분할된 데이터베이스의 데이터를 백그라운드 작업으로 완료된 복제본과 동기화할 수 있습니다. |
TO_DELETE | 4 | Azure Cosmos DB for PostgreSQL이 master_apply_delete_command 호출에 응답하여 분할 배치를 삭제하려고 시도했다가 실패하면 해당 배치가 이 상태로 이동됩니다. 그러면 사용자는 이러한 분할된 데이터베이스를 후속 백그라운드 작업으로 삭제할 수 있습니다. |
작업자 노드 테이블
pg_dist_node 테이블에는 클러스터의 작업자 노드에 대한 정보가 포함되어 있습니다.
속성 | 형식 | 설명 |
---|---|---|
nodeid | int | 개별 노드에 대한 자동 생성된 식별자입니다. |
groupid | int | 스트리밍 복제 모델을 사용할 때 하나의 주 서버와 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은 배포 열 값이 같은 분할된 데이터베이스가 동일한 작업자 노드에 배치되도록 합니다. 공동 배치를 사용하면 조인 최적화, 특정 분산 롤업 및 외래 키 지원을 사용할 수 있습니다. 분할된 데이터베이스 공동 배치는 분할된 데이터베이스 수, 복제 요소 및 파티션 열 형식이 모두 두 테이블 간에 일치할 때 유추됩니다. 그러나 원하는 경우 분산 테이블을 만들 때 사용자 지정 공동 배치 그룹을 지정할 수 있습니다.
속성 | 형식 | 설명 |
---|---|---|
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 | 코디네이터의 데이터베이스 인스턴스 |
query | 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로 실행).
다음 단계
- 일부 Azure Cosmos DB for PostgreSQL 함수가 시스템 테이블을 변경하는 방법 알아보기
- 노드 및 테이블의 개념 검토