PostgreSQL 샤딩: 관계형 데이터베이스 확장
Source: Dev.to
번역하려는 본문 내용을 제공해 주시면, 요청하신 대로 한국어로 번역해 드리겠습니다.
Why Shard?
| Aspect | Benefit | Trade‑off |
|---|---|---|
| 확장성 | 노드를 추가함에 따라 선형 성장 | 운영 복잡도 증가 |
| 쿼리 단순성 | 단일 샤드 읽기가 빠름 | 크로스 샤드 조인에는 오케스트레이션 필요 |
| 데이터 로컬리티 | 사용자는 종종 자신의 샤드에 접근 | 샤드가 고르게 성장하지 않을 때 데이터 재균형 필요 |
| 장애 격리 | 하나의 샤드 장애 ≠ 전체 중단 | 견고한 모니터링 및 장애 복구 로직 필요 |
핵심 인사이트: 편의성만을 기준으로 샤드 키를 선택하지 마세요; 데이터가 고르게 분포하고 가장 일반적인 쿼리 패턴과 일치해야 합니다.
샤딩 전략
| 전략 | 설명 |
|---|---|
| 범위 기반 | 행은 샤드 키의 연속적인 범위(예: 사용자 ID)로 나뉩니다. |
| 해시 기반 | 해시 함수가 행을 고르게 분배하여 핫스팟을 방지합니다. |
| 디렉터리 기반 | 조회 서비스가 각 키를 특정 샤드에 매핑합니다(Citus에서 일반적). |
범위 기반 예시 (PostgreSQL pg_partman)
-- Create a parent table
CREATE TABLE users (
id BIGINT NOT NULL,
name TEXT NOT NULL,
created_at TIMESTAMP NOT NULL,
PRIMARY KEY (id)
) PARTITION BY RANGE (id);
-- Create partitions (shards)
CREATE TABLE users_0_9999 PARTITION OF users FOR VALUES FROM (0) TO (10000);
CREATE TABLE users_10000_19999 PARTITION OF users FOR VALUES FROM (10000) TO (20000);
해시 기반 예시 (Citus 확장)
-- Enable the Citus extension
CREATE EXTENSION IF NOT EXISTS citus;
-- Create a distributed (sharded) table
SELECT create_distributed_table('users', 'id');
디렉터리 기반 구성 (YAML)
sharding:
enabled: true
shardKey: "userId"
shards:
- name: shardA
range: "0-2499"
- name: shardB
range: "2500-4999"
- name: shardC
range: "5000-7499"
- name: shardD
range: "7500-9999"
Citus 구현 단계
-
Citus 설치
psql -c "CREATE EXTENSION IF NOT EXISTS citus;" -
분산 테이블 생성
SELECT create_distributed_table('users', 'id'); -
샤드 상태 모니터링
- 노드별 CPU, 지연 시간 및 복제 지연을 추적합니다.
- 대시보드 또는 Prometheus‑호환 익스포터를 사용합니다.
-
자동 재‑균형
- Citus의
rebalance_table_shards또는 사용자 정의 스크립트를 통해 핫 범위를 새로운 노드로 이동합니다.
- Citus의
-
샤드별 백업
- 샤드별 논리 백업(
pg_dump)을 수행하여 샤드 간 복구 복잡성을 피합니다.
- 샤드별 논리 백업(
Pitfalls & Best Practices
- Shard Key Selection: 고르게 분산되고 자주 사용되는 쿼리 조건에 맞추어야 합니다.
- Cross‑Shard Queries: 높은 지연 시간이 예상되므로, 샤드 간 조인을 최소화하도록 스키마를 설계하세요.
- Operational Overhead: 노드가 늘어날수록 모니터링, 패치, 용량 계획 등 운영 부담이 증가합니다.
- Data Re‑balancing: 자동화 도구를 활용하도록 계획하고, 수동 이동은 다운타임을 초래할 수 있습니다.
- Testing: 프로덕션 배포 전에 스테이징 환경에서 성능 및 장애 시나리오를 검증하세요.
시작하기
- Prototype: Citus를 사용하여 스테이징 환경에 소규모 샤드 클러스터를 배포합니다.
- Measure: 쿼리 지연 시간, 처리량, 노드 자원 활용도를 기록합니다.
- Iterate: 관찰된 트래픽 패턴을 기반으로 샤드 키, 파티션 전략 및 모니터링을 개선합니다.
PostgreSQL 샤딩은 팀이 단일 인스턴스의 한계를 넘어 확장할 수 있게 해 주지만, 체계적인 설계, 지속적인 모니터링, 그리고 신중한 운영 관행이 필요합니다. 명확한 샤드 키를 설정하고, 하나의 전략을 프로토타입한 뒤, 실제 트래픽을 기반으로 반복 개선하세요.