【问题标题】:Pre-Split On a Compound Shard Key在复合分片键上预拆分
【发布时间】:2012-03-01 12:25:17
【问题描述】:

出于我的需要,我必须进行预拆分,但我的分片键是复合键。我的复合键(k1和k2)的两个键都是int,我想要的块结构是这样的

chunk1 : k1 = minkey to 1, k2 = minkey to maxkey

chunk2 : k1 = 1 to 2, k2 = minkey to maxkey

chunk3 : k1 = 2 to 3, k2 = minkey to 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 上为相同的 k1 进一步拆分(我相信某些块上会需要它)

【问题讨论】:

    标签: mongodb


    【解决方案1】:

    应该这样做:

    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' failed: split failed (response: { "cause" : { "who" : { "_id" : "db. MyCollection”、“process”:“blahmachine:27018:1330601796:1743958884”、“state”:2、“ts”:ObjectId(“4f4ffdda58ee8c3d2948d640”)、“when”:ISODate(“2012-03-01T22:53:14.839” Z"), "who" : "blahmachine:27018:1330601796:1743958884:conn3:1105345454", "why" : "migrate-{ k1: 0, k2: 500000 }" }, "errmsg" : "集合的元数据锁被采取”,“ok”:0.0 },“ok”:0.0,“errmsg”:“拆分失败”})
    • 集群是新鲜的,没有数据被记录
    • 另外,如果limits说maxkey
    • 每个理论上可能的值总是有一个块,因为你正在分裂。以上确实有效,我已经在我的开发集群上对其进行了测试。您的错误被抛出,因为您的平衡器没有关闭并且它可能正在获取迁移锁定。我认为您可能应该更多地阅读该理论;)
    • 至于您的最后一条评论,您误解了拆分时会发生什么。 MaxKey
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-21
    • 2018-04-19
    • 2013-11-09
    • 2021-07-14
    • 2023-03-15
    • 1970-01-01
    相关资源
    最近更新 更多