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로 실행).
다음 단계
- 일부 Azure Cosmos DB for PostgreSQL 함수가 시스템 테이블을 변경하는 방법 알아보기
- 노드 및 테이블의 개념 검토