使用区域分布集合
在分片集群中,您可以创建分片数据的分区是基于分片键。您可以将每个区域与集群中的一个或多个分片相关联。一个分片可以与任何数量的区域相关联。在一个均衡的集群中,MongoDB只将一个区域覆盖的数据块迁移到与该区域相关联的分片。
您可以使用区域分片将集合分布在分片集群中,并指定哪些分片存储每个集合的数据。您可以根据分片属性(如物理资源和可用内存)来分配集合,以确保每个集合都存储在最适合该数据的最优分片。
先决条件
完成本教程,您必须
部署一个分片集群。本教程使用具有三个分片的分片集群。
连接到
mongos
。您不能通过直接连接到分片来创建区域或区域范围。以具有至少
admin
数据库上clusterManager
角色的用户身份进行身份验证。要查看用户权限,请使用db.getUser()
方法。
场景
您有一个名为 shardDistributionDB
的数据库,其中包含两个分片集合
bigData
,包含大量数据。manyIndexes
,包含许多大型索引。
您希望限制每个集合只能使用一组分片,以便每个集合可以使用分片的不同物理资源。
架构
该分片集群有三个分片。每个分片具有独特的物理资源
分片名称 | 物理资源 |
---|---|
shard0 | 高内存容量 |
shard1 | 快速闪存存储 |
shard2 | 高内存容量 和 快速闪存存储 |
区域
要基于物理资源分配集合,请使用分片区域。分片区域将集合与特定分片子集相关联,这限制了存储集合数据的分片。在此示例中,您需要两个分片区域
区域名称 | 描述 | 此区域中的集合 |
---|---|---|
HI_RAM | 具有高内存容量的服务器。 | 需要更多内存的集合,例如具有大型索引的集合,应位于 HI_RAM 分片上。 |
FLASH | 具有快速存储速度的闪存驱动器的服务器。 | 需要快速数据检索的大型集合应位于 FLASH 分片上。 |
分片键
在本教程中,您将使用以下分片键来对每个集合进行分片:{ _id: "hashed" }
。您需要在分片集合之前配置分片区域。因此,每个集合的数据仅存在于相应区域的分片中。
使用哈希分片,如果您在配置区域之前对集合进行分片,MongoDB将在启用分片时在所有分片之间平均分配数据块。这意味着数据块可能会暂时分配给不适合处理该数据块数据的分片。
平衡器
平衡器会将数据块迁移到适当的分片,同时尊重任何配置的区域。平衡完成后,分片只包含与其分配区域匹配范围的数据块。
重要
性能
添加、删除或更改区域或区域范围可能会导致数据块迁移。根据您的数据集大小和受区域或区域范围影响的块数量,这些迁移可能会影响集群性能。考虑在特定计划的时间窗口运行平衡器。要了解如何设置计划窗口,请参阅计划平衡窗口。
步骤
使用以下程序配置分片区域并按分片物理资源分配集合。
将每个分片添加到相应的区域。
要配置每个区域中的分片,请使用 addShardToZone
命令。
将 shard0
和 shard2
添加到 HI_RAM
区域
sh.addShardToZone("shard0", "HI_RAM") sh.addShardToZone("shard2", "HI_RAM")
将 shard1
和 shard2
添加到 FLASH
区域
sh.addShardToZone("shard1", "FLASH") sh.addShardToZone("shard2", "FLASH")
为相关集合添加区域范围。
要关联一个分片键范围到一个区域,请使用 sh.updateZoneKeyRange()
.
在此场景中,您希望将集合中所有文档关联到相应的区域。要将所有集合文档关联到区域,指定以下区域范围
下界为
{ "_id" : MinKey }
上界为
{ "_id" : MaxKey }
对于 bigData
集合,设置
sh.updateZoneKeyRange( "shardDistributionDB.bigData", { "_id" : MinKey }, { "_id" : MaxKey }, "FLASH" )
对于 manyIndexes
集合,设置
sh.updateZoneKeyRange( "shardDistributionDB.manyIndexes", { "_id" : MinKey }, { "_id" : MaxKey }, "HI_RAM" )
对集合进行分片。
为了同时对两个集合(bigData
和 manyIndexes
)进行分片,指定一个 分片键 为 { _id: "hashed" }
。
运行以下命令
sh.shardCollection( "shardDistributionDB.bigData", { _id: "hashed" } ) sh.shardCollection( "shardDistributionDB.manyIndexes", { _id: "hashed" } )
查看更改。
要查看数据块分布和分片区域,使用 sh.status()
方法
sh.status()
下次平衡器运行时,它会根据需要分割数据块并将数据块迁移到分片,同时尊重配置的区域。平衡器完成所需的时间取决于多个因素,包括分片数量、可用内存和IOPS.
平衡完成后
manyIndexes
集合中的文档数据块位于shard0
和shard2
上bigData
集合中的文档数据块位于shard1
和shard2
上。
了解更多
要了解更多关于分片和平衡的内容,请参阅以下页面