Azure Cosmos DB for PostgreSQL의 노드 및 테이블

적용 대상: Azure Cosmos DB for PostgreSQL(PostgreSQL에 대한 Citus 데이터베이스 확장 기반)

노드

Azure Cosmos DB for PostgreSQL을 사용하면 PostgreSQL 서버(노드)가 "비공유" 아키텍처에서 서로 조정될 수 있습니다. 클러스터의 노드는 전체적으로 단일 서버에서 사용할 수 있는 것보다 더 많은 데이터를 포함하고 더 많은 CPU 코어를 사용합니다. 이 아키텍처는 또한 클러스터에 더 많은 노드를 추가하여 데이터베이스를 크기 조정할 수 있도록 합니다.

코디네이터 및 작업자

모든 클러스터에는 코디네이터 노드와 여러 작업자가 있습니다. 애플리케이션에서 코디네이터 노드로 쿼리를 보내고, 코디네이터 노드는 해당 쿼리를 관련 작업자에게 릴레이하고 결과를 누적합니다.

Azure Cosmos DB for PostgreSQL을 사용하면 데이터베이스 관리자가 테이블 및/또는 스키마를 배포하여 다양한 작업자 노드에 다양한 행을 저장할 수 있습니다. 분산 테이블 및/또는 스키마는 Azure Cosmos DB for PostgreSQL 성능의 핵심입니다. 테이블 및/또는 스키마를 배포하지 못하면 해당 테이블 및/또는 스키마가 전적으로 코디네이터 노드에 남게 되며 컴퓨터 간 병렬 처리를 활용할 수 없습니다.

코디네이터는 분산 테이블의 각 쿼리에 대해 단일 작업자 노드로 라우팅하거나, 필요한 데이터가 단일 노드에 있는지 여러 노드에 있는지에 따라 여러 곳에서 병렬 처리합니다. 스키마 기반 분할을 사용하면 코디네이터는 쿼리를 스키마를 호스팅하는 노드로 직접 라우팅합니다. 스키마 기반 분할과 행 기반 분할 모두에서 코디네이터는 메타데이터 테이블을 참조하여 수행할 작업을 결정합니다. 이러한 테이블은 작업자 노드의 DNS 이름 및 상태와 노드 간 데이터 분산을 추적합니다.

테이블 형식

클러스터에는 각각 노드에 다르게 저장되고 다른 용도로 사용되는 세 가지 유형의 테이블이 있습니다.

유형 1: 분산 테이블

가장 일반적인 첫 번째 유형은 분산 테이블입니다. 이러한 테이블은 SQL 문에 대한 일반 테이블처럼 보이지만 작업자 노드 간에 수평 분할됩니다. 즉, 테이블의 행이 분할된 데이터베이스라는 조각 테이블의 다른 노드에 저장됩니다.

Azure Cosmos DB for PostgreSQL은 클러스터 전체에서 SQL뿐만 아니라 DDL 문도 실행합니다. 분산 테이블의 스키마를 변경하면 작업자 간에 테이블의 모든 분할된 데이터베이스를 연속으로 업데이트합니다.

배포 열

Azure Cosmos DB for PostgreSQL은 알고리즘 분할을 사용하여 분할에 행을 할당합니다. 할당은 배포 열이라는 테이블 열의 값에 따라 명확하게 결정됩니다. 클러스터 관리자는 테이블을 배포할 때 이 열을 지정해야 합니다. 성능 및 기능을 위해 적절한 선택이 중요합니다.

유형 2: 참조 테이블

참조 테이블은 전체 내용이 단일 분할된 데이터베이스로 집중되는 분산 테이블 유형입니다. 분할된 데이터베이스가 모든 작업자에 복제됩니다. 모든 작업자에 대한 쿼리는 다른 노드에서 행을 요청하는 네트워크 오버헤드 없이 참조 정보에 로컬로 액세스할 수 있습니다. 참조 테이블에는 행마다 개별 분할된 데이터베이스를 구분할 필요가 없으므로 배포 열이 없습니다.

참조 테이블은 일반적으로 작지만 모든 작업자 노드에서 실행되는 쿼리와 관련된 데이터를 저장하는 데 사용됩니다. 주문 상태 또는 제품 범주와 같은 열거형 값을 예로 들 수 있습니다.

