Mongodb 在复合碎片密钥上预拆分
为了满足我的需要,我必须进行预分割,但我的切分键是复合键。我的复合键(k1和k2)的两个键都是int,我想要的块结构是这样的 chunk1:k1=minkey到1,k2=minkey到maxkey chunk2:k1=1到2,k2=minkey到maxkey chunk3:k1=2到3,k2=minkey到maxkey chunk4:k1=3到4,k2=minkey到maxkey 所以我真正想做的是只在第一个键上分割,而让第二个键包含所有可能的范围,但是如果运行这个Mongodb 在复合碎片密钥上预拆分,mongodb,Mongodb,为了满足我的需要,我必须进行预分割,但我的切分键是复合键。我的复合键(k1和k2)的两个键都是int,我想要的块结构是这样的 chunk1:k1=minkey到1,k2=minkey到maxkey chunk2:k1=1到2,k2=minkey到maxkey chunk3:k1=2到3,k2=minkey到maxkey chunk4:k1=3到4,k2=minkey到maxkey 所以我真正想做的是只在第一个键上分割,而让第二个键包含所有可能的范围,但是如果运行这个 db.runCommand
db.runCommand( { split : "db.mycollection" , middle : { k1: 1} } );
如果说没有提供完整的碎片密钥,那么它将失败,因此我将其称为
db.runCommand( { split : "db.mycollection" , middle : { k1: 1, k2:somenumber } } );
这个命令起作用,但结果是坏的,因为它给我块如下
chunk1:k1=minkey to 1,k2=minkey to somenumber
chunk2:k1=1到maxkey,k2=somenumber到maxkey
这是不好的,因为如果用户在包含k1somenumber的文档中插入某个内容,则系统中没有包含该内容的块,插入操作将失败
如何使用复合键创建这样的块边界
注意:如果k2总是minkey到maxkey,人们可能会问为什么我有k2。我有这样的k2,以便将来如果需要的话,可以在k2上对同一个k1进行进一步拆分(我相信在某些块上也需要这样做)这应该可以做到:
db.runCommand( { split : "db.mycollection" , middle : { k1: 1, k2:MaxKey } } );
db.runCommand( { split : "db.mycollection" , middle : { k1: 2, k2:MaxKey } } );
db.runCommand( { split : "db.mycollection" , middle : { k1: 3, k2:MaxKey } } );
db.runCommand( { split : "db.mycollection" , middle : { k1: 4, k2:MaxKey } } );
顺便说一句,你永远不能创造一个特定范围不被块覆盖的情况,因为你所做的只是分割现有范围。还要注意,从技术上讲,k2不能从MinKey到MaxKey。第一个区块的范围将是
{k1:MinKey,k2:MinKey}
到{k1:1,k2:MaxKey}
。下一个将是{k1:1,k2:MaxKey}
到{k1:2,k2:MaxKey}
等等我尝试了这个方法,但Id不起作用,我不断地得到这个命令'split'失败:split失败(响应:{“原因”:{“谁”:{“Id”:“db.MyCollection”,“进程”:“blahmachine:27018:1330601796:1743958884”,“state”:2,“ts”:ObjectId(“4f4ffdda58ee8c3d2948d640”),“when”:ISODate(“2012-03-01T22:53:14.839Z”),“who”:“blahmachine:27018:1330601796:1743958884:conn3:1105345454”,“为什么”:“迁移-{k1:0,k2:500000}”,errmsg:“集合的元数据锁被占用”,“确定”:0.0},“确定”:0.0,“errmsg:”剥离失败“})集群是新的,并且没有数据被记录。同样,如果限制条件是maxkey,那么对于每一个理论上可能的值,总是有一个块,因为您正在拆分。上述方法确实有效,我已经在我的开发集群上对其进行了测试。您的错误被抛出,因为您的平衡器没有关闭,并且它可能正在获取迁移锁。我想你应该多读一点这个理论;)至于你最后的评论,你误解了分手时会发生什么。马克斯基