副本集成员与分片节点的资源分配对比

比较 MongoDB 副本集和分片集群中主节点、从节点、仲裁节点、mongos、配置服务器和分片的资源需求。

副本集成员与分片节点的资源分配对比

当从单个副本集迁移到分片集群时,MongoDB 的资源规划会发生显著变化。两种主要架构实现了这些目标:副本集和分片集群。虽然两者都是生产级 MongoDB 部署的基础,但它们底层的资源分配策略差异很大,直接影响基础设施设计和成本。

副本集将所有数据集和大部分写入压力集中在一个主节点上。分片集群将数据分布到多个分片副本集中,但增加了 mongos 路由器和配置服务器,这些组件也需要容量和监控。

理解 MongoDB 部署策略

在深入探讨资源分配之前,我们先简要回顾一下副本集和分片集群中每个组件的作用。

副本集:高可用性和数据冗余

MongoDB 副本集是一组维护相同数据集的 mongod 实例。这提供了高可用性和数据冗余。一个副本集通常包含:

  • 主节点: 唯一接收所有写入操作的节点。它将所有更改记录在其操作日志(oplog)中。在任何给定时间,一个副本集中只能有一个主节点。
  • 从节点: 复制主节点的 oplog 并将这些更改应用到自己的数据集,确保数据一致性。根据读取偏好设置,从节点可以处理读取操作,如果当前主节点不可用,它们可以被选举为主节点。
  • 仲裁节点: 参与选举以确定主节点,但不存储数据。仲裁节点消耗的资源极少,当无法部署另一个数据承载成员时,可用于增加投票。它们不能防止所有选举问题,应谨慎使用。

分片集群:水平可扩展性

分片是 MongoDB 跨多台机器分布数据的方法。这实现了水平扩展,以处理单个副本集无法管理的大型数据集和高吞吐量操作。分片集群包含几个关键组件:

  • Mongos(查询路由器): 充当客户端应用程序和分片集群之间的接口。它们将查询路由到适当的分片,聚合结果,并管理连接。
  • 配置服务器(CSRS): 存储集群的元数据,包括哪些数据范围位于哪些分片上(“分片映射”)。配置服务器以副本集(配置服务器副本集 - CSRS)的形式部署,以实现高可用性。
  • 分片: 每个分片本身就是一个副本集,保存集群数据的一个子集。数据根据分片键分布在这些分片上。

副本集成员的资源分配

副本集成员的资源需求根据其角色和整体工作负载而有显著差异。

主节点

主节点是副本集中最关键且资源最密集的成员,因为它处理所有写入操作,并且通常处理大部分读取操作。

  • CPU: 高。 写入密集型工作负载、复杂的聚合管道、索引操作以及处理大量并发连接需要强大的 CPU 能力。如果您的应用程序频繁更新文档或执行密集型查询,主节点的 CPU 可能很快成为瓶颈。
  • RAM: 关键。 MongoDB 的 WiredTiger 存储引擎严重依赖 RAM 作为缓存。主节点需要足够的 RAM 来将频繁访问的数据和索引保存在内存中,以最小化磁盘 I/O。一个常见的建议是分配足够的 RAM 来容纳您的工作集(应用程序主动使用的数据和索引)加上一些缓冲。
  • 存储: 高 IOPS 和吞吐量。 所有写入操作都会写入主节点的磁盘,包括日志记录。需要具有高 IOPS(每秒输入/输出操作数)的快速存储(SSD/NVMe)来防止写入延迟成为瓶颈。容量必须足以容纳完整数据集及其增长,以及 oplog 空间。

从节点

从节点从主节点复制数据,并且可以处理读取请求,从而减轻主节点的负担。它们的资源需求通常与主节点相似,尤其是在处理读取时。

  • CPU: 中到高。 CPU 使用率取决于复制速率和读取工作负载。如果从节点处理很大一部分读取,它们的 CPU 需求可能接近主节点。如果主要用于复制和故障转移,CPU 使用率会较低,但对于高效应用 oplog 条目仍然很重要。
  • RAM: 关键。 与主节点类似,从节点维护一个 WiredTiger 缓存,需要足够的 RAM 来容纳工作集,以便高效应用 oplog 条目并提供读取服务,而不会产生过多的磁盘 I/O。从节点的缓存理想情况下应与主节点镜像,以确保故障转移期间性能一致。
  • 存储: 高 IOPS 和吞吐量。 从节点必须通过应用 oplog 条目来跟上主节点的写入。这也需要高 I/O 性能。容量需要与主节点相同,因为它们存储数据的完整副本。

提示: 确保从节点的配置与主节点类似。这确保了平滑的故障转移,并在从节点成为主节点时保持性能一致。

仲裁节点

仲裁节点是轻量级节点,仅用于参与选举。它们不存储数据,也不处理读取/写入操作。

  • CPU: 非常低。 仲裁节点执行与选举协议相关的最小计算。
  • RAM: 非常低。 只需要足够的内存用于基本的 mongod 进程开销和选举状态。
  • 存储: 非常低。 仅存储最小的配置和日志文件,没有数据文件。

警告: 切勿在仲裁节点上运行应用程序或其他数据库进程。它应该是一个专用的最小实例,以确保其可用于选举并防止资源争用。

分片组件的资源分配

分片集群引入了额外的组件,每个组件都有独特的资源需求,导致资源分配策略更加分布式和复杂。

Mongos(查询路由器)

