Database/MongoDB 실습

[MongoDB] 샤딩 청크 샤드서버 할당하는 방법

꽁담 2024. 7. 31. 10:58

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개의 샤드서버가 구성되어 있는 상태이다.

레인지샤딩이 아래와 같이 구성되어있고 모든 청크는 rs1 샤드에 있다.

[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 } ]

 

[direct: mongos] rangeShardDB> 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: 4 } ],
        chunks: [
          { min: { index: MinKey() }, max: { index: 1000 }, 'on shard': 'rs1', 'last modified': Timestamp({ t: 1, i: 1 }) },
          { min: { index: 1000 }, max: { index: 2000 }, 'on shard': 'rs1', 'last modified': Timestamp({ t: 1, i: 3 }) },
          { min: { index: 2000 }, max: { index: '가' }, 'on shard': 'rs1', 'last modified': Timestamp({ t: 1, i: 5 }) },
          { min: { index: '가' }, max: { index: MaxKey() }, 'on shard': 'rs1', 'last modified': Timestamp({ t: 1, i: 6 }) }
        ],
        tags: []
      }
    }
  }

 

4. 청크 샤드서버 이동

청크는 moveChunk 의 명령으로 다른 샤드서버로 이동할 수 있다.

청크이동시 샤드서버 리소스와 데이터 중복조회 등이 발생할 수 있으므로 주의한다.

# 청크를 샤드2번서버로 이동
[direct: mongos] rangeShardDB> sh.moveChunk("rangeShardDB.collection1", { "index": 1000 }, "rs2")
{
  millis: 198,
  ok: 1,
  '$clusterTime': {
    clusterTime: Timestamp({ t: 1722390153, i: 50 }),
    signature: {
      hash: Binary.createFromBase64('AAAAAAAAAAAAAAAAAAAAAAAAAAA=', 0),
      keyId: Long('0')
    }
  },
  operationTime: Timestamp({ t: 1722390153, i: 50 })
}

# 청크조회
[direct: mongos] rangeShardDB> sh.status()
  {
    database: {
      _id: 'indexDB',
      primary: 'rs1',
      partitioned: false,
      version: {
        uuid: UUID('4bdeceab-3d12-4c6d-b79e-94f8a094e3f0'),
        timestamp: Timestamp({ t: 1722313944, i: 1 }),
        lastMod: 1
      }
    },
    collections: {}
  },
  {
    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: 3 }, { shard: 'rs2', nChunks: 1 } ],
        chunks: [
          { min: { index: MinKey() }, max: { index: 1000 }, 'on shard': 'rs1', 'last modified': Timestamp({ t: 2, i: 1 }) },
          { min: { index: 1000 }, max: { index: 2000 }, 'on shard': 'rs2', 'last modified': Timestamp({ t: 2, i: 0 }) },
          { min: { index: 2000 }, max: { index: '가' }, 'on shard': 'rs1', 'last modified': Timestamp({ t: 2, i: 0 }) },
          { min: { index: '가' }, max: { index: MaxKey() }, 'on shard': 'rs1', 'last modified': Timestamp({ t: 1, i: 3 }) }
        ],
        tags: []
      }
    }
  }