关键字:MongoDB中缩减Shard集群(删除一个Shard)--删除一个分片
对MongoDB的Shard集群来说,添加一个分片很简单,AddShard就可以了。
但是缩减集群(删除分片)这种一般很少用到。由于某服务器挂了,所以想送修之前必须把它上面的数据自动迁移到其他Shard上。
以下内容翻译自:http://docs.mongodb.org/manual/tutorial/remove-shards-from-cluster/
1、执行RemoveShard命令
db.runCommand( { removeshard: "your_shard_name" } )
{ msg : "draining started successfully" , state: "started" , shard :"mongodb0" , ok : 1 }
“[color=red]注意:该命令至少执行两次才能成功删除,执行到state为completed才真正删除,否则就是没用删除成功,该分片处于"draining" : true状态,该状态下不但该分片没用删除成功,而且还影响接下来删除其他分片操作,遇到该状态再执行一次removeshard即可,最好就是删除分片时一直重复执行删除命令,直到state为completed;
还有一个需要注意的地方就是:被成功删除的分片如果想要再加入集群时,必须将data数据目录清理干净才可以再加入集群,否则即使能加入成功也不会存储数据,集合都不会被创建
另外:在删除分片的时有可能整个过程出现无限"draining" : true状态,等多久还是这样,而且分片上面的块一个都没有移动到别的分片,解决办法是:在config的config数据库的shard集合中找到该分片的信息,并将draining字段由True改为False,再继续试着删除操作[/color]”
上面这句会立即返回,实际在后台执行。
2、查看迁移状态
我们可以反复执行上面语句,查看执行结果。
db.runCommand( { removeshard: "your_shard_name" } ) { msg: "draining ongoing" , state: "ongoing" , remaining: { chunks: [color=red]42[/color], dbs : [color=red]1 [/color]}, ok: [color=red]1[/color] }
从上面可以看到,正在迁移,还剩下42块没迁移完。
当remain为0之后,这一步就结束了。
3、移出非Shard数据(如果开始就知道是primary可以直接执行 步骤3和4即可,1和2不需要执行)
如果你要[color=red]删除的Shard分片恰好是primary[/color],那么执行这一步,[color=red]否则请跳过![/color]
db.runCommand( { movePrimary: "数据库名称", to: "分片名称" })
这次就不是立即返回了,需要很久,然后会返回如下:
{ "primary" : "mongodb1", "ok" : 1 }
4、最后的清理
上面步骤都完成后,还需要再执行一次RemoveShard,清理残余数据。
db.runCommand( { removeshard: "mongodb0" } )
执行成功后,会如下结果:
{ msg: "remove shard completed succesfully" , stage: "completed", host: "mongodb0", ok : 1 }
显示completed后,就可以安心的关闭mongod的进程了。