假设我使用范围标签为分片设置了最小和最大键。后来我发现我定义的标签范围不会平衡。然后我必须更改标签范围值。
我搜索了 MongoDB 的文档,其中只提到了添加和删除标签,没有提到更新或更改标签范围。
然后我通过更新配置数据库标签集合中的范围值进行了实验。
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 没有更新。请注意,即使 min 在 rangeTime2 更新为 150,id 也不会更新,这使得标签集合看起来不一致。
它有点脏,但遗憾的是它是有效的。
这是更新标签范围的正确方法吗?有没有更好的办法?
MongoDB 新手,但这是我在 MongoDB 202 课程之后学习如何做同样事情的方式。还有其他平衡流量的方法,例如移动、拆分和合并块。我还没有读到直接更新配置数据库中的标签集合是脏的或不正确的。
下面的代码未经测试,您必须替换某些值,例如 nameofShard 和最小值、最大值。您会注意到我在修改标签范围之前停止了平衡器
sh.status() 或
mongostat --port 27017 --discover
验证平衡test.lab不是有效的数据库名称,因此我将数据库名称更改为 testlab。
关于 _id 字段未更新的附加说明。当我像这样查询标签集合时
它表明 _id 字段包含最小值或标记范围。如果您正在更新标签集合并修改标签最小字段值,那么更新 _id 字段的最小值也不合理吗?
sh.removeShardTag()
并且sh.addShardTag()
是可选的,除非添加新的或删除冗余的分片标签,否则不需要更改标签上的范围。db.tags.remove()
并且sh.addTagRange()
需要在现有标签范围内实施更改。