Docs 菜单
Docs 主页
/
MongoDB Manual
/ /

使用区域分发集合

在此页面上

  • 先决条件
  • Scenario
  • 架构
  • 区域
  • 片键
  • 平衡器
  • 步骤
  • 将每个分片添加到适当的区域。
  • 为相关collection添加区域范围。
  • 对集合进行分片。
  • 查看更改。
  • 了解详情

在分片的集群中,您可以根据分 分片键 创建分分片的数据的 区域 。您可以将每个区域与集群中的一个或多个分片相关联。 一个分分片可以与任意数量的区域关联。 在均衡集群中, MongoDB仅将区域覆盖的数据段迁移到与该区域关联的分片。

您可以使用区域分片在分片集群中分发集合,并指定哪个分片存储每个集合的数据。您可以根据分片属性(如物理资源和可用内存)分发集合,以确保每个集合都存储在该数据的最佳分片上。

要完成本教程,您必须:

您有一个名为shardDistributionDB的数据库,其中包含两个分分片的集合:

  • bigData,其中包含大量数据。

  • manyIndexes,其中包含许多大型索引。

您希望将每个集合限制为分片子集,以便每个集合可以使用分片的不同物理资源。

该分片集群有三个分片。每个分片都有独特的物理资源:

分片名称
物理资源

shard0

高内存容量

shard1

快速存储

shard2

高内存容量快速闪存

要根据物理资源分配集合,请使用分片区域。分片区域将集合与特定的分片子集关联起来,从而限制存储集合数据的分片。在此示例中,您需要两个分片区域:

区域名称
说明
此区域中的collection

HI_RAM

具有高内存容量的服务器。

需要更多内存的集合(例如具有大索引的集合)应位于HI_RAM分片上。

FLASH

带有闪存驱动器的服务器,可实现快速存储。

需要快速数据检索的大型collection应位于FLASH分片上。

在本教程中,用于对分片集合进行分片的分片分片键{ _id: "hashed" } 。 在对分片进行分片之前,您将配置分分片区域。 因此,每个集合的数据仅存在于相应区域的分片上。

使用哈希分片时,如果在配置区域之前对集合进行分片,则启用分片后,MongoDB 会在所有分片之间平均分配数据块。这意味着数据块可能会临时分配给不适合处理该数据块数据的分片。

负载均衡器会根据任何已配置的区域将数据块迁移到相应的分片。平衡完成后,分片仅包含范围与其已分配区域匹配的数据块。

重要

性能

添加、删除或更改区域或区域范围可能会导致数据块迁移。根据数据集大小以及区域或区域范围影响的数据块数量,这些迁移可能会影响集群性能。考虑在特定的计划窗口运行负载均衡器。要了解如何设置计划窗口,请参阅计划负载均衡窗口

使用以下过程配置区域,并根据分片物理资源分配collection。

1

要配置每个区域中的分片,请使用addShardToZone命令。

shard0shard2 添加到 HI_RAM 分区:

sh.addShardToZone("shard0", "HI_RAM")
sh.addShardToZone("shard2", "HI_RAM")

shard1shard2 添加到 FLASH 分区:

sh.addShardToZone("shard1", "FLASH")
sh.addShardToZone("shard2", "FLASH")
2

要将范围分分片键与区域关联,请使用sh.updateZoneKeyRange()

在这种情况下,您希望将collection中的所有文档与相应的区域相关联。要将所有collection文档与区域关联,请指定以下区域范围:

  • 下限 { "_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"
)
3

要分片两个集合( bigDatamanyIndexes )进行分片,请指定分分片键{ _id: "hashed" }

运行以下命令:

sh.shardCollection(
"shardDistributionDB.bigData", { _id: "hashed" }
)
sh.shardCollection(
"shardDistributionDB.manyIndexes", { _id: "hashed" }
)
4

要查看数据块分布和分片区域,请使用 sh.status() 方法:

sh.status()

下次负载均衡器运行时,它会根据配置的区域,根据需要分割数据段,并在分片之间迁移数据段。 负载均衡器完成所需的时间取决于多个因素,包括分片数量、可用内存和 IOPS

负载均衡完成后:

  • manyIndexescollection中的文档数据块驻留在shard0shard2

  • bigData 集合中的文档的数据块驻留在 shard1shard2 上。

若要了解有关分片和负载均衡的详细信息,请参阅以下页面:

后退

仅插入工作负载的分布式本地写入