更新MongoDB范围分片上的标记范围

时间:2014-09-18 09:12:26

标签: mongodb sharding

假设我使用范围标记设置了分片的最小和最大键。之后,我发现我定义的标签范围不会平衡。然后我必须更改标签范围值。

我在MongoDB文档中搜索过,它只提及添加和删除标记,没有提及更新/更改标记范围值。

然后我通过更新db config collection shard中的值来做一些实验

mongos> db.tags.find()
{ "_id" : { "ns" : "test.lab.range", "min" : { "_id" : 1 } }, "ns" : "test.lab.range", "min" : { "_id" : 1 }, "max" : { "_id" : 100 }, "tag" : "rangeTime1" }
{ "_id" : { "ns" : "test.lab.range", "min" : { "_id" : 100 } }, "ns" : "test.lab.range", "min" : { "_id" : 100 }, "max" : { "_id" : 200 }, "tag" : "rangeTime2" }
mongos> db.tags.update({_id:{ "ns" : "test.lab.range", "min" : { "_id" : 100 } }},{$set:{min : {_id : 150}}})
mongos> db.tags.update({_id:{ "ns" : "test.lab.range", "min" : { "_id" : 1 } }},{$set:{max : {_id : 150}}})
mongos> db.tags.find()
{ "_id" : { "ns" : "test.lab.range", "min" : { "_id" : 1 } }, "ns" : "test.lab.range", "min" : { "_id" : 1 }, "max" : { "_id" : 150 }, "tag" : "rangeTime1" }
{ "_id" : { "ns" : "test.lab.range", "min" : { "_id" : 100 } }, "max" : { "_id" : 200 }, "min" : { "_id" : 150 }, "ns" : "test.lab.range", "tag" : "rangeTime2" }

效果很好,但标签ID未更新。请注意,即使在rangeTime2将min更新为150时,也不会更新id,这会使标签集合看起来不一致。

它有点脏,但遗憾的是它有效。

这是更新标签范围的正确方法吗?还有其他更好的方法吗?

1 个答案:

答案 0 :(得分:3)

这并不明显,但是如果你运行sh.addTagRange()具有相同的最小值(在你的情况下,1或100)和不同的最大值,那么具有该最小值的现有标签范围将会改变,基本上起到就地更新(addTagRange()帮助程序基本上运行upsert基于_id字段并进行一些健全性检查),可以通过运行它而不用括号来查看:

mongos> sh.addTagRange
function ( ns, min, max, tag ) {
    if ( bsonWoCompare( min, max ) == 0 ) {
        throw new Error("min and max cannot be the same");
    }

    var config = db.getSisterDB( "config" );
    config.tags.update( {_id: { ns : ns , min : min } } ,
            {_id: { ns : ns , min : min }, ns : ns , min : min , max : max , tag : tag } ,
            true );
    sh._checkLastError( config );
}

要更改标记范围最小值,这不起作用 - 您需要删除并重新添加,或者您需要手动更新子文档中的_id.min字段以及{{1顶级文档中的字段,以避免您看到的不一致。我建议目前使用删除和重新添加选项以避免混淆。这些命令将在以后的版本中重构(尚未安排),并且我个人在SERVER-6352中添加了一个新的删除帮助程序,以便将来减少繁琐。