아무것도 안하고 shard를 추가해서 쓰고 있다면 해당 클러스터의 shard들의 용량은 무제한 상태이다.

하지만 config 데이터베이스의 shards collection에서 각 shard별 maxSize 값을 변경해서 최대용량을 제한할 수 있다.

단위는 MB.


shard간 RAM, Disk 사이즈가 다를 경우 딱 맞게 구성하기 위해 maxSize를 설정할 필요성이 있다.


주의해야 할 점은 maxSize값은 balancer가 chunk를 migrate하는 데에만 영향을 미친다는 것이다.

balancer가 chunk migrate를 할 때 mapped size가 maxSize를 넘어선 shard로는 chunk를 보내지는 않지만,

이미 넘어있는 상태에서 maxSize가 mapped size보다 작게 설정된 shard의 chunk를 자동으로 뽑아서 옮기지는 않는다. (이건 수동으로 해줘야 함)


maxSize값은 shard를 추가할 때만이 아니라 구동중인 shard에도 설정할 수 있다.


shard를 추가하면서 maxSize 값을 설정하려면 sh.addShard 명령어로 추가하면 안되고,

db.runCommand의 addshard 명령어로 추가해야 한다.

// shard0010 을 추가하면서 maxSize를 16G (=16 x 1024)로 제한.

mongos> db.runCommand({addshard:'shard0010', maxSize: 16384});



이미 구동중인 shard의 maxSize를 변경하려면 config.shards 컬렉션에서 해당 shard의 maxSize 값을 변경하면 된다.

// shard0001의 maxSize는 설정되지 않은 상태임을 확인 (=무제한)

mongos> use config;

mongos> db.shards.find({_id: 'shard0001'});

{ "_id" : "shard0001", "host" : "shard0001/n001.bloodguy.com:21017,n002.bloodguy.com:21017"}


// shard0001의 maxSize를 1M로 제한

mongos> db.shards.update({_id: 'shard0001'}, {$set: {maxSize: 1}});

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })


// 이후 write가 마구 일어나서 chunk split이 일어나도 shard0001로 chunk migration이 일어나지는 않는다.


// shard0001의 maxSize를 4G로 늘임

mongos> db.shards.update({_id: 'shard0001'}, {$set: {maxSize: 4096}});

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })


// 만약 shard0001의 mapped size가 4G 이상이면 여전히 chunk migration은 일어나지 않을 것이다.


// shard0001의 maxSize를 무제한으로 수정

mongos> db.shards.update({_id: 'shard0001'}, {$unset: {maxSize: ''}});

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })







[참고]

http://docs.mongodb.org/manual/tutorial/configure-sharded-cluster-balancer/#change-the-maximum-storage-size-for-a-given-shard










Posted by bloodguy
,