Sharding을 왜 할까?
과거에는 CPU 또는 Memory 사이즈를 증설하여 성능 이슈를 해결
최근 Web 서비스에서 데이터 사이즈가 급증 ➡️ 서버 성능 고도화만으로는 한계가 있다.
다수 장비에 데이터를 분산 위치하여 데이터를 처리하는 Sharding을 하게 됨
Sharding
- 크게 분할과 복제로 나눈다.
- 대규모 데이터베이스를 더 작고 빠르고 더 쉽게 관리되는 부분으로 분리
- shard는 전체의 작은 부분
- 논리 shard가 다른 노드에 저장되면 물리적 shard다.
- 하나의 물리적 shard는 다수의 논리적 shard를 포함할 수 있다.
- shard는 자율적이고 같은 데이터나 컴퓨팅 자원을 공유하지 않는다.
- 모든 shard의 데이터는 논리적 데이터 집합을 나타낸다.
Sharding의 장점
- 데이터베이스 확장성, 성능, 관리 향상
- 데이터베이스의 트랜잭션 비용을 줄인다.
- 높은 가용성
- 읽기/쓰기 처리량 증가
Horizontal sharding | Vertical sharding |
각 새 테이블이 같은 스키마를 가지고 있지만 고유한 행이 있는 경우 더 많은 시스템이 기존 스택에 추가되어 부하를 분산시키고 처리 속도를 높이며 더 많은 트래픽을 지원 이 방법은 쿼리가 종종 함께 그룹화된 행의 하위 집합을 반환할 때 가장 효과적 scaling out이라고도 함 병렬 처리에 특히 유연한 데이터베이스 설계를 생성하는 것을 돕는다. 높은 workloads와 빅 데이터 요구사항에 대해 거의 무제한에 가까운 확장성을 제공 사용자는 모든 쿼리에 대한 클러스터 전체의 모든 컴퓨팅 자원을 최적으로 사용할 수 있다. 각 컴퓨터는 쿼리에 응답할 때 더 적은 행을 스캔해야 하기 때문에 쿼리 확인 속도를 높인다. |
각 새 테이블에 원본 테이블의 스키마의 충실한 하위 집합인 스키마를 가질 경우 쿼리들이 대게 데이터의 열의 하위 집합만을 리턴할 때 효과적이다. RAM 또는 저장 용량을 증가시킨다. CPU 용량을 향상시킨다. 따라서 단일 시스템 또는 서버의 전력을 증가시킨다. |
sharding과 partitioning의 차이
데이터베이스가 sharded된 후 새 테이블에 있는 데이터는 다수의 시스템으로 분산된다.
partitioning은 단일 데이터베이스 인스턴스 안에서 데이터 하위집합을 그룹화한다.
Sharding 아키텍처 종류
종류 | 작동 방법 | 장점 | 단점 |
Key | 해시 함수에 연결된 데이터를 통해 각 데이터 값이 어떤 shard로 이동해야 하는지 결정 |
데이터 분산으로 hotspot을 막는다. 데이터 map은 필요없다. |
동적으로 서버를 추가 및 삭제하는 것이 어려움 재조정하는 동안 해시 함수가 유효하지 않을 수 있다. 서버는 migration하는 동안 새 데이터를 쓸 수 없다. |
Range | 주어진 값의 범위에 따라 데이터를 샤딩(분할)하고, 샤드 키라고 하는 필드를 기반으로 한 범위 | 간단한 구현 서로 다른 shard가 서로 동일한 스키마를 가지므로 간단한 알고리즘 사용 |
데이터베이스 hostpots를 생성할 수 있다. 잘못된 shard key 선택은 성능에 부정적인 영향을 줄 수 있다. |
Directory | Lookup 테이블은 샤드 키를 사용하면 어떤 샤드가 어떤 종류의 데이터를 보유하고 있는지 추적 | 유연성 향상 해시 함수를 필요로 하지 않는다. 각 key를 자체 특정 샤드에 연결 |
어플리케이션 성능에 부정적인 영향을 줄 수 있다. Lookup 테이블이 손상되거나 실패하면 데이터 손실 및 접근성 문제가 발생할 수 있다. |
참고 👇
https://www.techtarget.com/searchoracle/definition/sharding
https://gywn.net/2012/03/gizzard-a-library-for-creating-distributed-datastores/
반응형
'DB' 카테고리의 다른 글
재고시스템으로 알아보는 동시성이슈 해결방법 (0) | 2023.04.30 |
---|---|
SQL Injection (0) | 2022.08.30 |
인덱스 (0) | 2022.07.24 |
[Error] ERR wrong number of arguments for 'zrangebyscore' command (0) | 2022.07.23 |
[ERROR] java.sql.SQLException: Field 'title' doesn't have a default value (0) | 2021.11.21 |