반응형
샤딩(Sharding)과 클러스터링(Clustering)은 모두 대규모 데이터와 높은 트래픽을 처리하기 위해 사용되는 데이터 분산 기술입니다.
하지만 목적과 구현 방식에서 차이가 있습니다.
샤딩(Sharding)
정의
- 데이터를 수평적으로 분할하여 여러 데이터베이스 노드에 분산 저장하는 방식
- 각각의 분할된 데이터는 샤드(Shard)라고 불리며, 각 샤드는 독립적으로 작동합니다.
특징
- 데이터 분산:
- 전체 데이터셋을 여러 샤드로 나누어 저장
- 샤드 간에는 중복 데이터가 거의 없고, 각 샤드가 고유 데이터만 저장
- 샤드 키(Shard Key):
- 데이터를 분산할 기준이 되는 필드
- 예: 사용자 ID, 주문 ID, 날짜 등
- 수평 확장:
- 샤드를 추가하면 데이터 저장 용량과 처리 능력이 확장
장단점
- 대규모 데이터 처리를 효율적으로 분산
- 쓰기 및 읽기 성능 향상
- 데이터 크기 증가에 따른 유연한 확장
- 잘못된 샤드 키 선택 시 데이터 불균형 발생
- 샤드 간 쿼리는 복잡하며 성능 저하를 초래할 수 있음
- 관리 복잡성 증가
사용 사례
- 데이터 크기가 급격히 증가하며, 수평 확장이 필요한 경우
- 사용자 기반으로 데이터를 분리해야 하는 경우(예: 소셜 네트워크, 다중 테넌트 환경)
- 특정 샤드 키를 기준으로 데이터 액세스가 자주 이루어지는 경우
클러스터링(Clustering)
정의
- 동일한 데이터를 여러 노드에 복제하여 가용성과 성능을 높이는 방식
- 데이터는 모든 클러스터 노드에 동일하게 존재하며, 노드 간에 데이터 동기화가 이루어집니다.
특징
- 데이터 복제:
- 클러스터 내 모든 노드에 데이터가 복제
- 복제본을 통해 데이터 가용성 및 안정성을 보장
- 읽기 성능 향상:
- 읽기 요청을 여러 노드에 분산하여 처리
- 쓰기 작업은 보통 단일 마스터 노드에서 처리한 후 복제
- 고가용성:
- 특정 노드에 장애가 발생해도 다른 노드에서 서비스 가능
장단점
- 데이터 손실 위험 최소화
- 읽기 부하를 여러 노드에 분산 가능
- 장애 복구 및 데이터 백업이 용이
- 쓰기 작업은 마스터 노드에 집중될 수 있어 병목 발생 가능
- 데이터 동기화 및 일관성 관리가 복잡
- 수평 확장이 제한적(데이터 크기 증가 시 샤딩 필요)
사용 사례
- 데이터 가용성과 안정성이 중요한 경우(예: 금융, 전자상거래)
- 읽기 요청이 많고 쓰기 작업은 상대적으로 적은 경우
- 장애 복구가 필요한 고가용성 시스템
샤딩과 클러스터링의 비교
특성 | 샤딩(Sharding) | 클러스터링(Clustering) |
데이터 분포 방식 | 데이터를 샤드 키를 기준으로 분산 저장 | 모든 노드에 동일한 데이터 복제 |
확장성 | 수평 확장(데이터 노드 추가로 확장) | 수직 확장(노드 성능 향상이 주요 방법) |
목적 | 대규모 데이터를 효율적으로 분산 저장 | 데이터 가용성 및 읽기 성능 향상 |
읽기 성능 | 샤드에 따라 읽기 성능이 달라질 수 있음 | 여러 노드에서 읽기 성능이 균일하게 향상 |
쓰기 성능 | 샤드 간 병렬 쓰기로 성능 향상 가능 | 쓰기 병목 발생 가능 |
데이터 중복 | 없음 | 모든 노드에 동일 데이터 존재 |
관리 복잡성 | 샤드 키와 데이터 분배 설계 필요 | 데이터 동기화 및 장애 복구 관리 필요 |
어떤 경우에 각각 사용해야 하나요?
샤딩 사용 시기
- 데이터 규모가 매우 크고 지속적으로 증가
- 쓰기 성능이 병목이 되는 상황
- 특정 기준(예: 사용자, 시간)에 따라 데이터를 분리해 처리하는 것이 효율적인 경우
클러스터링 사용 시기
- 시스템 가용성과 데이터 복제본 유지가 중요
- 읽기 요청이 많고, 읽기 성능을 높이는 것이 최우선 과제
- 특정 노드의 장애 복구가 필요한 경우
결론
- 샤딩은 대규모 데이터를 분산 처리하고 수평 확장이 필요한 경우에 적합하며, 클러스터링은 고가용성과 읽기 성능 향상이 필요한 경우에 적합합니다.
- 두 방법은 상호 보완적으로 사용 가능하며, 대규모 시스템에서는 샤딩과 클러스터링을 조합하여 데이터 확장성과 가용성을 동시에 확보하기도 합니다.
반응형
'ETC' 카테고리의 다른 글
Jenkins Pipeline에 Slack 연동하기 (0) | 2022.05.08 |
---|---|
Jenkins를 이용한 Docker 컨테이너 자동 배포하기(Blue Ocean, Bitbucket, NCP) (8) | 2022.05.06 |
Jenkins를 이용한 프로젝트 자동 배포하기(Bitbucket, EC2) (0) | 2022.05.03 |
H2 Database 사용자 정의 함수 만들기 (0) | 2022.04.19 |
인텔리제이 TODO 기능 활용하기 (0) | 2022.01.06 |