콘텐츠로 이동

Sharding

Sharding이란?

큰 테이블을 여러 데이터베이스 서버(인스턴스)에 분산하여 저장하는 것.

예시: URL 단축기

100만 행의 URL_TABLE이 있을 때:

SELECT URL FROM URL_TABLE WHERE URLID = '5FTOJ';

단일 서버에서는 100만 행을 모두 처리해야 하지만, 5개의 서버로 샤딩하면:

서버 데이터 크기
S1 200K 행
S2 200K 행
S3 200K 행
S4 200K 행
S5 200K 행
  • 5FTOJ가 어느 서버에 있는지 결정 → Server 3!
  • 해당 서버의 200K 행만 스캔하면 됨

Consistent Hashing

해시 함수를 사용하여 데이터를 어느 서버에 저장/조회할지 결정하는 방법.

동작 원리

3개의 Postgres 인스턴스가 있을 때: postgres:5432, postgres:5433, postgres:5434

Hash("Input1") → 5432 (Server 1)
Hash("Input2") → 5433 (Server 2)
Hash("Input3") → 5434 (Server 3)

해시 함수 예시

num("Input2") % 3 = 1
+ 5432 (기본 포트)
= 5433 → postgres:5433으로 라우팅
  • 입력값을 숫자로 변환한 후 서버 수로 나눈 나머지로 서버를 결정
  • 같은 입력값은 항상 같은 서버로 라우팅됨

Horizontal Partitioning vs Sharding

항목 Horizontal Partitioning Sharding
분할 위치 같은 데이터베이스 내 여러 테이블 여러 데이터베이스 서버에 분산
변경되는 것 테이블 이름 (또는 스키마) 서버가 변경됨 (테이블 이름은 동일)

Demo - Postgres 예시 (URL 단축기)

  1. 동일한 스키마로 3개의 Postgres 인스턴스 실행 (포트: 5432, 5433, 5434)
  2. 샤딩된 데이터베이스에 쓰기
  3. 샤딩된 데이터베이스에서 읽기

Pros (장점)

  • 확장성 (Scalability)
  • 데이터 분산
  • 메모리 분산
  • 보안 - 사용자가 특정 샤드에만 접근하도록 제한 가능
  • 최적화된 작은 인덱스 크기 - 각 샤드의 인덱스가 작아져 검색 속도 향상

Cons (단점)

  • 복잡한 클라이언트 - 클라이언트가 샤드를 인식해야 함
  • 샤드 간 트랜잭션 문제 - 여러 샤드에 걸친 트랜잭션 처리가 어려움
  • 롤백(Rollback) 처리 어려움
  • 스키마 변경이 어려움 - 모든 샤드에 동일하게 적용해야 함
  • 조인(Join) 처리 어려움 - 서로 다른 서버에 있는 데이터를 조인해야 함
  • 쿼리에 샤딩 키가 필요 - 어느 샤드로 가야 하는지 알 수 있는 정보가 쿼리에 포함되어야 함