티스토리 뷰
728x90
반응형
샤딩
- 여러 장비에 걸쳐 데이터를 분할하는 과정
- 파티셔닝이라는 용어로도 불림
- 하드웨어 및 비용 제약을 해결하거나 애플리케이션에 나은 성능을 제공하기 위해 데이터셋을 분할하는데 사용
- 더 자주 사용되는 데이터를 성능이 더 좋은 하드웨어에 배치
- 지역에 따라 데이터셋을 분할해 주로 접근하는 애플리케이션 서버와 가까운 컬렉션에서 서브셋 조회
- 수동 샤딩을 사용하면 애플리케이션이 다른 DB 서버와 연결을 유지, 각 서버는 완전히 독립적
- 몽고는 애플리케이션에서 구조를 추상화하고 시스템 관리를 간단하게 하는 자동 샤딩을 지원
클러스터 구성 요소
- 몽고는 샤딩을 통해 많은 장비의 클러스터를 생성하고, 각 샤드에 데이터 서브셋을 넣음으로써 컬렉션을 쪼갬
- 애플리케이션이 독립 실행형 서버나 복제 셋의 리소스 한계에 구애되지 않음
- 샤드 앞단에 있는 mongos 라는 라우팅 프로세스를 실행
- mongos에는 어떤 샤드가 어떤 데이터를 포함하는지 알려주는 '컨텐츠 목차'가 있음
- 라우터는 어떤 데이터가 어떤 샤드에 있는지 알기 때문에 요청을 적절한 샤드로 전달
Mongos
mongos는 MongoDB의 샤딩된 환경에서 동작하는 라우터 프로세스
샤드 클러스터의 애플리케이션과 상호 작용하며, 데이터를 올바른 샤드로 라우팅하는 역할
- 샤드 키 기반 라우팅: mongos는 데이터베이스 요청을 받고, 샤드 키를 기반으로 해당 데이터가 어느 샤드에 저장되어 있는지 결정하여 요청을 올바른 샤드로 라우팅합니다.
- 쿼리 분석 및 최적화: mongos는 쿼리를 분석하고 최적화하여 샤드 간의 데이터 이동을 최소화하고 쿼리 성능을 최적화합니다.
- 샤드 클러스터와의 통신: mongos는 샤드 클러스터의 구성 요소와 통신하여 데이터 이동, 복제 및 분산 관리 작업을 수행합니다.
- 로드 밸런싱: mongos는 데이터베이스 요청을 샤드 간에 균형 있게 분산하여 로드 밸런싱을 제공합니다.
- 캐시 및 DNS 해결: mongos는 DNS 해결을 통해 샤드 구성을 확인하고 캐시를 통해 샤드 정보를 저장하여 성능을 향상시킵니다.
단일 장비 클러스터에서의 샤딩
mongo 셸 시작
> mongosh --nodb --norc
ShardingTest 클래스로 클러스트를 생성
각 샤드를 복제 셋으로 생성하면 샤드 클러스터의 전형적인 아키텍처를 명확하게 볼 수 있음
ShardingTest는 샤드 클러스터를 실험하는 가장 간단한 수단
연결 가능한 실행 중인 프로세스는 10개 : 노드 3개로 구성된 복제 셋 2개 (6개) + 노드 3개의 구성 서버 1개 + mongos 1개
st = ShardingTest({
name:"one-min-shards",
chunkSize:1,
shards:2, //두개의 샤드 구성
rs:{
nodes:3, //각 샤드를 oplog가 10MiB인 3-노드
oplogSize:10
},
other:{
enableBalancer:true //밸런서 활성화. 두개 샤드에 데이터 분산
}
});
sh.status()를 실행해 클러스터를 전체 확인 가능
sh는 rs와 비슷하지만 여러 샤딩 보조자 함수를 정의하는 전역 변수
> sh.status()
새로운 셸을 사용해 클러스터의 mongos 연결
mongos 는 요청을 샤드로 라우팅
> mongosh --nodb
> db = (new Mongo("localhost:20009")).getDB("accounts")
특정 컬렉션을 샤딩하려면 컬렉션의 데이터베이스에서 샤딩을 활성화
> sh.enableSharding("accounts") //accounts 라는 데이터베이스
컬렉션을 샤딩할 때 shard key를 선택
데이터를 분할하는데 사용하는 필드, 인덱싱과 유사한 개념
샤드 키를 만들려면 필드에 인덱스를 생성해야 함
"username" 필드에 인덱스 생성 후 컬렉션 샤딩
> db.users.createIndex({"username" : 1})
> sh.shardCollection("accounts.users", {"username" : 1})
컬렉션이 chunk로 분할되는 프로세스
- 샤딩 전에 컬렉션은 단일 chunk
- 샤드 키를 기반으로 컬렉션을 더 작은 chunk로 분할
- 분할된 chunks는 여러 클러스터에 분산
targeted queries : 샤드 키를 포함하며 단일 샤드나 샤드 서브셋으로 보낼 수 있는 쿼리
scatter-gater queries : 모든 샤드로 보내야하는 쿼리
mongos는 쿼리를 모든 샤드로 분산한 다음 결과를 수집
728x90
반응형
'DB > MongoDB' 카테고리의 다른 글
[MongoDB] 샤딩 구성 (0) | 2023.12.10 |
---|---|
[MongoDB] 복제 셋 관리 (0) | 2023.08.08 |
[MongoDB] 애플리케이션에서 복제 셋 연결 (0) | 2023.08.01 |
[MongoDB] 복제 셋 구성 요소 (0) | 2023.07.27 |
[MongoDB] 복제 셋 설정 (0) | 2023.07.11 |
반응형
300x250