Sharding¶
Sharding이란?¶
큰 테이블을 여러 데이터베이스 서버(인스턴스)에 분산하여 저장하는 것.
예시: URL 단축기¶
100만 행의 URL_TABLE이 있을 때:
단일 서버에서는 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
해시 함수 예시¶
- 입력값을 숫자로 변환한 후 서버 수로 나눈 나머지로 서버를 결정
- 같은 입력값은 항상 같은 서버로 라우팅됨
Horizontal Partitioning vs Sharding¶
| 항목 | Horizontal Partitioning | Sharding |
|---|---|---|
| 분할 위치 | 같은 데이터베이스 내 여러 테이블 | 여러 데이터베이스 서버에 분산 |
| 변경되는 것 | 테이블 이름 (또는 스키마) | 서버가 변경됨 (테이블 이름은 동일) |
Demo - Postgres 예시 (URL 단축기)¶
- 동일한 스키마로 3개의 Postgres 인스턴스 실행 (포트: 5432, 5433, 5434)
- 샤딩된 데이터베이스에 쓰기
- 샤딩된 데이터베이스에서 읽기
Pros (장점)¶
- 확장성 (Scalability)
- 데이터 분산
- 메모리 분산
- 보안 - 사용자가 특정 샤드에만 접근하도록 제한 가능
- 최적화된 작은 인덱스 크기 - 각 샤드의 인덱스가 작아져 검색 속도 향상
Cons (단점)¶
- 복잡한 클라이언트 - 클라이언트가 샤드를 인식해야 함
- 샤드 간 트랜잭션 문제 - 여러 샤드에 걸친 트랜잭션 처리가 어려움
- 롤백(Rollback) 처리 어려움
- 스키마 변경이 어려움 - 모든 샤드에 동일하게 적용해야 함
- 조인(Join) 처리 어려움 - 서로 다른 서버에 있는 데이터를 조인해야 함
- 쿼리에 샤딩 키가 필요 - 어느 샤드로 가야 하는지 알 수 있는 정보가 쿼리에 포함되어야 함