1. MongoDB数据库主分片是什么?
MongoDB是一个分布式的数据库,它支持将数据分片(sharding)成小块来存储在多个服务器上。主分片(primary shard)是整个集合的一个基本组成部分,因为它是在创建集合时分配给集合的第一个分片。主分片拥有该集合的全部数据和索引的完整副本,对于初学者来说理解主分片是非常重要的。
1.1 MongoDB分片集合的工作方式
MongoDB分片集合将数据分割成一组文档,称为块(chunks)。每个块都与某个分片服务器关联,并在该分片服务器上存储该块的文档。当集合中的文档数量增加时,会自动创建新的块,并将其分配给适当的分片。
sh.enableSharding("example")
sh.shardCollection("example.users", { "name": 1 })
上面这段代码创建了一个名为example的数据库,并开启了分片。然后集合users启用了分片,按照name属性进行分片。
1.2 MongoDB主分片的作用
主分片是由MongoDB自动选择的一个分片,新创建的文档将首先被添加到该主分片中。主分片负责管理和调整块,以确保每个块都正确地分配给适当的分片。如果您不指定主分片,MongoDB将自动为您选择一个主分片。
db.runCommand( { shardCollection: "example.users", key: { name: 1 } } )
使用上面的代码进行分片时,MongoDB会自动选择主分片。
2. 主分片如何选择
使用MongoDB在创建分片集合时,主分片会自动选择一个,但如果您想更改主分片,也可以手动更改它。以下是一些用于选择MongoDB主分片的因素:
2.1 手动选择主分片
如果需要手动选择主分片,可以使用以下命令:
sh.addShardTag("shard0000", "tag1")
sh.addShardTag("shard0001", "tag2")
sh.addShardTag("shard0002", "tag3")
sh.addShardTag("shard0003", "tag4")
sh.addTagRange("example.users", { "name": "A" }, { "name": "D" }, "tag1")
sh.addTagRange("example.users", { "name": "D" }, { "name": "G" }, "tag2")
sh.addTagRange("example.users", { "name": "G" }, { "name": "J" }, "tag3")
sh.addTagRange("example.users", { "name": "J" }, { "name": "M" }, "tag4")
sh.setBalancerState(false)
sh.setBalancerState(true, { "activeWindow": ""})
上面这段代码将为分片集合users手动选择主分片。
2.2 主分片的容量
主分片应该具有足够的容量,以便在数据集合扩大时可以容纳更多的数据。如果容量不足,它将会成为拖累分片集合的一个瓶颈。
2.3 主分片的性能
主分片应该具有良好的性能。它是分片集合的喉咙,如果性能不足,整个系统的性能可能会受到影响。
2.4 为分片集合选择主分片
在为分片集合选择主分片时,应该优先考虑性能和容量。选择正确的主分片可以极大地提高分片集合的性能。
3. 总结
主分片是MongoDB分片集合的一个关键组成部分。它管理和调整块,确保每个块都被正确地分配给适当的分片。为了选择正确的主分片,必须考虑容量和性能。您可以手动选择主分片,也可以让MongoDB自动选择它。了解主分片可以帮助您更好地理解MongoDB的分片集合,在实际应用中更好地使用它。