mongodb 分片集群 备份恢复集合

mongodb 分片集群 备份恢复

一、问题:当已经分片的集合备份后,恢复数据时不能按片键分片

二、解决方法:在恢复数据前创建集合分片规则

三、测试环境:

os: CentOS Linux release 7.4.1708 (Core)

mongo: MongoDB shell version v4.0.22-rc0

物理机三台:192.168.126.11、192.168.126.12、192.168.126.13

shard1: 192.168.126.11:27017(P)、192.168.126.12:27017(S)、192.168.126.13:27017(A)  #P为主,S为从,A为仲

shard2: 192.168.126.11:27018(A)、192.168.126.12:27018(P)、192.168.126.13:27018(S)

shard3: 192.168.126.11:27019(S)、192.168.126.12:27019(A)、192.168.126.13:27019(P)

config: 192.168.126.11:27100(P)、192.168.126.12:27100(S)、192.168.126.13:27100(S)

mongos: 192.168.126.11:27000、192.168.126.12:27000、192.168.126.13:27000

测试集合z1.a4已经有集合分片策略

                z1.a4    #z1库a4集合
                        shard key: { "name" : "hashed" }
                        unique: false
                        balancing: true
                        chunks:    #在shard1、2、3分别有chunk
                                shard1	2    
                                shard2	2
                                shard3	2
                        { "name" : { "$minKey" : 1 } } -->> { "name" : NumberLong("-6148914691236517204") } on : shard1 Timestamp(1, 0) 
                        { "name" : NumberLong("-6148914691236517204") } -->> { "name" : NumberLong("-3074457345618258602") } on : shard1 Timestamp(1, 1) 
                        { "name" : NumberLong("-3074457345618258602") } -->> { "name" : NumberLong(0) } on : shard2 Timestamp(1, 2) 
                        { "name" : NumberLong(0) } -->> { "name" : NumberLong("3074457345618258602") } on : shard2 Timestamp(1, 3) 
                        { "name" : NumberLong("3074457345618258602") } -->> { "name" : NumberLong("6148914691236517204") } on : shard3 Timestamp(1, 4) 
                        { "name" : NumberLong("6148914691236517204") } -->> { "name" : { "$maxKey" : 1 } } on : shard3 Timestamp(1, 5) 

四、操作步骤:

1、停止balancer

mongos> sh.getBalancerState()    #balancer状态,可用
true
mongos> sh.stopBalancer()        #停止balancer
{
	"ok" : 1,
	"operationTime" : Timestamp(1613361847, 1),
	"$clusterTime" : {
		"clusterTime" : Timestamp(1613361847, 1),
		"signature" : {
			"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
			"keyId" : NumberLong(0)
		}
	}
}
mongos> sh.getBalancerState()    #balancer状态,不可用
false

2、导出数据库z1

[root@v1 ~]# mongodump -h 192.168.126.11:27000 -d z1 -o ~/z1_mongos_202102151206.bak
2021-02-15T12:06:45.118+0800	writing z1.a4 to 
2021-02-15T12:06:45.118+0800	writing z1.a1 to 
2021-02-15T12:06:45.118+0800	writing z1.a3 to 
2021-02-15T12:06:45.118+0800	writing z1.a2 to 
2021-02-15T12:06:45.247+0800	done dumping z1.a2 (1000 documents)
2021-02-15T12:06:45.248+0800	writing z1.tt to 
2021-02-15T12:06:45.248+0800	done dumping z1.a3 (1000 documents)
2021-02-15T12:06:45.248+0800	writing z1.a5 to 
2021-02-15T12:06:45.268+0800	done dumping z1.tt (1 document)
2021-02-15T12:06:45.270+0800	done dumping z1.a5 (0 documents)
2021-02-15T12:06:45.279+0800	done dumping z1.a1 (2000 documents)
2021-02-15T12:06:45.969+0800	done dumping z1.a4 (11000 documents)    #11000条数据

3、删除a4集合,不创建集合分片策略直接导入

#删除a4集合
mongos> use z1
switched to db z1

mongos> db.a4.drop()
true

#导入a4集合
[root@v1 ~]# mongorestore -h 192.168.126.11:27000 -d z1 -c a4 ~/z1_mongos_202102151206.bak/z1/a4.bson 
2021-02-15T12:11:59.879+0800	checking for collection data in /root/z1_mongos_202102151206.bak/z1/a4.bson
2021-02-15T12:11:59.883+0800	reading metadata for z1.a4 from /root/z1_mongos_202102151206.bak/z1/a4.metadata.json
2021-02-15T12:11:59.938+0800	restoring z1.a4 from /root/z1_mongos_202102151206.bak/z1/a4.bson
2021-02-15T12:12:00.984+0800	restoring indexes for collection z1.a4 from metadata
2021-02-15T12:12:01.054+0800	finished restoring z1.a4 (11000 documents)
2021-02-15T12:12:01.054+0800	done

