PostgreSQL 샤딩: 관계형 데이터베이스 확장

발행: (2026년 2월 5일 오후 01:08 GMT+9)
5 min read
원문: Dev.to

Source: Dev.to

번역하려는 본문 내용을 제공해 주시면, 요청하신 대로 한국어로 번역해 드리겠습니다.

Why Shard?

AspectBenefitTrade‑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 구현 단계

  1. Citus 설치

    psql -c "CREATE EXTENSION IF NOT EXISTS citus;"
  2. 분산 테이블 생성

    SELECT create_distributed_table('users', 'id');
  3. 샤드 상태 모니터링

    • 노드별 CPU, 지연 시간 및 복제 지연을 추적합니다.
    • 대시보드 또는 Prometheus‑호환 익스포터를 사용합니다.
  4. 자동 재‑균형

    • Citus의 rebalance_table_shards 또는 사용자 정의 스크립트를 통해 핫 범위를 새로운 노드로 이동합니다.
  5. 샤드별 백업

    • 샤드별 논리 백업(pg_dump)을 수행하여 샤드 간 복구 복잡성을 피합니다.

Pitfalls & Best Practices

  • Shard Key Selection: 고르게 분산되고 자주 사용되는 쿼리 조건에 맞추어야 합니다.
  • Cross‑Shard Queries: 높은 지연 시간이 예상되므로, 샤드 간 조인을 최소화하도록 스키마를 설계하세요.
  • Operational Overhead: 노드가 늘어날수록 모니터링, 패치, 용량 계획 등 운영 부담이 증가합니다.
  • Data Re‑balancing: 자동화 도구를 활용하도록 계획하고, 수동 이동은 다운타임을 초래할 수 있습니다.
  • Testing: 프로덕션 배포 전에 스테이징 환경에서 성능 및 장애 시나리오를 검증하세요.

시작하기

  1. Prototype: Citus를 사용하여 스테이징 환경에 소규모 샤드 클러스터를 배포합니다.
  2. Measure: 쿼리 지연 시간, 처리량, 노드 자원 활용도를 기록합니다.
  3. Iterate: 관찰된 트래픽 패턴을 기반으로 샤드 키, 파티션 전략 및 모니터링을 개선합니다.

PostgreSQL 샤딩은 팀이 단일 인스턴스의 한계를 넘어 확장할 수 있게 해 주지만, 체계적인 설계, 지속적인 모니터링, 그리고 신중한 운영 관행이 필요합니다. 명확한 샤드 키를 설정하고, 하나의 전략을 프로토타입한 뒤, 실제 트래픽을 기반으로 반복 개선하세요.

Back to Blog

관련 글

더 보기 »

gRPC 구현

gRPC는 Google에서 개발한 프레임워크로, 효율적이고 언어에 독립적인 메커니즘을 제공하여 Remote Procedure Calls(RPC)를 수행할 수 있게 합니다. 주요 사용 사례는…