资料来源: https://docs.mongodb.com/v3.2/tutorial/administer-shard-tags/
详细命令参考: https://docs.mongodb.com/v3.2/reference/sharding/
分片常用
配置Sharding
连接路由服务器
1
.\bin\mongo.exe admin --port 40000
设置分片服务器
1
2
3
4
5db.runCommand({ addshard:"127.0.0.1:27100" })
db.runCommand({ addshard:"127.0.0.1:27101" })
db.runCommand({ addshard:"127.0.0.1:27017" })
或者
sh.addShard("127.0.0.1:27100")设置要分片的数据库
1
2
3db.runCommand({ enablesharding:"qdgame" })
或者:
sh.enableSharding("qdgame")关闭balancing
1
sh.disableBalancing("qdgame.backpack")
设置要分片的collection
1
2
3db.runCommand({ shardcollection: "qdgame.backpack", key: { _id:1}})
或者
sh.shardCollection("qdgame.backpack",{usrid:1, id:1})开启balancing
1
sh.enableBalancing("qdgame.backpack")
注意:设置一定要在admin数据库下。
使用hash分片一个collection
1 | sh.shardCollection( "database.collection", { <field> : "hashed" } ) |
改变chunk大小
1 | db.settings.save( { _id:"chunksize", value: <size> } ) |
添加index索引
1 | db.collection.ensureIndex({a:1,b:-1}) |
管理分片标签
标记一个分片
当连接到mongos实例时,使用sh.addShardTag()方法将标记与特定分片关联。单个分片可以具有多个标签,并且多个分片也可以具有相同的标签。1
2
3
4sh.addShardTag("shard0000", "NYC")
sh.addShardTag("shard0001", "NYC")
sh.addShardTag("shard0002", "SFO")
sh.addShardTag("shard0002", "NRT")
在连接到mongos实例时,您可以使用sh.removeShardTag()方法从特定分片中删除标签,如以下示例所示,该示例从分片中删除NRT标签:1
sh.removeShardTag("shard0002", "NRT")
标记shard key范围
在连接到mongos实例时使用sh.addTagRange()方法来给某个范围的shard key添加标签。任何给定的分片键范围都只具有一个分配的标签。您不能重叠定义的范围,也不能多次标记同一范围。1
2
3sh.addTagRange("records.users", { zipcode: "10001" }, { zipcode: "10281" }, "NYC")
sh.addTagRange("records.users", { zipcode: "11201" }, { zipcode: "11240" }, "NYC")
sh.addTagRange("records.users", { zipcode: "94102" }, { zipcode: "94135" }, "SFO")
从shard key范围中删除标记
1 | use config |
访问标签
sh.status()列出与每个分片相关联的分片(如果有的话)的标签。shard的标记存在于config数据库的shards
集合中的shard文档中。1
2use config
db.shards.find({ tags: "NYC" })
您可以在config数据库的tags集合中找到所有命名空间的标记范围。 sh.status(显示所有标签范围。要返回用NYC标记的所有shard key范围,请使用以下操作:1
2use config
db.shards.find({ tags: "NYC" })
例子:根据地区来划分数据
场景
在messages集合中创建测试数据如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21{
"_id" : ObjectId("56f08c447fe58b2e96f595fa"),
"country" : "US",
"userid" : 123,
"message" : "Hello there",
...,
}
{
"_id" : ObjectId("56f08c447fe58b2e96f595fb"),
"country" : "UK",
"userid" : 456,
"message" : "Good Morning"
...,
}
{
"_id" : ObjectId("56f08c447fe58b2e96f595fc"),
"country" : "DE",
"userid" : 789,
"message" : "Guten Tag"
...,
}
shard key
messages集合使用{ country : 1, userid : 1 }组合索引作为shard key。
每个文档中的country 字段允许在每个不同的country值上创建标签范围。
相对于country,userid字段为shard key提供一个高基数低频率的元素
写操作
在Tag相关的分片中,mongos将到来的文档和配置的tag范围比较。如果文档符合配置标签的范围,mongos将此文档路由到此标签的分片中
这插入环节,MongoDB可以将不合格任何tag范围的文档路由到随机的分片中。
读操作
如果这个请求至少包含country字段,MongoDB可以路由请求到特定的分片中。
例如MongoDB可以尝试对以下查询执行有针对性的读取操作:1
2chatDB = db.getSiblingDB("chat")
chatDB.messages.find( { "country" : "UK" , "userid" : "123" } )
均衡器
均衡器迁移带有tag的块(Chunk)到适合的分片(shard)。在迁移之前,分片可能包含违反配置的tag和tag范围的块。一旦平衡完成,碎片应只包含不违反其分配的标记和标记范围的块。
添加个删除标签可以块的迁移。这取决于数据集的大小和标记范围影响的块数量,这些迁移可能会影响集群的性能。
操作
取消均衡器
为了降低性能影响,可以在集合上禁用平衡器,以确保在配置新标记时不会发生迁移。考虑在特定的计划窗口中运行均衡器。1
sh.disableBalancing("chat.message")
使用sh.isBalancerRunning()来检查平衡器进程当前是否正在运行。等待任何当前平衡回合完成后再继续。
为每一个分片添加标签
1 | sh.addShardTag(<shard name>, "NA") |
您可以通过运行sh.status()来查看分配给给定分片的标签。
定义标签范围
使用sh.addTagRange()方法。这个方法需要:
- 完成的目标collection的名字
- 范围的下限
- 范围的上限
- 标签的名字
1 | sh.addTagRange( |
开启均衡器
1 | sh.enableBalancing("chat.message") |
使用sh.isBalancerRunning()来检查平衡器进程当前是否正在运行
查看更改
您可以使用sh.status()