mongwwwbb0005comoDBI990883666Ishard

在使用mongoDB过程中,我们经常做的是向集群中添加shard,这个操作介绍的很多。但是有时候因为某些情况需要移除某个shard。下面介绍一下操作:

1,登录mongos
移除shard必须在mongos节点执行命令

我们先查一下当前的shard

mongoDb集群移除shard的操作
2,开始移除: db.runCommand( {removeshard:"shard1"} )
mongoDb集群移除shard的操作
看到如图的报错。原因下面说

3,做主节点切换
一个库如果开启了分片,他是有一个primary shard的。不是所有分片都是平等的。

如果要移除的恰好是主分片,必须在迁移完数据后,手动执行 movePrimary命令

指定新的主分片

去config库下

mongos> use config
switched to db config
mongos> db.databases.find()
mongoDb集群移除shard的操作
可以看到,我现在有开启分片,primary是shard1的,也有没开启分片,primary是shard1的

然后去admin库下

mongos> use admin
switched to db admin
mongos> db.runCommand({"moveprimary":"app","to":"shard2"})
{ "primary" : "shard2:shard2/10.135.7.56:20000,10.135.7.58:20000", "ok" : 1 }
注意,这里要注意,官方有警告:

Warning

Do not perform this procedure until you have finished draining the shard.

要等能迁移的shards数据都移干净了,即下图中的remaining chunks是0了,再操作这个。

这个过程根据数据量的大小不同,会非常慢。不要急

对所有报错的库都执行一下

然后再继续去removeshard

4,结束善后
迁移动作会进行的比较慢,以免给集群带来过大的压力。

mongoDb集群移除shard的操作
在进行中,返回的信息中remain显示还有多少数据需要移动

最后:

看shards的列表里也没有shard1了

现在可以关闭shard1的实例了

最后还有一步,官方建议要完成后要刷新一下mongs的路由数据,以防mongos路由到错误的地址

方法:重启所有的mongos节点,或者所有mongos节点执行下

mongos> db.adminCommand("flushRouterConfig")

{ "flushed" : true, "ok" : 1 }

这个命令会清空本地的路由表,然后从config节点重新拉取数据生成新的路由表。

猜你喜欢

转载自blog.51cto.com/14280201/2374913
今日推荐