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