MongoDB 分片迁移

目前集群架构

mongos + config server * 3 + shard * 2 ( replication * 3)

首先使用mongo终端连接到mongos.

检查 balancer 是否开启 (必须为开启)

mongos> sh.getBalancerState()
true

确定要删除的分片的名字,查看分片状态

mongos> db.printShardingStatus()
--- Sharding Status --- 
  sharding version: {
  	"_id" : 1,
  	"minCompatibleVersion" : 5,
  	"currentVersion" : 6,
  	"clusterId" : ObjectId("5dfba2392238d44d0911df5a")
  }
  shards:
        {  "_id" : "shard1",  "host" : "rs-shard1/xxx.xxx.xxx.xxx:27017,xxx.xxx.xxx.xxx:27017,xxx.xxx.xxx.xxx:27017",  "state" : 1 }
        {  "_id" : "shard2",  "host" : "rs-shard2/xxx.xxx.xxx.xxx:27017,xxx.xxx.xxx.xxx:27017,xxx.xxx.xxx.xxx:27017",  "state" : 1 }
databases:
        {  "_id" : "results",  "primary" : "shard1",  "partitioned" : false,  "version" : {  "uuid" : UUID("da62d295-1932-4f2b-b815-289215c748cc"),  "lastMod" : 1 } }
        {  "_id" : "config",  "primary" : "config",  "partitioned" : true }

 shards._id 字段列出了每个分片的名字.

从分片中迁移数据块

在 admin 数据库中,运行 removeShard 命令.运行之后会开始将这个分片的数据块”转移”到其他分片的过程

mongos> use admin
mongos> db.runCommand( { removeShard: "shard1" } )
{
	"msg" : "draining started successfully",
	"state" : "started",
	"shard" : "shard1",
	"note" : "you need to drop or movePrimary these databases",
	"dbsToMove" : [
		"aaa"
	],
	"ok" : 1,
	"operationTime" : Timestamp(1637806857, 31),
	"$clusterTime" : {
		"clusterTime" : Timestamp(1637806857, 52),
		"signature" : {
			"hash" : BinData(0,"0S8Z96nkykT9TRyNZRter/75zpk="),
			"keyId" : NumberLong("6972904148362592258")
		}
	}
}

检查迁移的状态

mongos> db.runCommand( { removeShard: "shard1" } )
{
	"msg" : "draining ongoing",
	"state" : "ongoing",
	"remaining" : {
		"chunks" : NumberLong(4255),
		"dbs" : NumberLong(6),
		"jumboChunks" : NumberLong(0)
	},
	"note" : "you need to drop or movePrimary these databases",
	"dbsToMove" : [
		"aaa"
	],
	"ok" : 1,
	"operationTime" : Timestamp(1637819063, 5),
	"$clusterTime" : {
		"clusterTime" : Timestamp(1637819067, 376),
		"signature" : {
			"hash" : BinData(0,"jpm5n4yuZN5+hp56RBebdCFuyvs="),
			"keyId" : NumberLong("6972904148362592258")
		}
	}
}

在输出结果中, remaining 文档显示的是MongoDB必须迁移到其他分片的数据块中剩余的数据块数量与”primary”在这个分片的数据库数量.

在 remaining 字段变为0之前,持续运行 removeShard 命令检查状态.这个命令需要在 admin 数据库上运行,在其他库可以使用 sh.adminCommond 命令操作.

迁移没有分片的数据

如果这个分片是一个或多个数据库的 primary shard, 上面会存储没有分片的数据,如果不是,则跳至 完成迁移 任务.

在集群中,没有分片的数据库只会将数据存放在一个分片上,这个分片就是这个数据库的主分片.(不同的数据库可以有不同的主分片.)

注意: 在分片迁移未完成之前不要执行以下操作。

1. 使用  db.printShardingStatus() 命令可以看到,有一些库是的主分片(primary shard)就是我们要迁移的分片。比如:results 就使用 shard1 作为主分片。

 {  "_id" : "results",  "primary" : "shard1",  "partitioned" : false,  "version" : {  "uuid" : UUID("da62d295-1932-4f2b-b815-289215c748cc"),  "lastMod" : 1 } }

2. 将数据库迁移到另一个分片,需要使用 movePrimary. 将所有的剩余的未分片的数据从 shard1 迁移至 shard2 上:

mongos> db.runCommand( { movePrimary: "products", to: "shard2" })

迁移成功后会返回:

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

完成迁移

为了清除所有的元信息,并结束删除分片的过程,再次执行 removeShard 命令:

mongos> db.runCommand( { removeShard: "shard1" } )

在完成时会显示出成功的信息:

{
    "msg" : "removeshard completed successfully",
    "state" : "completed",
    "shard" : "shard1",
    "ok" : 1
}

一旦 state 的值变为 “completed”,就可以安全地停止 shard1 分片上的monod进程.

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

chaos jin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值