文档菜单
文档首页
/
MongoDB 手册
/ /

使用区域分布集合

本页内容

  • 先决条件
  • 场景
  • 架构
  • 区域
  • 分片键
  • 平衡器
  • 步骤
  • 将每个分片添加到适当的区域。
  • 为相关集合添加区域范围。
  • 分片集合。
  • 审查更改。
  • 了解更多信息

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

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

完成本教程,您必须

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

  • bigData,包含大量数据。

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

您希望限制每个集合只能使用一组分片,以便每个集合可以使用分片的不同物理资源。

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

分片名称
物理资源
shard0
高内存容量
shard1
快速闪存存储
shard2
高内存容量 快速闪存存储

要基于物理资源分配集合,请使用分片区域。分片区域将集合与特定分片子集相关联,这限制了存储集合数据的分片。在此示例中,您需要两个分片区域

区域名称
描述
此区域中的集合
HI_RAM
具有高内存容量的服务器。
需要更多内存的集合,例如具有大型索引的集合,应位于 HI_RAM 分片上。
FLASH
具有快速存储速度的闪存驱动器的服务器。
需要快速数据检索的大型集合应位于 FLASH 分片上。

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

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

平衡器会将数据块迁移到适当的分片,同时尊重任何配置的区域。平衡完成后,分片只包含与其分配区域匹配范围的数据块。

重要

性能

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

使用以下程序配置分片区域并按分片物理资源分配集合。

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().

在此场景中,您希望将集合中所有文档关联到相应的区域。要将所有集合文档关联到区域,指定以下区域范围

  • 下界为 { "_id" : MinKey }

  • 上界为 { "_id" : MaxKey }

对于 bigData 集合,设置

  • 命名空间为 shardDistributionDB.bigData,

  • 对于 MinKey 的下界,

  • 对于 MaxKey 的上界,

  • 对于 FLASH 区域,

sh.updateZoneKeyRange(
"shardDistributionDB.bigData",
{ "_id" : MinKey },
{ "_id" : MaxKey },
"FLASH"
)

对于 manyIndexes 集合,设置

  • 命名空间为 shardDistributionDB.manyIndexes

  • 对于 MinKey 的下界,

  • 对于 MaxKey 的上界,

  • 区域为 HI_RAM

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.

平衡完成后

  • manyIndexes 集合中的文档数据块位于 shard0shard2

  • bigData 集合中的文档数据块位于 shard1shard2 上。

要了解更多关于分片和平衡的内容,请参阅以下页面

返回

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