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: []
}
}
}
'Database > MongoDB 실습' 카테고리의 다른 글
[MongoDB] 전문검색 인덱스 사용법과 주의사항 (0) | 2024.08.06 |
---|---|
[MongoDB] 멀티 키 인덱스 범위조건 사용하는 방법 (0) | 2024.08.06 |
[MongoDB] 레인지샤딩 범위나누는 방법 (0) | 2024.07.31 |
[MongoDB] 복합인덱스 서브필드 구성 조회 테스트 (0) | 2024.07.30 |
[MongoDB] 쿼리 실행계획 확인하는 방법 explain (1) | 2024.07.30 |