@)참고
- Be A Better Dev - 데이터베이스 샤딩이란?
클러스터링, 레플리케이션, 샤딩은 모두 데이터베이스 이중화 기법의 한 종류이다.
클러스터링
- 여러 개의 DB를
수평적인 구조
로 구축하는 방식
동기 방식
으로 노드들 간의 데이터를 동기화 한다.
- Active-Active 방식과 Active-Standby 방식이 있다.


장점
- 항상 일관성 있는 데이터를 얻을 수 있다.
- 시스템을 계속 장애없이 운영할 수 있다.
단점
- 노드들 간의 데이터를 동기화하는 시간이 필요하므로 Replication에 비해 쓰기 성능이 떨어진다.
- 장애가 전파된 경우 처리가 까다로우며, 데이터 동기화에 의해 스케일링에 한계가 있다.
리플리케이션
- 여러 개의 DB를
수직적인 구조(Master-Slave)
로 구축하는 방식
비동기 방식
으로 노드들 간의 데이터를 동기화 한다.
- Master 노드는 Create, Update, Delete 연산을 수행하고 Slave 노드는 Read 연산을 수행하여 로드를 분산할 수 있다.

장점
- DB 요청의 60~80% 정도가 읽기 작업이기 때문에 Replication만으로도 충분히 성능을 높일 수 있다.
- 비동기 방식으로 운영되어 지연 시간이 거의 없다.
단점
- ⚠️ 노드들 간의 데이터 동기화가 보장되지 않아
일관성있는 데이터를 얻지 못할 수 있다
.
- Master 노드가 다운되면 복구 및 대처가 까다롭다.
샤딩
- 테이블을 row 단위로 나누어 저장해 DB 용량을 줄이고 검색 성능을 올리는 기법
- 기존 테이블과 같은 스키마를 가지는
샤드
라는 작은 단위로 나누어 저장하는 방식

샤드키
- 나누어진 샤드 중 어떤 샤드를 선택할 지 결정하는 키
장점
- Scalability
- Availability + Fault Tolerance - 한 샤드내에서 장애가 난 경우 다른 샤드는 정상 동작 가능
단점
- Complexity
- Partition Mapping (Shard Key)
- Routing Layer 추가
- Non-uniformity - 샤드 간의 데이터 균등성을 보장하기 어렵다 → re-sharding
- Analiytical Query
- 통계성 쿼리를 날리기 어렵다
1) 해시 샤딩
- 해시 함수를 사용해 샤드 키를 나누는 방식
(+) 구현이 간단
(-) 확장성이 좋지 않다 - 샤드가 추가 된 경우 해시 함수를 재 설계 해야함
(-) re-sharding 어렵다
2) 다이나믹 샤딩
- 샤드키를 저장하는 테이블을 앞단에 두는 방식
(+) 확장성이 좋다. - 샤드가 추가 되어도 테이블에 샤드키만 추가하면 됨
(-) 복잡도가 올라간다
3) 엔티티 그룹
- 관계가 되어있는 엔티티를 같은 샤드내에 구성하는 방식
(+) 단일 샤드 내 쿼리가 효율적
(-) 다른 샤드의 엔티티를 참조해야 하는 경우 비효율적