다음을 통해 공유


Azure Database for PostgreSQL의 탄력적 클러스터 - 유연한 서버

적용 대상: Azure Database for PostgreSQL - 유연한 서버

Azure Database for PostgreSQL 유연한 서버의 탄력적 클러스터는 PostgreSQL의 수평 분할을 가능하게 하는 PostgreSQL에 대한 오픈 소스 Citus 확장의 관리되는 제품입니다.

Citus는 확장에 불과하지만 여러 PostgreSQL 인스턴스를 연결합니다. Azure Database for PostgreSQL 유연한 서버가 Citus와 함께 배포되면 여러 PostgreSQL 인스턴스의 관리 및 구성을 단일 리소스로 처리합니다. 또한 노드를 자동으로 설정하고 Citus 확장에 알려 줍니다.

유연한 서버의 탄력적 클러스터는 행 기반 분할 및 스키마 기반 분할이라는 두 개의 분할 모델을 제공합니다. 자세히 알아보려면 분할 모델에 대한 오픈 소스 설명서를 확인하세요.

아키텍처

탄력적 클러스터는 Azure Database for PostgreSQL 유연한 서버의 하나 이상의 노드로 구성됩니다. 이러한 인스턴스는 자동으로 서로 알려지고 상호 연결되어 Citus 클러스터를 형성합니다. 노드는 동일한 컴퓨팅 및 스토리지 계층이어야 하며, 더 높거나 낮은 계층으로 균일하게 확장 또는 축소할 수 있습니다.

탄력적 클러스터는 유연한 서버(노드라고 함)의 인스턴스를 사용하여 "공유 없음" 아키텍처에서 서로 조정합니다. 클러스터의 노드는 전체적으로 단일 서버에서 사용할 수 있는 것보다 더 많은 데이터를 포함하고 더 많은 CPU 코어를 사용합니다. 또한 아키텍처를 사용하면 클러스터에 더 많은 노드를 추가하여 데이터베이스의 크기를 조정할 수 있습니다.

포트 5432를 사용하여 클러스터에 연결하면 지정된 코디네이터 노드에 연결됩니다. 또한 탄력적 클러스터를 사용하면 포트 7432를 사용하여 연결하는 경우 5개의 튜플 해시 방법을 사용하여 클러스터 전체에서 연결 부하를 분산할 수 있습니다. 7432를 사용하면 현재 코디네이터로 지정된 노드에 착륙할 수 있습니다. 테이블 배포와 같은 특정 클러스터 전체 작업의 경우 포트 5432를 통해 연결해야 할 수 있습니다. 애플리케이션 스키마 업그레이드 및 유사한 변경을 수행하려는 경우 항상 포트 5432에 연결하는 것이 좋습니다.

PostgreSQL용 Cosmos DB와 달리 노드 주소는 외부에 노출되지 않습니다. Citus 메타데이터 테이블과 같은 pg_dist_node경우 예제 10.7.0.254 와 IP 주소가 동일하지만 포트 번호가 다른 모든 노드를 확인할 수 있습니다.

select nodeid, nodename, nodeport from pg_dist_node;
 nodeid |  nodename  | nodeport
--------+------------+----------
      1 | 10.7.0.254 |     7000
      2 | 10.7.0.254 |     7001
 
(2 rows)

Azure의 인프라에서 이러한 노드는 동일한 머신에서 다른 포트로 보일 수 있지만 서로 다른 가상 머신에 상주합니다.

Citus에 대한 자세한 내용은 공식 오픈 소스 프로젝트 설명서를 참조하세요.

기본적으로 Citus를 사용하여 만든 테이블 및 스키마는 클러스터 간에 자동으로 분산되지 않습니다. 분할 모델을 결정하고 스키마를 배포하거나 행 기반 분할을 사용하여 테이블 데이터를 배포하기로 결정해야 합니다.

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

분할 모델 중 하나를 사용하여 데이터를 배포한 후에는 노드에 연결하여 DML(데이터 수정 언어) 작업(SELECT, UPDATE, INSERT, DELETE)을 수행할 수 있습니다. 모든 노드에는 쿼리에 필요한 데이터를 찾는 데 필요한 메타데이터가 포함되며 쿼리에 응답하기 위해 가져올 수 있습니다.

DDL(데이터 정의 언어) 작업 및 클러스터 전체 작업은 현재 코디네이터 역할을 보유하는 노드로 제한됩니다. 포트 7432를 사용하는 대신 포트 5432에 연결하여 DDL 및 클러스터 전체 작업을 수행해야 합니다.

새 노드를 추가하고 데이터의 균형을 다시 조정하여 탄력적 클러스터를 확장할 수 있습니다. 리밸런싱은 온라인 작업이며 실행 중인 워크로드를 차단하지 않습니다.

분할된 데이터베이스

이젠 섹션에서는 분산 테이블이 작업자 노드에서 분할된 데이터베이스로 저장되는 방법에 대해 다루었습니다. 이 섹션에서는 이러한 분할된 데이터베이스에 대한 자세한 기술 세부 정보를 설명합니다.

메타데이터 테이블에는 pg_dist_shard 시스템에 있는 각 분산 테이블의 각 분할된 데이터베이스에 대한 행이 포함됩니다. 행은 해시 공간(shardid, shardmaxvalue)의 정수 범위와 분할된 데이터베이스 식별자(shardminvalue)를 찾습니다.

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 특정 테이블을 참조하는 조각으로 다시 작성하고 해당 작업자에서 해당 조각을 실행합니다. 식별자 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 │
└─────────┴───────────┴──────────┘