내 잡다한 노트

Citus를 왜 사용해야하는가? 본문

DB/PostgreSQL

Citus를 왜 사용해야하는가?

peanutwalnut 2025. 2. 12. 13:51

PostgreSQL은 기본적으로 Citus 없이도 여러 노드로 배포할 수 있지만, **Citus는 특정한 방식으로 수평 확장을 지원하는 확장(extension)**입니다. PostgreSQL을 여러 노드로 구성하는 방법과 Citus의 차이점을 비교해볼게요.


1. PostgreSQL에서 Citus 없이 클러스터를 구성하는 방법

Citus 없이도 PostgreSQL을 여러 개의 노드로 구성할 수 있습니다. 일반적으로 사용되는 방법은 다음과 같습니다.

① 리플리케이션 (Replication)

  • 스트리밍 리플리케이션 (Streaming Replication)
    • 마스터(Primary) - 리플리카(Standby) 구조로 동작.
    • 마스터 노드에서 변경 사항이 발생하면 리플리카 노드로 데이터를 복제.
    • 리플리카는 기본적으로 읽기 전용(Read-Only) 으로 사용 가능.
    • PostgreSQL 기본 기능 (wal_level = replica 설정).
    • 단점: 읽기 부하는 분산할 수 있지만, 쓰기(Write) 부하는 분산 불가능.
  • 로지컬 리플리케이션 (Logical Replication)
    • 테이블 단위로 변경 사항을 복제할 수 있음.
    • 서로 다른 PostgreSQL 버전이나 스키마 간의 복제가 가능.
    • CDC(Change Data Capture) 같은 실시간 데이터 싱크에 유용.

💡 한계점: 리플리케이션은 기본적으로 데이터 복제를 의미하며, 노드 간에 부하를 균등하게 나누는 Sharding(샤딩) 기능은 지원하지 않음.


② 파티셔닝 (Partitioning)

  • PostgreSQL의 테이블 파티셔닝 (Native Table Partitioning)
    • 데이터를 여러 테이블(파티션)으로 나누어 저장.
    • 단일 노드에서도 작동하지만, FDW(Foreign Data Wrapper)를 사용하면 여러 노드에 걸쳐 데이터를 나눌 수 있음.
    • 파티셔닝 방식
      • 범위 기반(Range Partitioning)
      • 리스트 기반(List Partitioning)
      • 해시 기반(Hash Partitioning)
    • 단점: PostgreSQL 기본 파티셔닝은 단일 노드 기반, 여러 노드에 분산 저장하려면 별도 설정이 필요.

③ 외부 테이블 및 FDW(Foreign Data Wrapper)

  • Postgres FDW(PostgreSQL Foreign Data Wrapper)
    • 여러 개의 PostgreSQL 인스턴스를 연결하여 데이터를 분산.
    • postgres_fdw를 사용하여 원격 PostgreSQL 서버의 테이블을 로컬에서 조회 가능.
    • 쓰기(Write) 작업은 일부 제한적, 모든 쿼리가 효율적으로 분산되는 것은 아님.
    • 단점: 자동 샤딩, 분산 쿼리 최적화 부족.

④ Patroni, Stolon, Pgpool-II 같은 HA(고가용성) 솔루션

  • Patroni + Etcd 또는 Stolon을 사용하면 자동 페일오버(Primary-Replica 전환) 가능.
  • Pgpool-II 또는 HAProxy를 추가하여 읽기 부하 분산 가능.
  • 단점: 여전히 쓰기 부하 분산 불가능, 샤딩 지원 없음.

2. Citus가 필요한 이유 (PostgreSQL과의 차이점)

PostgreSQL의 위 기능들은 고가용성(HA) 및 일부 읽기 부하 분산을 가능하게 하지만, 데이터를 여러 노드에 분산 저장하고 수평 확장(Sharding)을 제공하지 않음. 여기서 Citus가 차별화되는 이유는 다음과 같아요.

기능PostgreSQL 기본Citus

읽기 부하 분산 가능 (리플리케이션) 가능 (분산 쿼리)
쓰기 부하 분산 불가능 가능 (샤딩)
샤딩(Sharding) 기본 지원 없음 네이티브 지원
단일 쿼리 병렬 처리 제한적 전체 노드에 병렬 처리
자동 데이터 분산 수동 설정 필요 자동 샤딩
클러스터 관리 Patroni, Stolon 등 필요 자체 지원

💡 핵심 차이점

Citus는 PostgreSQL을 여러 노드로 확장하여 하나의 분산 데이터베이스처럼 동작하도록 함.
쓰기(Write) 부하를 분산 가능 → PostgreSQL 기본 기능으로는 불가능한 부분.
자동 샤딩 및 분산 쿼리 최적화 → FDW보다 훨씬 효율적.


3. PostgreSQL vs Citus 어떤 경우에 사용해야 할까?

Citus 없이 PostgreSQL 클러스터를 구성하는 게 더 나은 경우

✔ 읽기 부하만 분산하면 충분한 경우 (ex. OLTP 시스템에서 읽기 전용 리플리카 사용)
✔ 단일 노드에서 충분한 성능을 낼 수 있는 경우
✔ 샤딩이 필요하지 않고 HA(고가용성)만 필요할 때 (Patroni, Stolon 등)

Citus를 써야 하는 경우

✔ 데이터가 매우 커서 단일 PostgreSQL 인스턴스로 감당이 어려울 때
읽기 & 쓰기 부하를 모두 분산해야 할 때
샤딩을 자동으로 관리하고 싶을 때
✔ 대규모 SaaS(멀티 테넌트), 실시간 분석(OLAP), IoT 데이터 같은 빅데이터 처리가 필요한 경우

'DB > PostgreSQL' 카테고리의 다른 글

Pigsty 란?  (0) 2025.02.15
pg_rewind 란?  (0) 2025.02.13
Patroni 설정 파일  (0) 2025.02.13
PostgreSQL Citus  (0) 2025.02.12
PostgreSQL의 HA를 위해 설계된 Patroni  (0) 2025.02.12