同一副本集上的集合在争夺资源时可能会遇到性能瓶颈。当数据增长超出可用内存时,增加的磁盘 I/O 会导致延迟,并使系统资源紧张,从而降低整体应用程序性能。在集群内的专用分片上隔离集合可以减少这些资源限制,同时保持应用程序的单个连接点。
集合隔离的好处:
工作负载分离 — 通过将集合分配给特定分片来防止资源争用。
硬件优化 — 使用根据特定集合要求定制的硬件配置 个非对称分片。
独立扩展 — 根据工作负载增长单独扩展集合。
提高弹性 — 通过隔离潜在故障来缩短恢复时间。
何时使用 moveCollection
当您的集合要求有以下变化时,在专用分片上移动集合尤其有益:
要求 | 说明 |
|---|---|
访问模式 | 有些集合属于读取密集型,而另一些集合属于写入密集型。 |
性能 | 某些集合比其他集合需要更多的RAM、CPU 或磁盘吞吐量。 |
可扩展性需求 | 具有快速或不可预测增长模式的集合需要专用硬件。 |
将集合分配给具有必要硬件的分片以满足其特定要求,可以在保持操作简单性的同时优化性能。
何时移动未分片集合
从MongoDB 8.0 开始,可移动集合允许您有策略地将任何未分片集合放置在集群内的任何分片上。以前,未分片集合仅限于其数据库的主分片,从而导致资源瓶颈。移动集合允许您在不中断工作负载的情况下重新定位未分片的集合,从而简化了水平扩展。
虽然并非每个集合都需要进行分片的,但部署分片集群即使对于非分片集合也具有水平扩展的优势。这种方法为所有数据访问维护单个连接点,从而简化了应用程序架构。
以下场景受益于跨分片移动未分片集合:
工作负载隔离
当多个集合在同一集群中为不同的工作负载提供服务时,在不同的分片之间移动未分片的集合有助于防止资源争用。这种分离消除了一个工作负载性能对其他工作负载产生负面影响的问题。
多租户架构
在为不同租户托管集合的环境中,MongoDB 的 moveCollection 命令可以在不停机的情况下跨分片无缝分发集合。这种灵活性可根据每个租户的特定需求优化资源分配。
地理数据分布
组织可能需要在特定地理区域存储用户数据,以遵守数据主权法规。通过 moveCollection,您可以将未分片的集合放在不同区域的分片上,并随着监管要求的变化重新定位它们。
成本优化
在MongoDB 8.0 之前,数据库中的所有未分片集合都仅限于主分片。这种限制通常会迫使实例升级到更大、更昂贵的实例层。MongoDB 8.0 删除了这一限制,允许在集群中的所有可用分片之间移动未分片的集合。
在非对称分片硬件之间移动未分片的集合可以显着优化资源优化,允许您将特定集合放置在根据其要求定制的硬件上。通过将集合与适当的硬件资源相匹配,您可以根据实际需求独立扩展不同的工作负载。这种有针对性的方法可以提高性能,同时避免因在整个集群中过度配置资源而产生的费用。
降低集合密度
虽然MongoDB对每个实例的集合计数没有硬性限制,但当节点管理太多集合和索引时,性能会下降。要学习;了解有关这些限制的更多信息,请参阅MongoDB Atlas集合和索引限制。
通过将未分片的集合分布在不同的分片上,您可以降低任何单个节点上的集合密度,同时保持应用程序的统一访问权限点。
战略性托管
考虑将非分片集合并置在同一分片上,以最大限度地减少分布式操作,例如跨集合事务或连接操作 ($lookup)。将相关操作限制在单个分片可以消除网络开销,减少延迟,并提高整体性能。这种方法对于在同一ACID 事务中频繁联接或访问的集合特别有效。
命令语法
sh.moveCollection("database.collection", "shardName")
以下示例在两个分片之间移动四个未分片集合,以实现集合的平均分布:
db.adminCommand({moveCollection:"E", toShard: "shard1"})
何时避免使用 moveCollection
虽然 moveCollection 提供了显着的灵活性,但在某些特定情况下它可能不是最佳解决方案:
大型集合
当集合对于单个分片来说太大时,请勿使用 moveCollection。当集合大小接近 3 TB 时,请考虑对集合分片。
具有Atlas Search索引的集合
如果特定集合使用Atlas Search,请注意 moveCollection 使用重新分片来重写不同分片上的集合。移动集合后,您需要手动重建其Atlas Search索引。在完全重建索引之前, Atlas Search功能将无法用于此特定集合,但应用程序的其余部分将正常运行。
在使用 moveCollection 之前,请根据您的应用程序要求评估这些限制,以确定它是否是合适的解决方案。