我们尝试在MongoDB2.4.9中跨3个副本集(rs1、rs2、rs3)共享一个大型集合。目前,所有数据都驻留在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日志包含一系列均衡器分布式锁获取/解锁消息,但没有其他值得注意的消息。
有没有人有任何建议,关于我们如何进一步解决这个问题,并获得一些分片发生?
谢谢
戴夫
发布于 2014-02-24 20:39:43
我在使用集合时遇到了类似的问题,但我使用以下命令修复了它:
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的分块过程做了一些进一步的拆分,但仍然需要一些重写来使块的大小合适。
https://stackoverflow.com/questions/21979544
复制相似问题