[몽고DB 완벽가이드] 샤딩의 개념

반응형
728x90
반응형

샤딩

샤딩은 여러 장비에 걸쳐 데이터를 분할하는 과정을 뜻한다. 각 장비에 데이터의 서브셋을 넣음으로써, 더 많은 수의 덜 강력한 장비로 더 많은 데이터를 저장하고 더 많은 부하를 처리할 수 있다. 컬렉션을 분할한 조각 데이터(청그)를 저장하며, 복제 세트로 구성될 수 있다.

  • 더 자주 접근하는 데이터를 성능이 더 좋은 하드웨어에 배치할 수 있다.
  • 지역에 따라 데이터셋을 분할해 주로 접근하는 애플리케이션 서버와 가까운 컬렉션에서 도큐먼트의 서브셋을 찾을 수 있다. ex) 사용자가 특정 로케일(locale)을 기반으로 할때

https://urame.tistory.com/entry/%EB%AA%BD%EA%B3%A0%EB%94%94%EB%B9%84mongodb-%EC%83%A4%EB%93%9Cshard-%EC%84%A4%EC%A0%95

샤딩은 개발 및 운영 측면에서 몽고DB를 구성하는 가장 어렵고 복잡한 방법이다. 모니터링할 구성 요소가 많고, 클러스터에서 데이터가 자동으로 옮겨 다니기 때문이다. 

 

 

몽고DB 에서의 자동 샤딩

몽고DB는 애플리케이션에서 구조를 추상화하고 시스템 관리를 간단하게 하는 자동 샤딩을 지원한다. 몽고DB가 샤드에 걸쳐 데이터 분산을 자동화하므로 용량을 추가하고 제거하기 쉽다.

 

 

클러스터 구성 요소

몽고DB 샤딩을 통해, 많은 장비(샤드)의 클러스터를 생성하고, 각 샤드에 데이터 서브셋을 넣음으로써 데이터를 쪼갤 수 있다. 샤딩의 목적은 2개, 3개, 10개, 심지어 1000개의 샤드 클러스터가 하나의 장비처럼 보이게 하는 것이다. 이러한 세부 사항을 애플케이션으로부터 숨기기 위해, 샤드 앞단에 있는 mongos라는 라우팅 프로세스를 실행한다.

 

 

mongos

어떤 샤드가 어떤 데이터를 포함하는지 알려주는 '컨텐츠 목차'가 있다. 애플리케이션은 라우터에 연결해 정상적으로 요청을 발행할 수 있다. 라우터는 어떤 데이터가 어떤 샤드에 있는지 알기 때문에 요청을 적절한 샤드로 전달할 수 있다. 요청에 대한 응답이 있으면 라우터는 응답을 수집하고 필요하다면 통합하여 애플리케이션으로 되돌려보낸다. 

 

샤드 클라이언트 연결 (sharded client connection)

https://dontbesatisfied.tistory.com/9

구성요소 설명
Mongos 다수 구성된 샤드의 인터페이스 역할
클라이언트 요청의 올바른 샤드로 라우팅
Config Servers 전체 클러스터의 메타 데이터, 구성 설정을 저장하는 서버

 

 

단일 장비 클러스터에서의 샤딩

클러스터를 만들기위해 ShardingTest 클래스를 사용한다.

 

ShardingTest

  • 몽고DB 엔지니어링 내부용으로 설계된 클래스다.
  • 몽고DB 서버와 함께 제공되므로, 샤드 클러스터를 실험할 수 있는 가장 간단한 수단이다.
  • 서버 테스트 셋을 지원하도록 설계됐고, 이런 용도로 사용된다.
  • 기본적으로 리소스 사용률을 가능한 한 작게 유지하고 분할된 클러스터의 복잡한 아키텍처를 설정하는데 도움이 되는 편의 기능을 많이 제공한다.
  • 컴퓨터 내에 /data/db 디렉터리가 있어야 실행된다.

 

▶ mongo 셸을 시작한다.

$ mongo --nodb --norc

 

▶ mongo 셸에서 다음을 실행한다.

st = ShardingTest({
    name:"one-min-shards",
    chunkSize:1,
    shards:2,
    rs:{
        nodes:3,
        oplogSize:10
    },
    other:{
        enableBalancer:true
    }
});
옵션 설명
name 샤드 클러스터에 대한 레이블
shards 클러스터가 2개의 샤드로 구성되도록 지정
rs 각 샤드를 oplogSize가 10MiB인 3-노드 복제 셋으로 정의
other 클러스터가 스핀 업되면 밸런서를 활성화하도록 ShardingTest에 지시
-> 데이터가 두 샤드에 균등하게 분산된다.

 

명령 실행시, ShardingTest의 작업 수행

1) 두개의 샤드가 있는 새 클러스터를 생성한다.

2) 각 샤드는 복제셋이다.

