2. 硬件与操作系统选型

MongoDB 副本集的高可用能力,最终要落在具体硬件与操作系统上。副本集有三个关键行为会直接放大硬件差异:写入先落主节点再异步复制到从节点、选举依赖心跳与多数派确认、读偏好可能把读流量分散到多个节点。因此选型不能只看“单机跑得动”,而要看“三节点同时工作、故障切换时仍能稳定”的资源余量。下面按 CPU、内存、磁盘 IO、网络带宽四条主线展开,再给出 Linux 内核参数与文件系统的落地优化。

CPU:关注并发连接与压缩,而非主频堆叠

MongoDB 的多数操作是 IO 与内存等待型,CPU 主要消耗在 WiredTiger 的压缩/解压、查询执行、索引维护以及复制线程上。生产环境建议每节点至少 8 核,中等负载 16 核,高写入或大量二级索引场景 32 核以上。核心数比单核主频更重要,因为副本集需要同时处理客户端请求、oplog 拉取、心跳与选举。若使用 zstd 压缩,CPU 开销会上升,需预留 20%~30% 余量。判断 CPU 是否成为瓶颈,可观察 db.serverStatus().opcounters 与系统 top 中 mongod 进程的 %us、%sy:若持续高于 70% 且写入延迟上升,说明 CPU 已接近上限。

内存:WiredTiger 缓存是核心,需为系统留白

WiredTiger 默认使用 (总内存-1GB)×50% 作为缓存。生产上建议单节点内存不低于 16GB,推荐 32GB 或 64GB。内存不足会触发频繁的 page fault 与磁盘读,直接拖慢复制。配置时显式设置 storage.wiredTiger.engineConfig.cacheSizeGB,例如 64GB 内存设为 28~30GB,剩余留给文件系统缓存、连接与 oplog。注意:副本集每个节点都要独立满足该内存要求,不能按“三节点共享”估算。

磁盘 IO:副本集最容易被忽视的瓶颈

副本集的写入路径是:主节点写 journal 与数据文件 → 写 oplog → 从节点拉取并重放。磁盘 IOPS 与 fsync 延迟决定复制是否跟得上。生产必须使用 SSD,推荐 NVMe;机械盘仅适合冷备或测试。容量上,数据盘建议预留 50% 以上空间,因为 oplog 与压缩后的数据会持续增长。关键指标是 db.serverStatus().wiredTiger 中的 cache 与 checkpoint,以及 iostat -x 1 的 %util 与 await:若 await 持续大于 10ms,说明磁盘已紧张。副本集建议三节点使用相同磁盘规格,避免从节点因 IO 慢而长期落后。

网络带宽:心跳、复制与选举的生命线

副本集节点间需要持续传输心跳(默认 2 秒)与 oplog。带宽不足会导致复制延迟、选举超时甚至误判节点下线。建议节点间使用万兆内网,至少千兆独占;跨机房部署时,节点间 RTT 应低于 10ms,带宽按“写入峰值 × 副本数”估算。例如写入峰值 50MB/s、三副本,则主节点出口至少需 100MB/s 以上余量。可用 rs.status() 查看 optimeDate 与 lastHeartbeat,若从节点 optime 落后主节点超过数秒,优先排查网络与磁盘。

MongoDB 副本集生产节点资源与数据流关系 主节点 Primary CPU:16 核,压缩/查询 内存:64GB,WT 缓存 30GB 磁盘:NVMe SSD,await < 5ms 网络:万兆内网,出口 ≥ 100MB/s 写入:journal → 数据 → oplog 从节点 Secondary-1 CPU:16 核,重放 oplog 内存:64GB,WT 缓存 30GB 磁盘:NVMe SSD,与主同规格 网络:万兆内网,RTT < 10ms 复制:拉取 oplog → 重放 从节点 Secondary-2 CPU:16 核,重放 oplog 内存:64GB,WT 缓存 30GB 磁盘:NVMe SSD,与主同规格 网络:万兆内网,RTT < 10ms 复制:拉取 oplog → 重放 oplog 复制 oplog 复制 心跳 2s / 选举多数派 Linux 内核参数与文件系统优化 vm.swappiness=1  vm.dirty_ratio=15  vm.dirty_background_ratio=5 net.core.somaxconn=65535  net.ipv4.tcp_max_syn_backlog=65535 文件系统:XFS,noatime,nobarrier(视硬件),禁用透明大页 THP 关键观测指标与判断依据 CPU:mongod %us+%sy > 70% 持续 → 扩容或优化查询 磁盘:iostat await > 10ms 或 %util > 80% → 升级 SSD / 拆分 IO 复制:rs.status() optimeDate 落后 > 数秒 → 查网络与磁盘

Linux 内核参数:让内存与网络更贴合数据库

默认内核参数面向通用场景,对 MongoDB 并不友好。第一组是内存与脏页:vm.swappiness=1 降低换页倾向,避免 WiredTiger 缓存被换出;vm.dirty_ratio=15、vm.dirty_background_ratio=5 控制脏页回写节奏,防止突发 fsync 抖动。第二组是网络:net.core.somaxconn=65535、net.ipv4.tcp_max_syn_backlog=65535 提升连接队列,net.ipv4.tcp_fin_timeout=30 加快连接回收。第三组是文件句柄与进程数:fs.file-max=1048576,并在 /etc/security/limits.conf 中为 mongod 用户设置 nofile 64000、nproc 64000。修改后执行 sysctl -p 生效,并用 ulimit -n 确认。

文件系统与挂载:XFS + noatime + 禁用 THP

MongoDB 官方推荐 XFS,因其在并发写入与扩展性上优于 ext4。挂载时使用 noatime 减少元数据写入,nobarrier 仅在带电池保护缓存的 RAID 卡上使用,否则保留 barrier 保证掉电一致性。透明大页(THP)会导致内存分配延迟抖动,必须关闭:echo never > /sys/kernel/mm/transparent_hugepage/enabled,并写入 /etc/rc.local 或 systemd 单元确保重启后仍生效。此外,建议将 journal 与数据放在同一高性能盘,若使用 RAID,优先 RAID10,避免 RAID5 的写惩罚。

一份可直接参考的节点配置示例

以下为三节点副本集单节点的推荐配置,属于教学示例,实际需按业务压测调整:

CPU:16 核(主频 ≥ 2.5GHz)
内存:64GB,WiredTiger cacheSizeGB=30
磁盘:NVMe SSD 1TB,XFS,noatime
网络:万兆内网,节点间 RTT < 10ms
内核:vm.swappiness=1,dirty_ratio=15,somaxconn=65535
文件系统:关闭 THP,nofile=64000
选型的核心原则是“三节点同规格、留足余量、以复制延迟和磁盘 await 为最终判据”。硬件达标后,再用内核与文件系统优化把稳定性补齐,副本集的高可用才有真实基础。