DB/Postgresql

Postgresql - Sharding

개발 일기92 2025. 2. 23. 17:30

 

  • Postgresql의 샤드
    1. Sharding은 성능, 확장성 및 가용성을 향상시키기 위해 여러 서버 (또는 노드)에 데이터를 배포하는 데이터베이스 파티셔닝 기술
    2. 모든 데이터를 단일 데이터베이스 인스턴스에 저장하는 대신 Sharding은 이를 더 작고 관리하기 쉬운 청크로 나s눈다.
  • 샤드의 주요 구성 요소
    1. 샤드 key
      • 샤드 (예 : 사용자 ID, 지역 등)에 데이터를 배포하는 데 사용되는 열 (또는 열 세트).
    2. 코디네이터 (라우터)
      • 샤드 키를 기반으로 쿼리를 올바른 샤드로 구동. (수동 / pgbouncer / citus 와 같은 관리 툴)
    3. 샤드 노드
      • 각 노드 (데이터베이스 서버)는 데이터의 일부를 저장
      • 노드는 쿼리를 처리하기 위해 독립적으로 작동
  • 샤드 전략
    1. 해시 기반 샤딩
      • 샤드 키 값은 해시되어 샤드 위치를 결정
      • 데이터 배포를 보장하지만 범위 쿼리는 비효율적
      • ex) SELECT * FROM users WHERE id % 4 = 2;
    2. 레인지 기반 샤딩
      • 데이터는 값 범위에 따라 나눈다 (예 : 사용자 ID 1-1000은 Shard 1, 1001-2000에서 Shard 2로 이동).
      • 범위 쿼리에는 적합 but 샤드당 고르지 않은 분포도로 구성될 수 있음
    3. 목록 기반 샤딩
      • 특정 값 또는 카테고리는 다른 파편에 할당 (예 : Shard 1의 "USA", Shard 2의 "EU").
  • Postgresql에서 샤딩 구현
    1. 테이블 파티셔닝 사용 (수동 샤딩)
CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    name TEXT,
    country TEXT
) PARTITION BY LIST (country);

CREATE TABLE users_usa PARTITION OF users FOR VALUES IN ('USA');
CREATE TABLE users_eu PARTITION OF users FOR VALUES IN ('EU');

 

         2. PostgreSQL FDW 사용 (FDW를 사용하면 PostgreSQL이 원격 데이터베이스와 상호 작용하여 파편 관리에 유용)

CREATE EXTENSION postgres_fdw;
CREATE SERVER shard1 FOREIGN DATA WRAPPER postgres_fdw OPTIONS (host '192.xxx.1.1', dbname 'shard1_db');
CREATE SERVER shard2 FOREIGN DATA WRAPPER postgres_fdw OPTIONS (host '192.xxx.1.2', dbname 'shard2_db');

  

         3. Citus (Sharding을 자동화하는 Open-Source PostgreSQL 확장자)

SELECT create_distributed_table('users', 'id');

 

 

샤드의 장점
✅ 확장성 - DB를 분배하여 대형 데이터 세트를 처리
✅ 고 가용성 - 샤드가 실패해도 다른 샤드들은 계속 작동.
✅ 더 빠른 쿼리 - 쿼리는 파편에서 병렬로 처리.

샤드의 도전
❌ 복잡성 - 신중한 계획 및 유지 보수가 필요.
❌ 크로스 샤드 조인 - 여러 샤드와 관련된 쿼리는 느릴 수 있다.
❌ 재조정  - 파편 사이에서 데이터를 이동하는 것은 어려울 수 있다.

샤드를 사용할 때? 
단일 서버에 비해 데이터베이스가 너무 큰 경우.
트래픽이 높아 쿼리 성능이 어려움을 겪을 때.
수직 하드웨어 업그레이드를 넘어 수평 스케일링이 필요할 때.

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

DB - partition 수평/수직 분할  (0) 2024.05.22
Undo, Redo segment  (0) 2024.04.14
MVCC  (1) 2024.04.11
postgresql - vacuum  (0) 2024.04.11
Window 함수  (0) 2024.04.09