Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 在复合碎片密钥上预拆分_Mongodb - Fatal编程技术网

Mongodb 在复合碎片密钥上预拆分

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

为了满足我的需要,我必须进行预分割,但我的切分键是复合键。我的复合键(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( { 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,那么对于每一个理论上可能的值,总是有一个块,因为您正在拆分。上述方法确实有效,我已经在我的开发集群上对其进行了测试。您的错误被抛出,因为您的平衡器没有关闭,并且它可能正在获取迁移锁。我想你应该多读一点这个理论;)至于你最后的评论,你误解了分手时会发生什么。马克斯基