PostgreSQL 분산 확장: Citus 클러스터 도입
Citus를 활용한 PostgreSQL 분산 확장 흐름을 처음 접하는 운영자 관점에서 정리한 문서로, 설치와 설정 요소 중심의 설치
목차
소개
PostgreSQL 단일 서버는 확장성과 처리량에서 한계가 있다. Citus는 PostgreSQL을 수평 확장 가능한 분산 데이터베이스로 변환한다. 본문은 Citus 클러스터의 핵심 개념과 설치, 기본 설정, 샤딩 전략, 운영 관리를 초보자 관점에서 설명한다.
아키텍처 개요
Citus는 coordinator 노드와 worker 노드로 구성된다. Coordinator는 쿼리 계획과 메타데이터를 관리하고, Worker는 실제 데이터를 저장하고 쿼리를 병렬 처리한다. 이 구조로 읽기·쓰기 부하를 여러 노드로 분산할 수 있다.
주요 구성 요소
- Coordinator: 클러스터의 진입점으로 쿼리 분할과 집계를 수행
- Worker: 샤드별 데이터를 저장하고 병렬 실행 담당
- Shard: 테이블을 분할한 단위, 각 샤드는 하나 이상의 worker에 분포
Citus 설치 및 설정 예시
아래 예시는 Ubuntu 환경에서 Citus 확장 설치와 기본 설정을 보여준다. 실제 운영 환경에서는 버전과 배포 방식에 따라 명령이 달라질 수 있다.
1) PostgreSQL과 Citus 패키지 설치
sudo apt-get update
sudo apt-get install -y postgresql-13 postgresql-13-citus
2) Coordinator와 Worker 구성
각 노드에서 PostgreSQL을 설치한 뒤 coordinator의 postgresql.conf와 pg_hba.conf를 네트워크 접속 허용하도록 수정한다. coordinator에서 worker를 등록하는 기본 명령은 다음과 같다.
-- coordinator에서 실행
CREATE EXTENSION IF NOT EXISTS citus;
SELECT citus_add_node('worker-hostname', 5432);
샤딩 전략
샤드 키 선택은 성능을 결정한다. 자주 조회되는 칼럼이 샤드 키가 되면 쿼리가 한 노드에 치우칠 수 있다. 균등한 분포와 조인 패턴을 고려해 샤드 키를 정한다.
분산 테이블 생성 예시
-- 분산 테이블 생성
CREATE TABLE events (
id bigserial PRIMARY KEY,
tenant_id bigint,
event_time timestamptz,
payload jsonb
);
SELECT create_distributed_table('events', 'tenant_id');
쿼리 패턴과 성능
분산 환경에서는 가능한 한 샤드 키를 포함한 쿼리를 작성한다. 그렇지 않으면 coordinator가 여러 worker를 대상으로 브로드캐스트 쿼리를 수행해 네트워크 비용이 발생한다. 집계는 worker에서 병렬로 실행되므로 대량 데이터 집계에서 이점이 크다.
운영과 모니터링
운영 중에는 다음 항목을 점검한다.
- 샤드 균형: 일부 노드로 데이터가 편중되지 않는지 확인
- 쿼리 지연: 느린 쿼리의 실행 계획과 샤드 키 사용 여부 분석
- 리소스 모니터링: CPU, 메모리, I/O 사용량 모니터링
샤드 리밸런싱
노드 추가나 제거 시에는 샤드 리밸런싱이 필요하다. Citus는 리밸런싱 도구를 제공하므로 운영 계획에 따라 점진적으로 이동해야 한다.
장애 대응과 백업
분산 환경이라도 각 노드의 정기적인 백업과 WAL(Write-Ahead Logging) 관리가 중요하다. 장애 복구 시 coordinator와 worker 간의 메타데이터 일관성을 확보해야 한다.
마무리: 도입 체크리스트
- 샤드 키 후보와 쿼리 패턴 분석
- 네트워크와 인스턴스 리소스 계획
- 모니터링·로깅 체계 구성
- 백업·복구 절차 문서화
이 문서는 Citus 기반 PostgreSQL 분산 확장 도입의 실무적 핵심을 간결히 정리했다. 실제 적용 전에는 테스트 환경에서 샤딩 전략과 장애 시나리오를 검증할 것을 권장한다.