TestForge | Aidevops | 📊 Plogger ✍️ Blog 📚 Docs
plogger

AI DevOps Korea

AI 서비스 개발, 운영, 성능개선을 하나의 루프로 연결합니다

aidevops.kr에서 LLMOps, RAG, AI Agent, 관측성, 평가, 비용-성능 최적화를 실전 운영 관점으로 정리합니다.

데이터베이스 파티셔닝 전략 — 샤딩, 수평/수직 분할

데이터베이스 파티셔닝 전략 — 샤딩, 수평/수직 분할 다이어그램
이 그림은 파티셔닝을 단순한 스키마 기법이 아니라 워크로드와 운영 판단의 문제로 다시 보게 해 주며, 키 설계, 프루닝, 수명 주기, 장애 형태를 함께 연결해 설명합니다.
## 그림으로 보는 구조
[Single DB]
    |
    +--> [Partitioning]
    |       same DB / same schema / split by key or range
    |
    +--> [Sharding]
            multiple DBs / split by shard key

파티셔닝은 한 데이터베이스 안에서 물리적 또는 논리적 조각을 나누는 방식이고, 샤딩은 데이터베이스 자체를 여러 노드로 나누는 방식입니다. 둘 다 “데이터를 쪼갠다”는 공통점은 있지만, 운영 복잡도와 확장 한계가 완전히 다르기 때문에 먼저 이 구조 차이를 머리에 두고 읽는 것이 중요합니다.

파티셔닝 vs 샤딩

구분파티셔닝샤딩
범위단일 DB 내 테이블 분할여러 DB 서버로 분산
복잡도낮음높음
확장성수직 확장수평 확장

MySQL 파티셔닝

RANGE 파티션 (날짜 기반)

CREATE TABLE orders (
    id BIGINT,
    created_at DATE,
    amount INT
)
PARTITION BY RANGE (YEAR(created_at)) (
    PARTITION p2023 VALUES LESS THAN (2024),
    PARTITION p2024 VALUES LESS THAN (2025),
    PARTITION p2025 VALUES LESS THAN (2026),
    PARTITION p_future VALUES LESS THAN MAXVALUE
);

LIST 파티션 (상태 기반)

PARTITION BY LIST (status) (
    PARTITION p_pending  VALUES IN (1),
    PARTITION p_paid     VALUES IN (2),
    PARTITION p_shipped  VALUES IN (3),
    PARTITION p_done     VALUES IN (4)
);

HASH 파티션 (균등 분배)

PARTITION BY HASH(user_id) PARTITIONS 8;

파티션 관리

-- 파티션 정보 조회
SELECT * FROM information_schema.PARTITIONS
WHERE TABLE_NAME = 'orders';

-- 특정 파티션 조회 (파티션 프루닝)
SELECT * FROM orders PARTITION (p2024);

-- 파티션 추가
ALTER TABLE orders ADD PARTITION (
    PARTITION p2026 VALUES LESS THAN (2027)
);

-- 오래된 파티션 삭제 (빠른 데이터 정리)
ALTER TABLE orders DROP PARTITION p2023;

샤딩 전략

Range Sharding

user_id 1~1000000  → Shard 1
user_id 1000001~   → Shard 2

Hash Sharding

int shardIndex = userId % NUM_SHARDS;
DataSource ds = shards.get(shardIndex);

수직 분할 (Vertical Partitioning)

자주 조회되지 않는 대용량 컬럼 분리:

-- 원본: users (id, name, email, profile_image_blob, bio)
-- 분리 후:
-- users (id, name, email)
-- user_profiles (user_id, profile_image_blob, bio)

운영 환경에서 어려워지는 지점

  • 파티셔닝은 데이터 규모, 보관 정책, 쿼리 라우팅이 추가 운영 복잡도를 정당화할 때만 도움이 된다.
  • 팀은 종종 너무 일찍 파티셔닝을 도입하고 실제 병목이 인덱스, 쿼리 형태, 하드웨어 한계였다는 사실을 뒤늦게 발견한다.
  • 파티셔닝이 생기는 순간 유지보수, pruning, backfill 경로는 일상 운영 일부가 된다.

중요한 아키텍처 결정

  • 파티션 키는 가장 빨리 커지는 컬럼이 아니라 보관 정책과 접근 경로 기준으로 고른다.
  • 애플리케이션 쿼리가 실제로 파티션 pruning을 활용할 수 있게 설계한다.
  • 첫 파티션을 만들기 전에 archive, drop, rebalance 절차를 계획한다.

실무 예시

시간 기반 파티셔닝은 쿼리 범위와 보관 작업이 잘 맞아 많이 쓰인다.

events_2026_01
events_2026_02
events_2026_03
...

피해야 할 안티패턴

  • pruning 이득이 거의 없는 테이블에 파티셔닝을 도입하는 것.
  • 공통 쿼리를 너무 많은 파티션으로 흩뿌리는 키를 고르는 것.
  • 지연 도착 데이터와 재파티셔닝 운영 도구를 무시하는 것.

운영 체크리스트

  • 실제 실행 계획으로 pruning 여부를 검증한다.
  • 파티션 생성과 퇴역을 자동화한다.
  • backfill과 과거 데이터 조회 동작을 테스트한다.
  • 파티션 수 증가에 따른 메타데이터 비용과 유지보수 시간을 감시한다.

최종 판단

파티셔닝은 확장성과 보관 운영을 함께 단순화할 때 정당화된다. 보통 쿼리만 더 복잡하게 만들 뿐이라면 대개 잘못된 첫 수다.

Continue Reading

다음으로 읽기 좋은 글

다음 탐색

이 주제를 시스템 관점으로 더 이어서 보기