티스토리 뷰

DB/MongoDB

[MongoDB] 샤딩

snail voyager 2023. 8. 30. 10:56
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로 분할되는 프로세스

  1. 샤딩 전에 컬렉션은 단일 chunk
  2. 샤드 키를 기반으로 컬렉션을 더 작은 chunk로 분할
  3. 분할된 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