MongoDB 7.0 기준.
과거엔 chunk migration 기준이 shard 간 chunk 갯수 차이였으나,
이젠 chunk 갯수와 관계없이 shard 간 데이터 사이즈가 chunk size x 3 이상 차이가 날 경우임.
migration이 너무 빈번하게 발생할 경우,
컴퓨팅 자원과 대역폭을 소모하게 되므로 다른 query 처리에 영향을 미치게 되고,
oplog length도 줄어들어 secondary가 내려갔을 경우 다시 붙어서 primary와 sync할 수 있는 시간도 줄어들게 되는 문제가 있음.
그러므로 migration 돌아가는 분위기를 보면서 너무 빈번하게 일어난다 싶으면 chunk size를 좀 더 높일 필요도 있음.
아무 설정도 하지 않았을 경우 기본값은 128MB이므로 shard 간 데이터 사이즈가 384MB 이상 차이나면 chunk migration이 일어나는데,
들어오는 데이터가 크고 완전히 균등분배로 들어오는게 아닐 경우 migration이 너무 빈번하게 일어날 수 있으므로 chunk size를 256이나 512로 올리는게 권장됨.
기본 사이즈 변경
https://www.mongodb.com/docs/manual/tutorial/modify-chunk-size-in-sharded-cluster/
아무것도 설정하지 않은 상태에서 기본 사이즈는 128MB.
변경할 수 있는 범위는 1~1024MB.
모든 데이터베이스.컬렉션의 기본 chunk 사이즈를 변경하고 싶으면 아래처럼.
use config
// 256MB로 변경
db.settings.updateOne({
{ _id: 'chunksize' },
{ $set: { _id: 'chunksize', value: 256 } },
{ upsert: true }
})
컬렉션별 사이즈 변경
https://www.mongodb.com/docs/manual/reference/command/configureCollectionBalancing/
나머지 컬렉션들은 안정적인데 특정 컬렉션만 데이터 유입량이 많아 불균등 상태가 반복되고 migration이 빈번하게 일어난다면,
특정 컬렉션만 chunk size를 변경할 수 있음.
// mydb.mycollection의 chunk size를 256MB로 변경
db.adminCommand({
configureCollectionBalancing: 'mydb.mycollection',
chunkSize: 256
})
chunkSize를 0으로 설정할 경우 리셋되어 다시 전역 chunkSize로 변경됨.
주의할 점은,
chunk의 document 수가 컬렉션의 설정된 (chunkSize / avgObjSize) x 2 개를 넘어갈 경우 chunk migration이 불가능하므로,
계산을 잘 해보고 변경할 것.
// avgObjSize
db.mycol.stats().avgObjSize
16095.364110365645
// 변경하려는 chunk size가 256MB 라고 할 경우
// 256MB 크기의 chunk의 document 수가 ((256 * 1024 * 1024) / 16906) * 2 = 31756 개를 넘어가면 안됨
configureCollectionBalancing의 경우 chunkSize 외에도 defragmentCollection, enableAutoMerge 옵션이 더 있으므로, 궁금하면 공식문서 참고할 것.
특정 컬렉션의 chunkSize를 알고 싶으면 sh.balancerCollectionStatus()를 이용하면 됨.
config.collections.findOne({ _id:NAMESPACE }) 도 가능하지만 balanced 상태까지 볼 수 있으므로 sh.balancerCollectionStatus()가 더 편함.
컬렉션의 balanced 상태 확인
https://www.mongodb.com/docs/manual/reference/method/sh.balancerCollectionStatus/
sh.balancerCollectionStatus('mydb.mycollection')
// 이런 형태의 결과값이 출력됨
// https://www.mongodb.com/docs/manual/reference/command/balancerCollectionStatus/#std-label-cmd-balancer-CollectionStatus-output
{
chunkSize: 256, // chunkSize (MB)
balancerCompliant: true, // true=balanced 상태라 chunk migration 필요없음, false는 반대
ok: 1,
'$clusterTime': {
clusterTime: Timestamp({ t: 1720663692, i: 8 }),
signature: {
hash: Binary.createFromBase64('x3L49S8+8fTuRPRXel6gs8s8Flk=', 0),
keyId: Long('7348622497232715799')
}
},
operationTime: Timestamp({ t: 1720663692, i: 4 })
}
'DataBase' 카테고리의 다른 글
[MongoDB] Range deletion (0) | 2024.07.23 |
---|---|
[MongoDB] BSON (0) | 2024.07.19 |
[MongoDB] chunk 관리 (0) | 2024.07.04 |
[MongoDB] oplog 분석 (0) | 2024.05.29 |
[MongoDB] mongosh에서 JavaScript 사용하기 (0) | 2024.02.27 |