내 잡다한 노트
Citus를 왜 사용해야하는가? 본문
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 |