我们已经构建了具有2个分片(副本集)的MongoDB集群,每个分片包含一个主节点和一个辅助节点。
通过mongorestore
将数据迁移到集群后,可以在数据库级别和集合级别上进行分片,并且等到平衡器将集合分为2个分片后,我们遇到的问题是所有数据都保持完全保留在源副本集上,而其中一半迁移到目标副本集上没有问题。
我们的集群使用具有以下架构的Docker Swarm构建:
rs1
(1个主要rs11
,1个次要rs12
); rs2
(1个主要rs21
,1个次要rs22
); cfg0
(1个配置服务器); mongos0
路由器。设置完成后,我们尝试成功通过mongodump
/ mongorestore
从旧数据库中恢复转储-mongos0
已恢复了大约3个集合。将2B
个记录rs2
复制到timestamp
,并在其节点之间复制。
我们已经在db.records.createIndex({ timestamp: 'hashed' })
字段中创建了索引:
db.shardCollection("sample.records", { timestamp: 'hashed' })
此后,我们启用了分片集合:
sh.startBalancer()
...并启用了平衡器:
shard key: { "timestamp" : "hashed" }
unique: false
balancing: true
chunks:
rs1 14029
rs2 14030
一段时间后,我们成功完成了绝招:
rs2
但是我们希望数据将分布在这两个分片上,并且rs2
的一半空间将被释放,但是我们不知道如何从现有>> db.stats(1024*1024*1024) # show size in GiB
...
"raw" : {
"rs1/mongors11:27017,mongors12:27017" : {
"db" : "sample",
"collections" : 1,
"views" : 0,
"objects" : 1215894909,
"avgObjSize" : 393.2806568671964,
"dataSize" : 445.3472313405946,
"storageSize" : 131.5478172302246,
"numExtents" : 0,
"indexes" : 2,
"indexSize" : 19.27316665649414,
"fsUsedSize" : 184.22602081298828,
"fsTotalSize" : 411.00279235839844,
"ok" : 1
},
"rs2/mongors21:27017,mongors22:27017" : {
"db" : "sample",
"collections" : 11,
"views" : 0,
"objects" : 2308125918,
"avgObjSize" : 387.33301163381327,
"dataSize" : 832.6148270154372,
"storageSize" : 274.2057418823242,
"numExtents" : 0,
"indexes" : 19,
"indexSize" : 40.794044494628906,
"fsUsedSize" : 348.7571792602539,
"fsTotalSize" : 411.00279235839844,
"ok" : 1
}
释放磁盘空间。
总结,这就是下面可见的问题:
>> db.records.stats()['shards']
...
"rs1" : {
"ns" : "sample.records",
"size" : 478187948493,
"count" : 1215894909,
"avgObjSize" : 393,
"storageSize" : 141248393216,
"capped" : false
}
...
"rs2" : {
"ns" : "sample.records",
"size" : 894011940704,
"count" : 2308120195,
"avgObjSize" : 387,
"storageSize" : 294425526272,
"capped" : false
}
编辑:有关集群中收集状态的更多信息:
rs2
查看rs1
分片。在一半的数据迁移到1/2
之后,它包含所有数据而没有释放磁盘空间。
总而言之,我们遇到了一个问题:整个集合的rs1
-在2/2
上,rs2
在rs2
上,而迁移后应该将其释放。
如何释放rs1
上的磁盘空间,使它们仅包含一半的数据,就像many2one
一样?