Azure Database for PostgreSQL 소개
Azure Database for PostgreSQL은 다중 서버 버전에서 사용할 수 있습니다.
다년간의 온-프레미스 PostgreSQL 설치 실행 및 관리 경험이 있는 데이터베이스 개발자로서 Azure Database for PostgreSQL에서 서비스의 기능을 지원하고 스케일링하는 방법을 살펴보려고 합니다.
이 단원에서는 Azure Database for PostgreSQL의 가격 책정, 버전 지원, 복제 및 스케일링 옵션을 살펴보겠습니다.
Azure Database for PostgreSQL
Azure Database for PostgreSQL 서비스는 커뮤니티 버전의 PostgreSQL 구현입니다. 이 서비스는 지리적 공간 지원 및 전체 텍스트 검색을 포함하여 일반적인 PostgreSQL 시스템에서 사용하는 공통 기능을 제공합니다.
Microsoft는 Azure 플랫폼에 맞게 PostgreSQL을 조정했으며 많은 Azure 서비스와 밀접하게 통합되어 있습니다. Azure Database for PostgreSQL 서비스는 Microsoft에서 완전히 관리합니다. Microsoft는 소프트웨어에 대한 업데이트 및 패치를 처리하고 99.99%의 가용성을 보장하는 SLA를 제공합니다. 즉, 서비스를 사용하여 실행되는 데이터베이스 및 애플리케이션에만 초점을 맞출 수 있습니다.
이 서비스의 각 인스턴스에 여러 데이터베이스를 배포할 수 있습니다.
가격 책정 계층
Azure Database for PostgreSQL 서비스의 인스턴스를 만들 때 가격 책정 계층을 선택하여 할당하려는 컴퓨팅 및 스토리지 리소스를 지정합니다. 가격 책정 계층은 가상 프로세서 코어 수, 사용 가능한 스토리지 크기 및 다양한 백업 옵션을 결합합니다. 할당하는 리소스가 많을수록 비용이 커집니다.
Azure Database for PostgreSQL 서비스는 스토리지를 사용하여 데이터베이스 파일, 임시 파일, 트랜잭션 로그 및 서버 로그를 보관합니다. 현재 용량에 근접하면 사용 가능한 스토리지를 늘리도록 선택적으로 지정할 수 있습니다. 이 옵션을 선택하지 않으면 스토리지에서 실행되는 서버가 계속 실행되지만 읽기 전용으로 작동합니다.
Azure Portal에서는 가격 책정 계층을 다음 세 가지의 광범위한 범위로 그룹화합니다.
- 기본 - 소규모 시스템과 개발 환경에 적합하지만, I/O 성능이 가변적입니다.
- 범용 - 프로세서 코어 수와 사용 가능한 스토리지 공간에 따라 최대 6000 IOPS의 예측 가능한 성능을 제공합니다.
- 메모리 최적화 - 최대 32개의 메모리 최적화된 가상 프로세서 코어를 사용하고 최대 6000 IOPS의 예측 가능한 성능을 제공합니다.
Microsoft에는 최대 16TB의 스토리지를 프로비저닝하고 최대 20,000 IOPS를 지원할 수 있는 대형 스토리지 옵션을 미리 보기로 제공합니다.
필요한 프로세서 코어 수와 스토리지를 세부적으로 조정할 수 있습니다. 처리 리소스를 스케일 업 및 다운할 수 있으며(스토리지는 스케일 다운할 수 없고 업만 가능) 데이터베이스를 생성된 후 필요한 대로 범용 및 메모리 최적화 가격 책정 계층 간에 전환할 수 있습니다. 필요한 만큼만 요금을 지불합니다.
참고 항목
프로세서 코어 수를 변경하면 Azure에서 이 컴퓨팅 할당을 사용하여 새 서버를 생성합니다. 서버를 실행하면 클라이언트 연결이 새 서버로 전환됩니다. 이처럼 전환하는 데 최대 1분 정도 걸릴 수 있습니다. 이 기간 동안에는 새 연결을 만들 수 없으며 진행 중인 모든 트랜잭션이 롤백됩니다.
백업 옵션의 스토리지 크기만 변경하는 경우 서비스는 중단되지 않습니다.
가격 책정 계층과 할당된 처리 리소스에 따라 서비스에서 지원할 최대 동시 연결 수가 결정됩니다. 예를 들어 범용 가격 책정 계층을 선택하고 64개의 가상 코어를 할당하면 서비스에서 1,900개의 동시 연결을 지원합니다. 두 개의 가상 코어가 있는 기본 계층은 최대 100개의 동시 연결을 처리합니다. Azure 자체에서 서버를 모니터링하려면 이 연결이 5개 필요합니다. 사용 가능한 연결 수를 초과하면 클라이언트에 치명적: 죄송합니다. 클라이언트가 이미 너무 많습니다.라는 오류가 표시됩니다.
가격은 변경될 수 있습니다. 최신 정보는 Azure Database for PostgreSQL 가격 책정 페이지를 방문하세요.
서버 매개 변수
PostgreSQL의 온-프레미스 설치에서 postgresql.conf 파일에 서버 구성 매개 변수를 설정합니다. Azure Database for PostgreSQL을 사용하여 서버 매개 변수 페이지에서 구성 매개 변수를 수정할 수 있습니다. PostgreSQL의 온-프레미스 설치에 사용하는 일부 매개 변수는 Azure Database for PostgreSQL과 관련되지 않으므로, 서버 매개 변수 페이지에는 Azure에 적합한 매개 변수만 나열됩니다.
동적으로 표시된 매개 변수에 대한 변경 내용은 즉시 적용됩니다. 정적 매개 변수를 사용하려면 서버를 다시 시작해야 합니다. 포털의 개요 페이지에 있는 다시 시작 단추를 사용하여 서버를 다시 시작합니다.
고가용성
Azure Database for PostgreSQL은 가용성이 뛰어난 서비스입니다. 기본 제공되는 오류 검색 및 장애 조치(failover) 메커니즘을 포함합니다. 하드웨어 또는 소프트웨어 문제로 인해 처리 노드가 정지되면 새 노드가 활성화되어 교체됩니다. 현재 해당 노드를 사용하는 모든 연결은 삭제되지만 새 노드에 대해 자동으로 열립니다. 실패하는 노드에서 수행 중인 모든 트랜잭션이 롤백됩니다. 따라서 클라이언트가 실패한 작업을 검색하고 다시 시도하도록 구성되어 있는지 항상 확인해야 합니다.
지원되는 PostgreSQL 버전
Azure Database for PostgreSQL 서비스는 현재 PostgreSQL 버전 11(버전 9.5까지)을 지원합니다. 서비스의 인스턴스를 만들 때 사용할 PostgreSQL의 버전을 지정합니다. Microsoft는 새 버전의 PostgreSQL을 사용할 수 있게 되면 서비스를 업데이트하는 것을 목표로 하며, 이전 두 개의 주 버전과 호환성을 유지합니다.
Azure는 PostgreSQL의 주 버전이 아니라 부 버전 간 데이터베이스 업그레이드를 자동으로 관리합니다. 예를 들어 PostgreSQL 버전 10을 사용하는 데이터베이스가 있으면 Azure는 데이터베이스를 버전 10.1로 자동으로 업그레이드할 수 있습니다. 버전 11로 전환하려면 현재 서비스 인스턴스의 데이터베이스에서 데이터를 내보내고 Azure Database for PostgreSQL 서비스의 새 인스턴스를 생성된 다음, 이 새 인스턴스로 데이터를 가져와야 합니다.
코디네이터 및 작업자 노드
데이터는 작업자 노드 간에 공유되고 배포됩니다. 코디네이터의 쿼리 엔진은 복잡한 쿼리를 병렬화하여 처리를 적절한 작업자 노드로 보낼 수 있습니다. 작업자 노드는 처리 중인 데이터를 보관하는 샤드에 따라 선택됩니다. 그러면 코디네이터가 클라이언트로 다시 보내기 전에 작업자 노드의 결과를 누적합니다. 단일 작업자 노드만 사용하여 더 간단한 쿼리를 수행할 수 있습니다. 또한 클라이언트는 코디네이터에 연결하고 작업자 노드와는 직접 통신하지 않습니다.
필요에 따라 서비스에서 작업자 노드 수를 스케일 업 및 다운할 수 있습니다.
데이터 배포
배포 테이블을 만들어 작업자 노드 간에 데이터를 배포합니다. 배포 테이블은 분할된 데이터베이스로 나뉘고 분할된 각 데이터베이스는 작업자 노드의 스토리지에 할당됩니다. 열을 배포 열로 정의하여 데이터 분할 방법을 나타냅니다. 데이터는 이 열의 데이터 값을 기준으로 분할됩니다. 배포 테이블을 디자인할 때 배포 열을 신중하게 선택하는 것이 중요합니다. 일반적으로 관련 행을 그룹화하는 데 사용되는 고유한 값이 많은 열을 사용해야 합니다. 예를 들어 고객의 주문에 대한 정보를 저장하는 전자상거래 시스템의 테이블에서 고객 ID는 적절한 배포 열일 수 있습니다. 지정된 고객의 모든 주문은 동일한 분할된 데이터베이스에 보관되지만 모든 고객의 주문은 분할된 데이터베이스 간에 분산됩니다.
참조 테이블도 만들 수 있습니다. 이 테이블은 도시 또는 상태 코드의 이름과 같은 조회 데이터를 포함합니다. 참조 테이블은 모든 작업자 노드에 전체적으로 복제됩니다. 참조 테이블의 데이터는 상대적으로 고정적이어야 하며, 변경할 때마다 테이블의 모든 복사본을 업데이트해야 합니다.
마지막으로 로컬 테이블을 만들 수 있습니다. 로컬 테이블은 분할된 데이터베이스가 아니라 코디네이터 노드에 저장됩니다. 조인에 필요하지 않은 데이터가 포함된 작은 테이블을 보유하는 데 로컬 테이블을 사용합니다. 예를 들어 사용자 이름과 해당 로그인 세부 정보가 있습니다.
Azure Database for PostgreSQL에서 데이터 복제
읽기 전용 복제본은 읽기 집약적인 워크로드를 처리하는 데 유용합니다. 클라이언트 연결은 복제본 간에 분산될 수 있으므로 서비스의 단일 인스턴스에 대한 부담을 줄입니다. 클라이언트가 전 세계의 여러 지역에 있으면 교차 지역 복제를 사용하여 각 클라이언트 세트에 가깝게 데이터를 배치하고 대기 시간을 줄입니다.
재해 복구를 위한 대체 계획의 일부로 복제본을 사용할 수도 있습니다. 마스터 서버를 사용할 수 없게 되면 복제본에 계속 연결할 수 있습니다.
참고
마스터가 손실되거나 삭제되면 모든 읽기 전용 복제본이 대신 읽기-쓰기 서버가 됩니다. 그러나 이러한 서버는 서로 독립적이므로 한 서버의 데이터에 대한 변경 사항은 나머지 서버에 복사되지 않습니다.
복제본 설정
읽기 전용 복제본에는 원본 서버에 저장된 데이터베이스의 복사본(마스터라고 함)이 포함되어 있습니다. Azure Portal 또는 CLI를 사용하여 마스터의 복제본을 생성합니다.
읽기 전용 복제본을 만들 때 Azure는 Azure Database for PostgreSQL 서비스의 새 인스턴스를 생성된 다음 마스터 서버에서 새 서버로 데이터베이스를 복사합니다. 복제본은 읽기 전용 모드로 실행됩니다. 데이터를 수정할 수 없습니다.
복제본 지연
복제는 동기식이 아니며 마스터 서버의 데이터를 변경하면 복제본에 표시되는 데 약간의 시간이 걸릴 수 있습니다. 복제본에 연결하는 클라이언트 애플리케이션은 이 수준의 최종 일관성에 대처할 수 있어야 합니다. Azure Monitor를 사용하면 복제본 간 최대 지연 및 복제본 지연 메트릭을 사용하여 복제의 지연 시간을 추적할 수 있습니다.
관리 및 모니터링
pgAdmin과 같은 익숙한 도구를 통해 Azure Database for PostgreSQL에 연결하여 데이터베이스를 관리하고 모니터링할 수 있습니다. 그러나 서버는 Microsoft에서 관리 및 유지 관리하기 때문에 서버 백업 및 복원과 같은 일부 서버 중심 기능은 사용할 수 없습니다.
Azure Database for PostgreSQL 모니터링용 Azure 도구
Azure는 서버 및 데이터베이스 성능을 모니터링하고 문제를 해결하는 데 사용하는 광범위한 서비스 세트를 제공합니다. 이 서비스를 사용하여 PostgreSQL에서 사용자가 할당한 Azure 리소스를 활용하는 방법을 볼 수 있습니다. 이 정보를 사용하여 시스템을 스케일링해야 하는지, 데이터베이스의 테이블과 인덱스 구조를 수정하고, 런타임 통계 및 기타 이벤트를 시각화해야 하는지 평가합니다. 추가할 수 있는 서비스는 다음과 같습니다.
Azure Monitor Azure Database for PostgreSQL에서는 CPU 및 스토리지 사용률, I/O 속도, 메모리 점유, 활성 연결 수 및 복제 지연 등의 항목을 추적할 수 있는 메트릭을 제공합니다.
서버 로그. Azure에서는 각 PostgreSQL 서버의 로그를 사용할 수 있습니다. Azure Portal에서 다운로드합니다.
쿼리 저장소 및 Query Performance Insights. Azure Database for PostgreSQL은 서버에 있는 데이터베이스를 대상으로 실행되는 쿼리에 관한 정보를 저장하고 query_store 스키마의 azure_sys라는 데이터베이스에 저장합니다. query_store.qs_view 뷰를 쿼리하여 이 정보를 확인합니다. 기본적으로 Azure Database for PostgreSQL은 적은 오버헤드를 가하므로 쿼리 정보를 캡처하지 않지만 pg_qs.query_capture_mode 서버 속성을 ALL 또는 TOP으로 설정하여 추적을 사용으로 설정할 수 있습니다.
대기 시간을 소비하는 쿼리에 대한 정보를 캡처하도록 쿼리 저장소도 구성합니다. 쿼리는 다른 쿼리가 테이블에 대한 잠금을 해제하는 동안 또는 쿼리가 많은 I/O를 수행하거나 메모리가 부족하기 때문에 기다려야 할 수 있습니다. 이 정보는 query_store.runtime_stats_view 뷰에 표시됩니다.
SQL 문을 실행하지 않고 이 통계를 시각화하려면 Azure Portal에서 Query Performance Insight를 사용합니다.
성능 권장 사항. Azure Portal에서도 사용할 수 있는 성능 권장 사항 유틸리티는 애플리케이션에서 실행 중인 쿼리를 검사합니다. 또한 데이터베이스의 구조를 확인하고 데이터를 구성하는 방법과 인덱스 추가 또는 제거를 고려할지 여부를 권장합니다.
클라이언트 연결
Azure Database for PostgreSQL은 방화벽 뒤에서 실행됩니다. 서비스 및 데이터베이스에 액세스하려면 클라이언트가 연결하는 IP 주소 범위에 대한 방화벽 규칙을 추가해야 합니다. Azure App Service를 사용하여 실행하는 애플리케이션과 같이 Azure에서 서비스에 액세스해야 하는 경우 App Service에 대한 액세스도 사용하도록 설정해야 합니다.
방화벽 구성
방화벽을 구성하는 가장 간단한 방법은 Azure Portal에서 서비스에 대한 연결 보안 설정을 사용하는 것입니다. 각 클라이언트 IP 주소 범위에 대한 규칙을 추가하세요. 이 페이지를 사용하여 서비스에 대한 SSL 연결도 적용합니다.
도구 모음에서 클라이언트 IP 추가를 클릭하여 데스크톱 컴퓨터의 IP 주소를 추가합니다.
읽기 전용 복제본을 구성한 경우 클라이언트에서 액세스할 수 있도록 각 복제본에 방화벽 규칙을 추가해야 합니다.
클라이언트 연결 라이브러리
고유 클라이언트 애플리케이션을 작성하는 경우 적절한 데이터베이스 드라이버를 사용하여 PostgreSQL 데이터베이스에 연결해야 합니다. 해당 라이브러리의 대부분은 프로그래밍 언어에 따라 달라집니다. 독립적인 타사에서 유지 관리합니다. Azure Database for PostgreSQL은 Python, PHP, Node.js, Java, Ruby, Go, C# (.NET), ODBC, C 및 C++의 클라이언트 라이브러리를 지원합니다.
클라이언트 다시 시도 논리
앞서 언급한 바와 같이 고가용성 복구 중 장애 조치(failover) 및 CPU 리소스 스케일링과 같은 일부 이벤트로 인해 연결이 잠시 끊어질 수 있습니다. 진행 중인 모든 트랜잭션이 롤백됩니다. Azure Database for PostgreSQL은 연결된 클라이언트를 작업 노드로 자동 리디렉션하지만 해당 시점에 클라이언트에서 수행 중인 모든 작업이 오류를 반환합니다. 이 발생을 일시적인 예외로 처리해야 합니다. 애플리케이션 코드는 이 예외를 포착하고 재시도할 준비가 되어 있어야 합니다.
Azure Database for PostgreSQL에서 지원되는 PostgreSQL 기능
Azure Database for PostgreSQL은 PostgreSQL 데이터베이스에서 일반적으로 사용되는 대부분의 기능을 지원하지만 몇 가지 예외가 있습니다. 지원되지 않는 기능이 필요한 경우 데이터베이스 및 애플리케이션 코드를 다시 작업하여 이 종속성을 제거하거나 가상 머신에서 PostgreSQL 실행을 고려해야 합니다. 후자의 경우에는 서버를 관리하고 유지 관리해야 합니다.
Azure Database for PostgreSQL에서 지원되는 확장
많은 PostgreSQL 기능이 확장에 캡슐화되어 있습니다. 확장은 서버에 저장된 SQL 개체 및 코드의 패키지로, CREATE EXTENSION
명령을 사용하여 데이터베이스에 로드될 수 있습니다. 현재 Azure Database for PostgreSQL에서는 다음과 같이 일반적으로 사용되는 여러 확장을 제공합니다.
- 데이터 형식
- 함수
- 전체 텍스트 검색
- 인덱스(bloom, btree_gist 및 btree_gin)
- plpgsql 언어
- PostGIS
- 많은 관리 함수
dblink 및 postgres_fdw 패키지를 사용하여 한 PostgreSQL 서버를 또 다른 서버에 연결합니다. 그러면 한 서버의 코드가 또 다른 서버에 있는 데이터에 액세스할 수 있습니다. Azure Database for PostgreSQL에서는 Azure Database for PostgreSQL을 사용하여 생성된 서버 사이에만 연결할 수 있습니다. 온-프레미스 또는 가상 머신과 같이 다른 위치에서 호스트되는 PostgreSQL 서버에 대한 아웃바운드 연결을 만들 수 없습니다.
참고
지원되는 확장 목록은 지속적으로 검토 중이며 변경될 수 있습니다. 다음 쿼리를 사용하여 지원되는 확장 목록을 생성합니다. 사용자 고유의 사용자 지정 확장을 만들어 Azure Database for PostgreSQL에 업로드할 수 없습니다.
SELECT * FROM pg_available_extensions;
Azure Database for PostgreSQL에는 TimescaleDB 데이터베이스가 선택적 확장으로 포함되어 있습니다. 이 데이터베이스에는 시간 중심의 분석 함수와 시계열 워크로드를 지원하는 기타 함수가 포함되어 있습니다. 이 데이터베이스를 사용하려면 shared_preload_libraries 서버 매개 변수에서 TIMESCALEDB 옵션을 선택한 다음 서버를 다시 시작합니다.
저장 프로시저 및 트리거에 대한 언어 지원
plpgsql 이외의 언어를 지원하려면 일반적으로 저장 프로시저 또는 트리거 코드를 별도로 컴파일하고 컴파일된 라이브러리를 서버에 업로드해야 합니다. 주로 보안상의 이유로 Azure Database for PostgreSQL에서는 이 작업을 수행할 수 없습니다. 다른 언어로 작성된 코드가 있으면 해당 코드를 plpgsql로 이동해야 합니다.