我们试图在3个副本集(rs1,rs2,rs3)中对mongodb 2.4.9中的大型集合进行分片。目前,所有数据都驻留在rs1上。
我们有3个配置服务器正在运行,并使用以下方式启用分片:
sh.enableSharding("test")
然后,我们选择了一个分片键并对一个集合进行分片:
sh.shardCollection("test.fs.chunks", { files_id : 1 , n : 1 } )
之后我们添加了额外的分片:
sh.addShard( "rs2/mongo2:27017" )
sh.addShard( "rs3/mongo3:27017" )
但是 - 4天后,所有数据仍然存在于rs1上。查看配置,我们分片的数据库列为“partitioned = true”:
{ "_id" : "test", "partitioned" : true, "primary" : "rs1" }
但是,当我们执行db.fs.chunks.getShardDistribution()时,会出现一个错误,指出该集合没有分片:
mongos> db.fs.chunks.getShardDistribution()
Collection test.fs.chunks is not sharded.
然后我们尝试重新执行shardCollection命令并收到一条错误,指出它已经被分片:
mongos> sh.shardCollection("test.fs.chunks", { files_id : 1 , n : 1 } )
"code" : 13449,
"ok" : 0,
"errmsg" : "exception: collection test.fs.chunks already sharded with 33463 chunks"
所有3个配置服务器均可运行。 mongos日志包含一系列平衡器分布式锁获取/解锁消息,但没有其他值得注意的。
有没有人对我们如何进一步解决这个问题以及如何进行分组有任何建议?
由于
戴夫
答案 0 :(得分:1)
我在收藏中遇到了类似的问题,但我使用此命令修复了它:
http://docs.mongodb.org/manual/reference/command/splitChunk/
我百分之百确定这不是你应该做的,但确实有效!
实际上另一个想法是创建一个只有一个记录的新集合,将其分片,然后将其他集合中的所有记录插入其中。
我收集了一个块中的每个记录。使用sh.status()来找出哪个块是最大的。
然后使用:
db.adminCommand({split:<database>.<collection>,find:{<database>.<collection>._id:<any doc in the shard>}});
这将分块放在中点。有趣的是,Mongodb的分块过程然后做了一些进一步的分离器,但仍然需要一些重写来将块放到合适的大小。