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
Posted by bloodguy
,