#查看a4集合状态
mongos> db.a4.stats()
{
	"sharded" : false,        #没有分片
	"primary" : "shard2",     #只存储在shard2上
	"capped" : false,

4、删除a4集合,创建集合分片策略再导入

#删除a4集合
mongos> db.a4.drop()
true

#z1数据库开启分片,这里可以不操作,因为只删除了集合没有删除库
mongos> sh.enableSharding('z1')
{
	"ok" : 1,
	"operationTime" : Timestamp(1613362860, 2),
	"$clusterTime" : {
		"clusterTime" : Timestamp(1613362860, 2),
		"signature" : {
			"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
			"keyId" : NumberLong(0)
		}
	}
}

#创建z1.a4集合的分片策略,根据name字段的hash
mongos> sh.shardCollection('z1.a4', {name: 'hashed'})
{
	"collectionsharded" : "z1.a4",
	"collectionUUID" : UUID("3aae99c6-2a05-4c5e-86ab-607c173716f6"),
	"ok" : 1,
	"operationTime" : Timestamp(1613362885, 28),
	"$clusterTime" : {
		"clusterTime" : Timestamp(1613362885, 28),
		"signature" : {
			"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
			"keyId" : NumberLong(0)
		}
	}
}

#sh.status()
                z1.a4        #可看到分片
                        shard key: { "name" : "hashed" }
                        unique: false
                        balancing: true
                        chunks:
                                shard1	7
                                shard2	8
                                shard3	7
                        too many chunks to print, use verbose if you want to force print

#导入集合
[root@v1 ~]# mongorestore -h 192.168.126.11:27000 -d z1 -c a4 ~/z1_mongos_202102151206.bak/z1/a4.bson 
2021-02-15T12:54:58.421+0800	checking for collection data in /root/z1_mongos_202102151206.bak/z1/a4.bson
2021-02-15T12:54:58.431+0800	reading metadata for z1.a4 from /root/z1_mongos_202102151206.bak/z1/a4.metadata.json
2021-02-15T12:54:58.431+0800	restoring z1.a4 from /root/z1_mongos_202102151206.bak/z1/a4.bson
2021-02-15T12:54:59.884+0800	restoring indexes for collection z1.a4 from metadata
2021-02-15T12:54:59.886+0800	finished restoring z1.a4 (11000 documents)
2021-02-15T12:54:59.886+0800	done

#验证
mongos> db.a4.stats()
{
	"sharded" : true,    #分片为true
	"capped" : false,
.
.
.
	"shards" : {
		"shard1" : {
			"ns" : "z1.a4",
			"size" : 3765397,
			"count" : 3655,        #shard1数量
.
.
.
		"shard2" : {
			"ns" : "z1.a4",
			"size" : 3740429,
			"count" : 3609,        #shard2数量
			"avgObjSize" : 1036,
			"storageSize" : 557056,
.
.
.
		"shard3" : {
			"ns" : "z1.a4",
			"size" : 3884954,
			"count" : 3736,        #shard3数量
			"avgObjSize" : 1039,
			"storageSize" : 581632,
			"capped" : false,

5、开启balancer

mongos> sh.startBalancer()
{
	"ok" : 1,
	"operationTime" : Timestamp(1613365278, 1),
	"$clusterTime" : {
		"clusterTime" : Timestamp(1613365278, 1),
		"signature" : {
			"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
			"keyId" : NumberLong(0)
		}
	}
}
mongos> sh.status()
--- Sharding Status --- 
  sharding version: {
  	"_id" : 1,
  	"minCompatibleVersion" : 5,
  	"currentVersion" : 6,
  	"clusterId" : ObjectId("602916cdbf4773af3672a6ca")
  }
  shards:
        {  "_id" : "shard1",  "host" : "shard1/192.168.126.11:27017,192.168.126.12:27017",  "state" : 1 }
        {  "_id" : "shard2",  "host" : "shard2/192.168.126.12:27018,192.168.126.13:27018",  "state" : 1 }
        {  "_id" : "shard3",  "host" : "shard3/192.168.126.11:27019,192.168.126.13:27019",  "state" : 1 }
  active mongoses:
        "4.0.22-rc0" : 3
  autosplit:
        Currently enabled: yes
  balancer:
        Currently enabled:  yes            #验证当前balancer状态
        Currently running:  no
        Failed balancer rounds in last 5 attempts:  0

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值