PGD는 어떻게 테스트할까?
Abhijit Save
2025년 7월 15일
이 블로그는 Bharat Telange 및 Amruta Deolasee와 공동 작성되었습니다.
PostgreSQL Distributed(PGD)는 고가용성과 확장성을 제공하는 분산 데이터베이스입니다. PGD 팀은 강력하고 고성능의 제품을 제공하기 위해 철저하고 폭넓은 테스트를 수행하고 있습니다.
이 블로그에서는 PGD 제품에 대해 수행되는 다양한 테스트 활동을 전반적으로 소개합니다.
테스트 방법론 및 전략
지원 플랫폼과 버전 전반에 걸쳐 고성능과 품질을 보장하기 위해 PGD 팀은 다양한 최신 테스트 방법론을 사용합니다. 핵심에는 **지속적인 테스트(Continuous Testing)**가 있으며, 이를 통해 문제를 조기에 발견하고 코드가 발전함에 따라 제품의 무결성을 유지할 수 있습니다.
지원 플랫폼:
- Community PostgreSQL
- EDB Postgres Advanced Server
- EDB Postgres Extended Server
PGD 릴리즈별 지원 PostgreSQL 주요 버전:
- PGD 4: PostgreSQL 12–14
- PGD 5: PostgreSQL 12–17
- PGD 6: PostgreSQL 14–17
이와 같은 폭넓은 지원을 통해 어떤 Postgres 버전이나 변형을 사용하더라도 PGD의 고성능과 안정성을 기대할 수 있습니다.
PGD 테스트는 크게 다음의 카테고리로 나뉩니다:
- 기능 테스트 (Functional Testing)
- 통합 테스트 (Integration Testing)
- 패키지 스모크 테스트
- 성능 테스트
- 탐색적 테스트 (Exploratory Testing)
기능 테스트
기능 테스트는 구조화된 화이트박스 테스트라고 할 수 있으며, PGD의 모든 내부 구성요소와 기능을 심층적으로 테스트합니다. 코드 커버리지, 루틴 결과의 예상 동작, 조건별 기능 수행 여부, 다양한 입력값 조합 등에 대한 검증이 포함됩니다. 테스트의 복잡성에 따라 두 가지 프레임워크를 사용합니다.
TAP 테스트
TAP(Test Anything Protocol) 프레임워크는 각 테스트마다 격리된 독립적인 환경을 제공하므로 서버 재시작, 장애 시뮬레이션, 고동시성(concurrency) 상황 등을 안전하게 시뮬레이션할 수 있습니다.
예시:
- 손상된 클러스터에서 다양한 DML 및 DDL의 기대 동작 확인
- 특정 코드 경로에서 강제 패닉 발생
- 동시 조인(concurrent joins) 테스트 등
회귀 테스트
단일 PostgreSQL 인스턴스 내의 여러 데이터베이스를 사용해 여러 노드를 시뮬레이션합니다. 출력값이 정확히 예상 결과와 비교 가능한 시나리오에 초점을 맞춥니다. 클러스터 유형 변경이나 서비스 재시작 없이 단순한 2개 이상의 노드 구성에서 수행됩니다. 일반적인 유닛 테스트처럼 개별 기능 또는 연산을 검증합니다.
예시:
- 노드 생성, 조인 및 파트 수행
- BDR 루틴의 유효/무효 입력값
- 유효/무효 DML 및 DDL
- BDR 뷰 및 카탈로그의 기대 결과 검증
통합 테스트
통합 테스트는 전체 PGD 스택을 포함하며 클러스터의 전반적인 건전성을 검증합니다. 내부적으로 AV(Architecture Verification)라고 부르며, EDB의 tpaexec 툴을 통해 클러스터 프로비저닝과 테스트를 수행합니다. 테스트는 Docker 또는 AWS EC2 같은 클라우드 환경에서 수행되며, 테스트 스크립트는 Ansible 기반의 YAML로 작성됩니다.
고가용성(HA) 시나리오 예시:
- 클러스터를 다양한 손상 상태로 만들기(raft 과반 유무 포함)
- 기본 클러스터 또는 CAMO/커밋 스코프가 적용된 클러스터 테스트
- 일부 테스트에서는 지속적인 부하를 적용하고, 특정 트랜잭션 상태만 검증하는 경우도 있음
- 클러스터 상태에 따라 PGD는 트랜잭션을 다르게 처리하며, 각 상태에서의 일관성과 건전성을 검증
예시:
- 로컬/글로벌 라우팅이 설정된 기본 클러스터 테스트
- CAMO 분리 뇌(Split Brain) 상황 테스트
- 다양한 커밋 스코프 적용 시 테스트
- Proxy/Connection Manager 및 CLI 테스트 (연결성, CLI 명령, raft 및 write leader 선출, failover, switchover 등)
- 지속적 부하 환경 하에서 다양한 시나리오 검증
패키지 기반 업그레이드 테스트:
- PGD 마이너 및 메이저 업그레이드 커버
- 이전 버전 노드에서 PGD 및 관련 오브젝트 생성 후 새 노드를 추가하거나
pg_upgrade
사용해 업그레이드 수행 - 다양한 운영 체제에서 패키지 설치 및 클러스터 상태 점검
패키지 스모크 테스트
각 지원 버전, 플랫폼, 아키텍처별로 패키지를 빌드할 때, 프로덕션 저장소에 업로드하기 전 패키지의 기본 건전성을 스모크 테스트로 확인합니다.
성능 테스트
EDB Performance Regression Framework를 활용하여 PGD의 성능 벤치마크 및 회귀 테스트를 수행합니다. 이 테스트의 주요 목적은 코드 변경이 성능 저하를 유발하지 않도록 보장하는 것입니다.
테스트 주요 지표:
- TPS(초당 트랜잭션 수)
- 지연 시간(Latency)
테스트는 표준 PGD6 Essential Setup에 고정된 워크로드를 사용하며, PGD6 클러스터 및 Connection Manager의 성능을 포함해 평가합니다.
변경 사항이 PGD6의 성능에 부정적인 영향을 주지 않도록 주간 단위로 실행하며, 결과는 모두 문서화됩니다. 기준선을 기반으로 성능을 비교하여 편차 여부를 확인합니다.
탐색적 테스트
릴리즈 테스트 중 PGD 팀은 탐색적 테스트도 수행합니다. 이 테스트의 목적은 정형화된 테스트 외에도 잠재적 문제를 식별하는 것입니다. 내부 품질 개선 활동의 일환으로 수행되며, 종종 자동화 테스트 생성으로 이어지기도 합니다.
지속적인 테스트 전략
테스트 유형 | 세부 설명 | 빈도 |
---|---|---|
PR 테스트 | 각 Pull Request마다 업그레이드 테스트, 회귀 테스트, 중요 TAP 테스트를 실행하여 코드 변경이 문제를 일으키지 않도록 확인합니다. 테스트를 통과하지 않으면 병합이 차단되며, 동료 리뷰도 요구됩니다. | 매 PR마다 |
야간/주간 실행 | 회귀 테스트와 전체 TAP 테스트를 PGD-PG 버전별로 야간 실행. 다양한 구성 매트릭스로 테스트. AV 테스트는 70%는 매일, 30%는 매주 수행. 성능 테스트는 주간 실행. | 매일 / 매주 |
릴리즈 전 실행 | 릴리즈 전 모든 지원 배포판에서 철저한 업그레이드 테스트 및 AV 테스트를 실행 | 매일 / 릴리즈 직전 |
결론
PGD는 철저하고 광범위한 테스트를 거쳐 미션 크리티컬한 고객 애플리케이션의 요구를 충족하는 신뢰성과 고성능을 제공합니다.
작성자 소개
Bharat Telange, Amruta Deolasee, Abhijit Save는 PGD 테스트 팀 소속으로, 다양한 PGD 제품 릴리즈에서 폭넓은 테스트 경험을 보유하고 있습니다.