Mongo 是否将标签感知分片数据库中新更新的文档移动到正确的分片?
我们使用 MongoDb 版本进行了以下设置。2.4.6 和使用 C# 驱动程序 1.8.3,它没有返回标签感知分片更新场景的预期结果。请协助查看以下场景,并让我们知道 MongoDb 是否能够做到这一点。
我们为实验设置了以下设置:
//use the default 'test' database
db = db.getSiblingDB('test');`
//Add shards
sh.addShard( "shard0001.local:27017" );
sh.addShard( "shard0002.local:27017" );
//Enable sharding for the database,
sh.enableSharding("test");
//Enable sharding for a collection,
sh.shardCollection("test.persons", { "countryCode": 1, "_id": 1 } );
//Add shard tags,
sh.addShardTag("shard0001", "USA");
sh.addShardTag("shard0002", "JPN");
//Tag shard key ranges,
sh.addTagRange("test.persons", { countryCode: 0 }, { countryCode: 1 }, "USA");
sh.addTagRange("test.persons", { countryCode: 1 }, { countryCode: 2 }, "JPN");
然后我们为初始数据填充执行以下脚本:
//MongoDB sharding test,
db = db.getSiblingDB('test')
//Load data
//USA: countryCode 0
//JPN: countryCode 1
for (var i=0; i < 1000, i++) {
db.persons.insert( { name: "USA-" + i, countryCode: 0 } )
db.persons.insert( { name: "JPN-" + i, countryCode: 1 } )
此时,每个分片有 1000 条记录,shard0001 中有 1000 条美国国家代码记录,shard0002 中有 1000 条日本国家代码记录。
在 C# 中,我们有以下伪代码:
collection.insert( 1 document of countryCode=0)
collection.insert( 1 document of countryCode=1)
执行后,每个分片都有 1001 个文档,到目前为止一切正常。
然后我们将 shard0001 中的一个文档从 countryCode=0 更新为 countryCode=1 并使用 _id。然而,我们最终在 JPN 分片(shard0002)中有 1002 条记录,在美国分片(shard0001)中有 1001 条记录。Mongos 似乎根据新的 countryCode 1 将更新路由到 shard0002 并执行了插入,并且从未对 shard0001 中的文档进行更新。因此,现在我们在两个不同的分片中有 2 个具有相同 _id 的文档。
我们原以为 mongo 会更新 shard0001 中的实际文档,然后意识到将 countryCode 从 0 更改为 1 会将该文档移动到 shard0002 中。Mongo 会自动执行此操作吗?
我们知道我们可以手动从 shard0001 中删除文档记录,我们真的必须自己手动执行此操作吗?