Mongodb分片: Chunk split failed with Hashed Shard Key

标签 mongodb sharding

我正在尝试使用散列分片键:{group_id:"hashed"} 拆分 mongodb 分片集群中的几个巨型 block 。

我使用 mongodb 文档中的以下命令来拆分这些巨型 block :

db.runCommand( { split: "test.people",
                  bounds : [ { group_id: NumberLong("-5838464104018346494") },
                             { group_id: NumberLong("-5557153028469814163") }
             ] } )

但出现以下错误:

{ "cause" : { }, "ok" : 0, "errmsg" : "split failed" }.

此故障的可能原因是什么?分片键 group_id 的基数为 26231,共有 4521157 个文档。

已检查 this讨论但找不到原因。

P.S : group_id 是 ObjectId。

最佳答案

你的基数方式太小了。当他达到64mb时,一个chunk会自动 split 。

目前,在基数为 26231 的情况下,您的集合在没有巨型 block 的情况下最大不能超过 26231*64mb...而且在此之前您可能会在很长一段时间内遇到问题,除非您有一个完美的分布。

在您的情况下,您没有任何 group_id 值导致 NumberLong("-5838464104018346494") 和 NumberLong("-5557153028469814163") 之间的哈希值...

所以你不能拆分它,因为你的基数太小了。

总而言之,您立即需要一个更好的分片键,这意味着 mongodump 一切,然后使用新的分片键进行 mongorestore。

关于Mongodb分片: Chunk split failed with Hashed Shard Key,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30802944/

相关文章:

javascript - MongoDB 通过查找查询随机选择 5 个文档

mongodb - 无法从副本集中最后一个剩余节点读取

mysql - 垂直分区 VS 水平分区有什么好处?

mongodb - 这个模式的好的 mongodb 分片键是什么?

postgresql - 在 N 个 postgresql 分片上使用 WHERE 和 ORDER BY 进行应用程序级 JOIN

javascript - Meteor MongoDB 集合无法访问 Meteor 发布

mongodb - Mongoose 填充通过找到对象引用键

c++ - 将 MongoDB C++ 驱动程序升级到 mongocxx-3.1.2

database - 从数据库设计的角度来看,分片意味着什么?

linux - 为什么分片需要很多存储空间?