DB가 단일 테이블, 단일 DB 구조가 한계에 도달했다.
해결책: 데이터를 논리적으로 또는 물리적으로 나누어야 한다.
한 지붕 아래 여러 방을 만든다. 단일 DB 서버 내부에서 하나의 거대한 테이블을 여러 파티션(저장단위)으로 나누어 저장한다. 개발자는 하나의 테이블처럼 사용하지만, DB 내부에서는 여러 파티션으로 분리되어 저장된다. 그리고 이는 DB 엔진 수준에서 알아서 관리해준다.
DB는 파티션 정보를 메타데이터로 관리한다. 이걸 Partition Prunning이라고 한다.**
옆 동네에 새 집 짓기. 데이터를 서로 달느 물리적 서버(인스턴스)들에 분산 저장한다. 각 서버를 샤드라고 부르며 수평적 확장의 핵심 기술이다.
샤딩이라고 하면 보통 수평 분할(행 단위)를 의미한다. 수직 분할(열 단위)는 자주 쓰는 컬럼과 안 쓰는 컬럼을 분리할 때 사용한다.
물리적 위치가 다르다.
파티셔닝은 같은 DB 인스턴스 안에서 분리되지만, 샤딩은 서로 다른 DB 인스턴스로의 분산이다.
확장 방향이 다르다.
파티셔닝은 단일 서버 안에서의 최적화(Scale-Up 한계 내), 샤딩은 여러 서버로의 확장(Scale-Out) 전략
책임 주체가 다르다.
파티셔닝은 DB엔진이, 샤딩은 대게 애플리케이션(또는 미들웨어)이 어디로 보낼지 결정한다.(샤딩은 Shard Key 기반 라우팅 로직이 필요)
파티셔닝은 단일 DB 서버 내에서 조회성능과 관리 효율을 위해 테이블을 쪼개는 내부 최적화이다. 샤딩은 하드웨어 한계를 넘기 위해 데이터를 여러 대의 서버에 분산하는 물리적 확장이다.
파티셔닝은 SQL 변경 없이 투명하게 적용 가능하지만, 샤딩은 애플리케이션 레벨에서 데이터 분산 로직을 신경 써야 하며 Join 제약이 생긴다.
샤딩은 선택이 아니라 최후의 수단에 가깝다. 단일 DB의 한계를 넘었을 때 도입한다.
출처: 코딩하는 기술사 - 대량 데이터를 나누는 기술, 파티셔닝과 샤딩