redis - sharding
TL; DR
Sharding은 수평분할과 관련된 아키텍쳐 패턴입니다. 수평 확장과 단일 장애점(SPOF) 문제를 개선하기에 용이하지만, 그만큼 올바르게 동작하도록 구성하려면 많은 비용과 노력이 필요합니다.
What is Sharding?
각 파티션이 동일한 스키마와 열을 갖지만 그 데이터인 행은 다르게 나누어 갖습니다.
위 그림이 이 내용을 쉽게 설명하고 있는데, Sharding은 Horizontal Partitions 방식으로 데이터를 나누어 저장하는 것을 의미합니다.
Pros & Cons
Pros
- Scale out에 용이합니다.
- 큰 테이블을 여러개로 샤딩하면 쿼리 성능이 올라갈 수 있습니다.
- 특정 Sharding된 영역에 문제 생긴다고 해도, 전체 서비스 장애가 발생하는 것을 막을 수 있습니다.
Cons
- Sharding을 제대로 구현하고 적용하는데 어려움이 많습니다. 잘못 구성하게 되면 데이터 손실등이 발생할 수 있습니다.
- 샤딩 알고리즘 등에 따라 샤드가 불균해질 수 있고 이를 관리해줘야 할 수 있습니다.
- 샤딩된 구조를 단일 아키텍쳐로 돌리기 어렵습니다.
Sharding Strategies
키 기반 샤딩(Key-based Sharding)
• 설명: 각 데이터 항목에 대해 특정 키(예: 해시 함수 결과)를 사용하여 샤드를 결정합니다. • 특징: 해시 함수에 의해 고르게 분포되도록 설계되어 있어, 모든 샤드에 걸쳐 데이터가 균등하게 분포됩니다.
범위 기반 샤딩(Range-based Sharding)
• 설명: 특정 범위의 값을 기반으로 데이터를 샤드에 분할합니다. • 특징: 연속적인 데이터 범위가 같은 샤드에 저장되므로, 특정 범위의 데이터를 조회할 때 효율적입니다.
디렉토리 기반 샤딩(Directory-based Sharding)
• 설명: 샤딩 디렉토리라는 매핑 테이블을 사용하여 데이터 항목이 어떤 샤드에 있는지 관리합니다. • 특징: 유연하지만 디렉토리 테이블을 관리하기 위한 오버헤드가 발생할 수 있습니다.
References
- https://www.digitalocean.com/community/tutorials/understanding-database-sharding