mongos 实例是无状态的路由进程。它们不存储数据,但协调跨分片的操作。

  • CPU: 中到高。 CPU 使用率随客户端连接数、查询路由工作、分散-聚集查询以及 mongos 必须协调的聚合合并工作而扩展。可以添加更多 mongos 实例来处理更高的负载。
  • RAM: 中等。 主要用于连接管理、缓存来自配置服务器的元数据(分片映射)以及临时聚合缓冲区。不如数据承载节点关键,但足够的 RAM 可防止交换并确保快速响应时间。
  • 存储: 非常低。 仅存储日志。本地 SSD 通常就足够了。

提示: 为获得最佳性能,请将 mongos 实例部署在靠近应用程序服务器的位置,以最小化网络延迟。

配置服务器(配置服务器副本集 - CSRS)

配置服务器对于分片集群的操作至关重要,存储有关集群状态的元数据。它们始终以副本集(CSRS)的形式部署。

  • CPU: 中等。 在块迁移、分片重新平衡或频繁的元数据更新期间,CPU 使用率可能会飙升。虽然不如数据承载主节点高,但一致的性能至关重要。
  • RAM: 中到高。 需要足够的 RAM 来将关键的集群元数据保存在内存中。元数据的大小取决于分片数、块数和数据库数。RAM 不足会严重降低集群性能和稳定性。
  • 存储: 中等 IOPS 和容量。 虽然元数据大小通常小于用户数据,但对分片映射和其他集群状态信息的更新可能很频繁,需要良好的 I/O 性能。容量需要容纳不断增长的元数据和 oplog。

警告: 配置服务器的性能和可用性至关重要。任何降级都可能使整个分片集群瘫痪。请使用高度可靠且高性能的基础设施来配置它们。

分片成员(数据承载副本集)

每个分片都是一个独立的副本集,存储集群总数据的一个子集。因此,每个分片内主节点、从节点和仲裁节点的资源需求在性质上与独立副本集相似,但根据它们持有的数据部分进行缩放。

  • CPU: 主节点高,从节点中到高。 每个分片的主节点处理其数据子集的所有写入和可能的读取。需求与路由到该特定分片的工作负载成比例。
  • RAM: 主节点和从节点关键。 每个分片的 mongod 需要足够的 RAM 用于其 WiredTiger 缓存,与其存储的数据的工作集成比例。这对于其数据段内的性能至关重要。
  • 存储: 主节点和从节点高 IOPS 和吞吐量。 与独立副本集类似,需要快速存储来处理分片数据子集的写入、读取和复制。容量必须足以容纳分片的数据部分及其增长。

关键区别: 虽然单个分片副本集的要求与独立副本集类似,但整个分片集群将总数据和工作负载分布到多个这样的副本集上。这意味着所有分片的总资源将显著大于单个垂直扩展的副本集。

资源分配对比:副本集 vs. 分片集群

特性 副本集(独立) 分片集群
目的 高可用性、数据冗余、适度扩展 水平扩展、超大数据集、高吞吐量
总节点数 通常 3 个数据承载成员;仅在必要时使用仲裁节点 3 个配置服务器 + N 个分片副本集(通常每个 3+ 个成员)+ M 个 Mongos 实例
CPU 主节点处理所有写入 CPU。从节点处理读取 CPU。仲裁节点最小。 分布在 mongos、配置服务器和多个分片主节点上。总体总 CPU 更高。
RAM 主节点和从节点需要 RAM 用于整个工作集。 每个分片主节点/从节点需要 RAM 用于其工作集的子集。配置服务器需要 RAM 用于元数据。总体总 RAM 更高。
存储 主节点和从节点需要容量和 IOPS 用于整个数据集。 每个分片主节点/从节点需要容量和 IOPS 用于其数据集的子集。配置服务器需要中等 IOPS/容量。总体总存储更高。
瓶颈 主节点用于写入;单个机器的资源限制。 任何组件(mongos、配置服务器或单个分片)如果配置不足都可能成为瓶颈。
复杂性 设置和管理相对简单。 规划、部署和管理要复杂得多。
成本 适度规模的基础设施成本较低。 由于实例更多且分布式特性,基础设施成本更高。

实际考虑因素和最佳实践

  • 工作负载分析: 彻底了解应用程序的读/写模式、数据增长预测和查询复杂性。这是资源规划中最重要的因素。
  • 监控是关键: 对所有 MongoDB 组件实施全面监控(CPU、RAM、磁盘 I/O、网络、数据库指标,如 WiredTiger 缓存使用率、oplog 延迟、查询时间)。这有助于识别瓶颈并允许主动扩展。
  • 网络性能: 对于分片集群,mongos、配置服务器和分片之间的网络延迟和带宽至关重要。分片间通信和数据平衡操作可能受到网络性能不佳的严重影响。
  • 专用资源: 每个 mongod 进程,无论是主节点、从节点还是分片成员,都应在专用硬件或专用虚拟机上运行。避免与应用程序服务器或其他数据库实例共存,以防止资源争用。
  • 云 vs. 本地: 云提供商提供了轻松扩展资源的灵活性。但是,请确保所选实例类型满足 IOPS 和吞吐量要求,尤其是对于存储密集型操作。
  • 测试和基准测试: 在投入生产之前,始终使用实际工作负载测试计划的基础设施。这有助于验证您的资源分配假设。

总结

当您的工作集、写入速率和存储能够舒适地容纳在一个数据承载节点类上时,请使用副本集。当您需要水平扩展时,请转向分片,但需为额外的活动部件做好预算:分片副本集、配置服务器、路由器、网络容量以及更多的操作测试。