使用区域分发集合
在分片的集群中,您可以根据分 分片键 创建分分片的数据的 区域 。您可以将每个区域与集群中的一个或多个分片相关联。 一个分分片可以与任意数量的区域关联。 在均衡集群中, MongoDB仅将区域覆盖的数据段迁移到与该区域关联的分片。
您可以使用区域分片在分片集群中分发集合,并指定哪个分片存储每个集合的数据。您可以根据分片属性(如物理资源和可用内存)分发集合,以确保每个集合都存储在该数据的最佳分片上。
先决条件
要完成本教程,您必须:
部署分片集群。 本教程使用具有三个分片的分片分片集群。
连接到
mongos
。 您无法通过直接连接到分片来创建区域或区域范围。以在
admin
数据库上至少具有clusterManager
角色的用户身份进行身份验证。要查看用户权限,请使用db.getUser()
方法。
Scenario
您有一个名为shardDistributionDB
的数据库,其中包含两个分分片的集合:
bigData
,其中包含大量数据。manyIndexes
,其中包含许多大型索引。
您希望将每个集合限制为分片子集,以便每个集合可以使用分片的不同物理资源。
架构
该分片集群有三个分片。每个分片都有独特的物理资源:
分片名称 | 物理资源 |
---|---|
shard0 | 高内存容量 |
shard1 | 快速存储 |
shard2 | 高内存容量和快速闪存 |
区域
要根据物理资源分配集合,请使用分片区域。分片区域将集合与特定的分片子集关联起来,从而限制存储集合数据的分片。在此示例中,您需要两个分片区域:
区域名称 | 说明 | 此区域中的collection |
---|---|---|
HI_RAM | 具有高内存容量的服务器。 | 需要更多内存的集合(例如具有大索引的集合)应位于 HI_RAM 分片上。 |
FLASH | 带有闪存驱动器的服务器,可实现快速存储。 | 需要快速数据检索的大型collection应位于 FLASH 分片上。 |
片键
在本教程中,用于对分片集合进行分片的分片分片键是{ _id: "hashed" }
。 在对分片进行分片之前,您将配置分分片区域。 因此,每个集合的数据仅存在于相应区域的分片上。
使用哈希分片时,如果在配置区域之前对集合进行分片,则启用分片后,MongoDB 会在所有分片之间平均分配数据块。这意味着数据块可能会临时分配给不适合处理该数据块数据的分片。
平衡器
负载均衡器会根据任何已配置的区域将数据块迁移到相应的分片。平衡完成后,分片仅包含范围与其已分配区域匹配的数据块。
重要
性能
添加、删除或更改区域或区域范围可能会导致数据块迁移。根据数据集大小以及区域或区域范围影响的数据块数量,这些迁移可能会影响集群性能。考虑在特定的计划窗口运行负载均衡器。要了解如何设置计划窗口,请参阅计划负载均衡窗口。
步骤
使用以下过程配置区域,并根据分片物理资源分配collection。
将每个分片添加到适当的区域。
要配置每个区域中的分片,请使用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")
为相关collection添加区域范围。
要将范围分分片键与区域关联,请使用sh.updateZoneKeyRange()
。
在这种情况下,您希望将collection中的所有文档与相应的区域相关联。要将所有collection文档与区域关联,请指定以下区域范围:
下限
{ "_id" : MinKey }
上限
{ "_id" : MaxKey }
对于 bigData
集合,请设置:
命名空间为
shardDistributionDB.bigData
,将区域
FLASH
sh.updateZoneKeyRange( "shardDistributionDB.bigData", { "_id" : MinKey }, { "_id" : MaxKey }, "FLASH" )
对于 manyIndexes
集合,请设置:
命名空间为
shardDistributionDB.manyIndexes
,将区域
HI_RAM
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
collection中的文档数据块驻留在shard0
和shard2
bigData
集合中的文档的数据块驻留在shard1
和shard2
上。
了解详情
若要了解有关分片和负载均衡的详细信息,请参阅以下页面: