您的位置:首页 > 数据库 > Mongodb

mongodb移除分片删除分片上数据库和添加分片

2018-01-12 19:09 633 查看
首先我们要移除的分片之后再次添加此分片时会出现添加失败的情况,需要在添加的分片上登录进行删除此分片之前数据库的历史数据比如testdb,删除分片上的数据库之后就可重新添加此分片到mongos中







1、执行RemoveShard命令 

db.runCommand( { removeshard: "your_shard_name" } ) 

{ msg : "draining started successfully" , state: "started" , shard :"mongodb0" , ok : 1 } 

“注意:该命令至少执行两次才能成功删除,执行到state为completed才真正删除,否则就是没用删除成功,该分片处于"draining" : true状态,该状态下不但该分片没用删除成功,而且还影响接下来删除其他分片操作,遇到该状态再执行一次removeshard即可,最好就是删除分片时一直重复执行删除命令,直到state为completed; 

还有一个需要注意的地方就是:被成功删除的分片如果想要再加入集群时,必须将data数据目录清理干净才可以再加入集群,否则即使能加入成功也不会存储数据,集合都不会被创建 

另外:在删除分片的时有可能整个过程出现无限"draining" : true状态,等多久还是这样,而且分片上面的块一个都没有移动到别的分片,解决办法是:在config的config数据库的shard集合中找到该分片的信息,并将draining字段由True改为False,再继续试着删除操作” 

上面这句会立即返回,实际在后台执行。 

2、查看迁移状态 

我们可以反复执行上面语句,查看执行结果。 

db.runCommand( { removeshard: "your_shard_name" } ) { msg: "draining ongoing" , state: "ongoing" , remaining: { chunks: 42, dbs : 1 }, ok: 1 } 

从上面可以看到,正在迁移,还剩下42块没迁移完。 

当remain为0之后,这一步就结束了。 

3、移出非Shard数据(如果开始就知道是primary可以直接执行 步骤3和4即可,1和2不需要执行) 

如果你要删除的Shard分片恰好是primary,那么执行这一步,否则请跳过! 

db.runCommand( { movePrimary: "数据库名称", to: "分片名称" }) 

这次就不是立即返回了,需要很久,然后会返回如下: 

{ "primary" : "mongodb1", "ok" : 1 } 

4、最后的清理 

上面步骤都完成后,还需要再执行一次RemoveShard,清理残余数据。 

db.runCommand( { removeshard: "mongodb0" } ) 

执行成功后,会如下结果: 

{ msg: "remove shard completed
4000
succesfully" , stage: "completed", host: "mongodb0", ok : 1 } 

显示completed后,就可以安心的关闭mongod的进程了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: