副本集成员与分片节点的资源分配对比
比较 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 和吞吐量要求,尤其是对于存储密集型操作。
- 测试和基准测试: 在投入生产之前,始终使用实际工作负载测试计划的基础设施。这有助于验证您的资源分配假设。
总结
当您的工作集、写入速率和存储能够舒适地容纳在一个数据承载节点类上时,请使用副本集。当您需要水平扩展时,请转向分片,但需为额外的活动部件做好预算:分片副本集、配置服务器、路由器、网络容量以及更多的操作测试。