Sharding
Sharding
Sharding 이란
DB의 데이터를 여러 개의 DB로 분리해 저장하는 것. 분리된 DB를 shard라고 한다. 분리하는 기준이 되는 키(컬럼)을 샤딩 키라고 함.
테이블의 행을 나누는 horizontal partitioning 방법과 동일하다고 볼 수 있다.
Partitioning
큰 테이블을 관리하기 쉬운 단위로 분리하는 것.
- Vertical: 테이블의 열을 기준으로 나누는 것으로, 정규화된 데이터도 분리 가능.
- Horizontal: 테이블의 행을 기준으로 나누는 것으로, 각 테이블의 index와 데이터 갯수가 줄어듦.
방법
- Modular sharding (Hash sharding)
- Range sharding (Dynamic sharding)
- Directory sharding
Modular Sharding
샤딩 키를 해시(모듈러 연산)한 결과를 통해 shard를 특정하는 방식.
shard 추가 생성에 재정렬은 필요 없지만, 데이터가 특정 shard에 몰릴 수 있음.
Range Sharding
샤딩 키 값의 범위를 통해 shard를 특정하는 방식.
shard마다 데이터가 균일하게 분배되지만, shard가 추가적으로 생성되는 경우 resharding 해야 하는 문제 발생.
Directory sharding
샤딩 키와 샤드를 연결하는 룩업 테이블을 이용해 shard를 특정하는 방식.
샤딩 키의 cardinality가 낮을 때는 좋지만, table을 추가적으로 사용한다는 점에서 오버헤드 발생 가능.
장점
- 하나의 DB를 운영하는 것 보다 트래픽이 분산되어 쿼리 반응 속도 향상
- 특정 shard에 문제가 생겨도 해당 shard에서만 끝날 확률이 높음.
- 하드웨어의 수를 늘리는 방향으로 문제 해결 가능.
단점
- 프로그래밍 복잡도와 위험성이 높아짐.
- 데이터가 한 쪽으로 몰리면 무의미.
- 신중한 결정 필요. 한번 쪼갠 후 다시 되돌리기 어려움.
유의사항
- 샤딩이 필요할 정도로 커지기 이전부터 샤딩 시작.
- 샤딩 키의 신중한 선택. 독립적이면서 균형도 맞는 키.
- 샤딩을 프로덕션에 사용하기 전 개발 툴 구현.
- 최대한 샤딩을 사용하지 않는 방법 고려.
- 데이터를 각 마이크로 서비스에 저장.
- HW 스펙 상승.
- Cache / Data replication: Read 부하가 클 때.
- Vertical Partition: 특정 컬럼만 자주 사용할 때.
References
- https://nesoy.github.io/articles/2018-02/Database-Partitioning
- https://nesoy.github.io/articles/2018-05/Database-Shard
- https://velog.io/@matisse/Database-sharding%EC%97%90-%EB%8C%80%ED%95%B4
- https://www.itworld.co.kr/news/200134
- https://techblog.woowahan.com/2687/
- https://jaehoney.tistory.com/245