본문 바로가기
C.W.K.
Stream
Lesson 09 of 10 · published

PostgreSQL이 알맞지 않은 때

~12 min · operations, philosophy

Level 0스키마 새싹
0 XP0/86 lessons0/10 achievements
0/120 XP to next level120 XP to go0% complete

잘하는 범위 밖을 인정해

페타바이트 분석에서는 BigQuery·Snowflake·ClickHouse 같은 열 저장소가 이 작업을 한 자릿수 배 싸게 처리할 수 있어. PostgreSQL의 UNLOGGED 테이블도 일부 캐시를 맡지만 sub-ms 원시 속도에서는 Redis가 낫고, PostgreSQL에도 논리 복제 도구는 있지만 여러 지역 active-active가 핵심 요구라면 처음부터 그 구조로 설계된 CockroachDB·Spanner가 더 맞아. 시계열은 먼저 TimescaleDB로 PostgreSQL을 확장해 보고, 초당 10억 데이터 포인트 같은 규모라면 InfluxDB나 VictoriaMetrics를 검토해. 거대한 쓰기 분산은 Cassandra·ScyllaDB, 순수 사건 스트림은 Kafka가 더 맞을 수 있어.

작은 요구는 PostgreSQL 안에서 먼저

UNLOGGED 테이블은 장애 복구 때 비워져도 되는 빠른 캐시에, SKIP LOCKED는 가벼운 작업 대기열에 쓸 수 있어.

측정된 한계가 결정하게 해

새 저장소는 장애 유형과 감시 절차, 권한 체계, 당직 대응 부담을 하나씩 더해. PostgreSQL이 실제로 못 견딘다는 수치가 그 비용을 넘어설 때 옮겨.

Code

UNLOGGED 테이블을 휘발성 캐시로 쓰기·sql
CREATE UNLOGGED TABLE session_cache (
    key    TEXT PRIMARY KEY,
    value  JSONB NOT NULL,
    expires_at TIMESTAMPTZ NOT NULL
);

-- Logged 테이블보다 빠름 (WAL 없음).
-- 정상 운영엔 살아남지만 크래시 복구 시 TRUNCATE.
-- Cross-node 공유 불필요할 때 lightweight Redis 대체.
SKIP LOCKED로 PostgreSQL 큐 만들기·sql
CREATE TABLE jobs (
    id INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
    payload JSONB NOT NULL,
    status TEXT NOT NULL DEFAULT 'pending',
    created_at TIMESTAMPTZ NOT NULL DEFAULT now()
);

-- Worker
BEGIN;
SELECT id, payload FROM jobs
WHERE status = 'pending'
ORDER BY created_at
LIMIT 1
FOR UPDATE SKIP LOCKED;
-- ... 처리 ...
UPDATE jobs SET status = 'done' WHERE id = ?;
COMMIT;

External links

Exercise

기술 스택에서 PostgreSQL이 아닌 데이터 저장소를 모두 나열해. 각각을 도입하게 만든 측정된 PostgreSQL 한계를 한 문장으로 적어. 구체적인 근거를 쓰지 못한다면 그 의존성이 운영 비용만큼 가치를 주는지 다시 검토해.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.