balancer를 무조건 신뢰하기는 힘들다.

수동으로 chunk를 나누고 shard간에 분배시켜 유지하기 위해서, 

sh.splitFind() 명령어를 이용해 chunk를 관리하기 좋은 크기로 잘게 나눈 다음,

원하는 chunk를 각 shard에 적절히 분배하기 위해 chunk를 옮겨야 한다.


이때 사용되는 명령어가 sh.moveChunk()


shard가 shard001, shard002 이렇게 2개 있고,

namespace가 SERVICE_DB.USER_LIST 이고,

이동하고자 하는 chunk가 user_id=bloodguy, nicehide 를 포함하는 2개의 chunk 이고,

shard001 -> shard002로 옮기려고 할 경우,


아래의 명령어를 통해 원하는 바를 이룰 수 있다.


// 1. 일단 balancer를 중지한다.

sh.stopBalancer()


// 2. chunk 이동

sh.moveChunk('SERVICE_DB.USER_LIST', {user_id:'bloodguy'}, 'shard002')

sh.moveChunk('SERVICE_DB.USER_LIST', {user_id:'nicehide'}, 'shard002')


// 3. balancer 재시작

sh.startBalancer()





왠만하면 pre-split을 하거나 balancer를 신뢰하거나 chunk가 균등분배 되길 바라는 쪽이 낫다.

대용량이고 chunk수가 많을 경우 수동으로 하는 건 정말 할 짓이 아닌 것 같다.




[참조]

startBalancer : http://docs.mongodb.org/manual/reference/method/sh.startBalancer/

stopBalancer : http://docs.mongodb.org/manual/reference/method/sh.stopBalancer/

sh.moveChunk : http://docs.mongodb.org/manual/reference/method/sh.moveChunk/

Migrate Chunks in a Sharded Cluster : http://docs.mongodb.org/manual/tutorial/migrate-chunks-in-sharded-cluster/







Posted by bloodguy
,