Database/MongoDB 실습

[MongoDB] 레인지샤딩 만들기와 메타 조회방법

꽁담 2024. 7. 29. 17:45

1. MongoDB 레인지샤딩

데이터와 서버의 부하를 분산하기 위해 MongoDB 는 샤딩을 제공하고 있다.

샤딩 기법은 해시 / 레인지가 있고 이 포스팅에서는 레인지 샤딩을 구성해본다.

 

 

2. MongoDB 테스트 버전

유형 버전 구성
mongosh 2.2.10  
mongodb 7.0.12 Config : 1개, 포트 20000
Route : 1개, 포트 20001
Shard1 : 1개, 포트 30001
Shard2 : 1개, 포트 40001

 

 

3. 전제조건

mongodb 는 2개의 샤드서버가 구성되어 있는 상태이다.

[direct: mongos] test> sh.status();
shardingVersion
{ _id: 1, clusterId: ObjectId('66838519ea100ebaf5ee3cc8') }
---
shards
[
  {
    _id: 'rs1',
    host: 'rs1/127.0.0.1:30001',
    state: 1,
    topologyTime: Timestamp({ t: 1719896113, i: 1 })
  },
  {
    _id: 'rs2',
    host: 'rs2/127.0.0.1:40001',
    state: 1,
    topologyTime: Timestamp({ t: 1719896932, i: 2 })
  }
]
---
active mongoses
[ { '7.0.12': 1 } ]

 

4. 레인지샤딩 만들기

4-1. 데이터베이스 샤드 활성화

데이터베이스를 생성 후 샤드를 활성화 해준다.

샤딩 활성화는 enableSharding 명령어를 사용한다.

[direct: mongos] admin> use rangeShardDB
switched to db rangeShardDB

[direct: mongos] rangeShardDB> sh.enableSharding("rangeShardDB")
{
  ok: 1,
  '$clusterTime': {
    clusterTime: Timestamp({ t: 1722242804, i: 6 }),
    signature: {
      hash: Binary.createFromBase64('AAAAAAAAAAAAAAAAAAAAAAAAAAA=', 0),
      keyId: Long('0')
    }
  },
  operationTime: Timestamp({ t: 1722242804, i: 2 })
}

 

4-2. 컬렉션에 샤드 키 설정

컬렉션을 사딩하려면 shardCollection 명령어를 사용한다.

 

샤드 키에 1 혹은 -1 를 입력하면 입력한 키로 샤딩된다.

rangeShardDB 의 collection1 의 index 필드를 오름차순으로 정렬하며 샤딩하는 의미이다.

[direct: mongos] rangeShardDB> sh.shardCollection("rangeShardDB.collection1", {"index": 1})
{
  collectionsharded: 'rangeShardDB.collection1',
  ok: 1,
  '$clusterTime': {
    clusterTime: Timestamp({ t: 1722242863, i: 33 }),
    signature: {
      hash: Binary.createFromBase64('AAAAAAAAAAAAAAAAAAAAAAAAAAA=', 0),
      keyId: Long('0')
    }
  },
  operationTime: Timestamp({ t: 1722242863, i: 33 })
}

 

여기까지 하면 레인지샤딩 컬렉션이 생성된다.

 

5. 레인지샤딩 메타정보 보기

레인지샤딩 메타정보는 라우터에서 sh.status 로 확인할 수 있다.

collections 를 보면 index 필드가 1 로 샤드키로 되어있으며 

chunkMetadata 와 chunks 에서 각 청크별 값의 범위 위치한 샤드서버를 알 수 있다.

 

지금은 레인지범위가 분할되어있지 않기 때문에 1개의 범위만 나온다.

[direct: mongos] test> sh.status()
  {
    database: {
      _id: 'rangeShardDB',
      primary: 'rs1',
      partitioned: false,
      version: {
        uuid: UUID('d6db39d1-0b81-40a7-a539-327cf5158922'),
        timestamp: Timestamp({ t: 1722242803, i: 1 }),
        lastMod: 1
      }
    },
    collections: {
      'rangeShardDB.collection1': {
        shardKey: { index: 1 },
        unique: false,
        balancing: true,
        chunkMetadata: [ { shard: 'rs1', nChunks: 1 } ],
        chunks: [
          { min: { index: MinKey() }, max: { index: MaxKey() }, 'on shard': 'rs1', 'last modified': Timestamp({ t: 1, i: 0 }) }
        ],
        tags: []
      }
    }
  }