유형 3: 로컬 테이블

Azure Cosmos DB for PostgreSQL을 사용하는 경우 연결하는 코디네이터 노드는 일반 PostgreSQL 데이터베이스입니다. 코디네이터에서 일반 테이블을 만들고 분할하지 않도록 선택할 수 있습니다.

로컬 테이블에 적합한 후보는 조인 쿼리에 참여하지 않는 작은 관리 테이블입니다. 예를 들어, 애플리케이션 로그인 및 인증을 위한 users 테이블이 있습니다.

형식 4: 로컬 관리 테이블

Azure Cosmos DB for PostgreSQL은 로컬 테이블과 참조 테이블 사이에 외래 키 참조가 있는 경우 로컬 테이블을 메타데이터에 자동으로 추가할 수 있습니다. 또한 일반 로컬 테이블에서 create_reference_table citus_add_local_table_to_metadata 함수를 실행하여 로컬로 관리형 테이블을 수동으로 만들 수 있습니다. 메타데이터에 있는 테이블은 관리형 테이블로 간주되며 모든 노드에서 쿼리할 수 있습니다. Citus는 로컬 관리형 테이블에서 데이터를 가져오기 위해 코디네이터로 라우팅하는 방법을 알고 있습니다. 이러한 테이블은 citus_tables 뷰에 로컬로 표시됩니다.

형식 5: 스키마 테이블

Citus 12.0에 도입된 스키마 기반 분할을 사용하면 분산 스키마가 개별 공동 배치 그룹과 자동으로 연결됩니다. 해당 스키마에서 만들어진 테이블은 분할 키 없이 공동 배치된 분산 테이블로 자동으로 변환됩니다. 이러한 테이블은 스키마 테이블로 간주되며 citus_tables 뷰에 스키마로 표시됩니다.

분할된 데이터베이스

이젠 섹션에서는 분산 테이블이 작업자 노드에서 분할된 데이터베이스로 저장되는 방법에 대해 다루었습니다. 이 섹션에서는 더 기술적인 세부 사항을 설명합니다.

코디네이터의 pg_dist_shard 메타데이터 테이블은 시스템에 있는 각 분산 테이블의 각 분할된 데이터베이스에 대한 행이 포함되어 있습니다. 행은 해시 공간의 정수 범위(shardminvalue, shardmaxvalue)와 분할된 데이터베이스 ID를 일치시킵니다.

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)

코디네이터 노드가 github_events의 행을 보유하고 있는 분할된 데이터베이스를 확인하려는 경우 행의 배포 열 값을 해시합니다. 그런 다음, 노드는 해시된 값이 포함된 분할된 데이터베이스의 범위를 확인합니다. 범위는 해시 함수의 이미지가 분리 합집합이 되도록 정의됩니다.

분할된 데이터베이스 영역 배치

분할된 데이터베이스 102027이 문제의 행과 관련이 있다고 가정합니다. 작업자 중 하나의 github_events_102027이라는 테이블에서 행을 읽거나 씁니다. 어떤 작업자일까요? 작업자는 전적으로 메타데이터 테이블을 통해 결정됩니다. 작업자에 대한 분할된 데이터베이스의 매핑은 분할된 데이터베이스 영역 배치라고 합니다.

코디네이터 노드는 github_events_102027과 같은 특정 테이블을 참조하는 조각에 쿼리를 작성하며 적합한 작업자에서 해당 조각을 실행합니다. 다음은 분할된 데이터베이스 ID 102027을 보유하는 노드를 찾도록 내부적으로 실행되는 쿼리의 예입니다.

SELECT
    shardid,
    node.nodename,
    node.nodeport
FROM pg_dist_placement placement
JOIN pg_dist_node node
  ON placement.groupid = node.groupid
 AND node.noderole = 'primary'::noderole
WHERE shardid = 102027;
┌─────────┬───────────┬──────────┐
│ shardid │ nodename  │ nodeport │
├─────────┼───────────┼──────────┤
│  102027 │ localhost │     5433 │
└─────────┴───────────┴──────────┘

다음 단계