3) 복제 프로토콜을 설정하는데 필요한 옵션으로 복제 셋을 구성하고 각 노드를 시작한다.

4) mongos를 시작해 전체 샤드의 요청을 관리한다.

  • 클라이언트는 독립형 mongod와 통신하듯 클러스터와 상호작용할 수 있다.

5) 구성 서버에 대한 추가 복제 셋을 시작한다. 

  • 쿼리를 올바른 샤드로 전달하는데 필요한 라우팅 테이블 정보를 유지한다.

 

ShardingTest가 클러스터 설정을 마치면 연결 가능한 실행중인 프로세스는 10개다. 

- 노드 3개로 구성된 복제셋 2개
- 노드 3개로 구성된 구성 서버 복제 셋 1개
- mongos 1개

 

 

mongos 연결

▶ 두번째 터미널창을 열어 다른 mongo 셸을 시작하자.

$ mongo --nodb

 

▶ 이 셸에서 클러스터의 mongos에 연결하자. mongos는 포트 20009에서 실행한다.

> db = (new Mongo("localhost:200009")).getDB("accounts")

mongos는 요청을 샤드로 라우팅한다. 샤드의 정보(개수, 주소 등)는 전혀 몰라도 된다. 샤드가 있는 한 요청을 mongos에 보내서 적절하게 전달하도록 허용할 수 있다.

 

▶ 데이터를 삽입하자.

> for (var i = 0; i < 100000; i++) {
    db.users.insert({"username":"user"+i, "created_at":new Date()}); 
}
> db.users.count()
100000

 

▶ 클러스터를 전체적으로 조회할 수 있다.

  • 샤드, 데이터베이스, 컬렉션에 대한 요약을 제공한다.
> sh.status()

 

sh 의미

샤딩의 경우 여러 샤딩 보조자 함수 (sharding helper function)를 정의하는 전역 변수 

 

 

프라이머리 샤드

각 데이터베이스마다 무작위로 선택되는 프라이머리 샤드가 있다. 모든 데이터는 프라이머리 샤드에 있다.  프라이머리 샤드는 샤드를 구성하는 전체 복제셋을 가리킨다. 몽고DB는 데이터를 분산할 방법을 모르기 때문에 아직 데이터를 자동으로 분산할 수 없다. 컬렉션마다 데이터를 어떻게 분산할지 알려야한다. 

https://www.mongodb.com/basics/sharding

 

https://scorpio-mercury.tistory.com/44

 

 

특정 컬렉션 샤딩

특정 컬렉션을 샤딩하려면 먼저 컬렉션의 데이터베이스에서 샤딩을 활성화한다. 이를위해 enableSharding 명령을 실행한다.

> sh.enableSharding("accounts")

이제 accounts 데이터베이스에서 샤딩이 활성화돼 데이터베이스 내에서 컬렉션을 샤딩할 수 있다.

 

 

샤드 키(shard key)

컬렉션을 샤딩할때 샤드 키 (shard key)를 선택하는데, 이는 몽고DB가 데이터를 분할하는데 사용하는 필드다.  샤딩된 키는 샤딩 후에 변경이 불가능하다. 

 

예시

"username"에서 샤딩하도록 선택하면 몽고DB는 데이터를 사용자 이름 범위로 나눈다. 

"a1-steak-sauce" 에서 "defcon"까지, "defcon1"에서 "howie1998"까지로 나눈다. 

 

샤드 키를 선택하는 것은 컬렉션 내 데이터 순서를 선택하는 것으로 생각할 수 있다. 인덱싱과 유사한 개념이며, 컬렉션이 커질수록 샤드 키가 컬렉션에서 가장 중요한 인덱스가 된다. 샤드 키를 만들려면 필드에 인덱스를 생성해야한다.

 

▶ 샤딩을 활성화하기전에, 샤딩하려는 키에 인덱스를 먼저 생성하자.

> db.users.createIndex({"username" : 1})

 

▶ "username"으로 컬렉션을 샤딩할 수 있다.

> sh.shardCollection("accounts.users", {"username" : 1})

결과적으로 컬렉션은 13개의 청크로 분할되고, 청크가 샤드 간에 균등하게 분산된다.

 

샤딩은 샤드 키 범위를 기반으로 컬렉션을 여러 청크로 분할한다.

https://www.mongodb.com/basics/sharding

 

 

청크 범위의 한도

청크 리스트 시작과 끝에 있는 $minKey, $maxKey 키로 표시된다. 샤드 키 값은 항상 $minKey, $maxKey 사이에 있다.

 

분산-수집 쿼리

모든 샤드로 보내야하는 쿼리 ex) 모든 데이터를 찾으려면 모든 샤드를 방문해야한다.

 

타겟 쿼리

샤드 키를 포함하며 단일 샤드나 샤드 서브셋으로 보낼 수 있는 쿼리

 

 

▶ 모든 서버를 완전히 종료한다.

st.stop()

 

 

반응형

Designed by JB FACTORY