副本集在将数据迁移到新分片后保留所有数据

时间:2019-02-08 13:56:14

标签: mongodb sharding replicaset

我们已经构建了具有2个分片(副本集)的MongoDB集群,每个分片包含一个主节点和一个辅助节点。 通过mongorestore将数据迁移到集群后,可以在数据库级别和集合级别上进行分片,并且等到平衡器将集合分为2个分片后,我们遇到的问题是所有数据都保持完全保留在源副本集上,而其中一半迁移到目标副本集上没有问题。

我们的集群使用具有以下架构的Docker Swarm构建:

  1. rs1(1个主要rs11,1个次要rs12);
  2. rs2(1个主要rs21,1个次要rs22);
  3. cfg0(1个配置服务器);
  4. 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上,rs2rs2上,而迁移后应该将其释放。

如何释放rs1上的磁盘空间,使它们仅包含一半的数据,就像many2one一样?

0 个答案:

没有答案