2. 副本集部署规划与硬件选型
副本集部署规划的核心,是把业务对读写比例、数据规模、延迟和可用性的要求,翻译成一组可落地的节点角色、数量与硬件参数。规划做错,后期扩容和故障切换都会付出高昂代价。本节围绕“先定角色、再定数量、后定硬件与网络”的顺序展开,并给出可直接参考的示例参数。
一、从业务特征推导节点角色
副本集节点并非只有主从两种。规划时先明确四类角色的职责边界:
- 主节点(Primary):唯一接受写入,承载全部写流量与大部分强一致读。
- 从节点(Secondary):通过 oplog 持续复制,可承担读流量、参与选举投票。
- 隐藏节点(Hidden):priority=0、hidden=true,不参与选举、对客户端不可见,专用于备份、报表或离线分析。
- 延迟节点(Delayed):priority=0、hidden=true,并设置 slaveDelay,用于抵御误删、误更新等人为逻辑错误。
读写比例决定从节点数量与读偏好策略。若业务读:写约为 8:2,且允许最终一致读,可部署 2 个可读从节点分担查询;若写占比高、读多为强一致,则从节点主要用于冗余而非分流。数据规模决定存储与内存下限,延迟要求决定是否必须把节点分散到低延迟同城机房。
二、节点数量、优先级与投票权
生产环境推荐 3 节点或 5 节点投票成员,保证多数派为 2 或 3,能容忍 1 或 2 个节点故障。节点总数建议为奇数,避免选举平票。优先级用于控制主节点归属:核心机房节点 priority 设为 2,同城灾备节点设为 1,隐藏与延迟节点设为 0。
投票权(votes)默认 1,最多 7 个投票成员。当节点数超过 7 时,应把部分从节点设为 votes=0、priority=0 的非投票成员,仅做数据冗余,避免选举开销膨胀。下面给出一个 5 节点规划的示例配置,参数为教学假设值:
// 示例:5 节点副本集角色规划(假设值)
cfg = {
_id: "rs_prod",
members: [
{ _id: 0, host: "mongo-a1:27017", priority: 2, votes: 1 }, // 主机房主选
{ _id: 1, host: "mongo-a2:27017", priority: 1, votes: 1 }, // 主机房从
{ _id: 2, host: "mongo-b1:27017", priority: 1, votes: 1 }, // 同城灾备
{ _id: 3, host: "mongo-a3:27017", priority: 0, votes: 0,
hidden: true }, // 备份/报表
{ _id: 4, host: "mongo-a4:27017", priority: 0, votes: 0,
hidden: true, slaveDelay: 3600 } // 延迟1小时
]
}
rs.initiate(cfg)
该规划中投票成员为 3 个(_id 0/1/2),多数派为 2,可容忍 1 个投票节点故障;隐藏与延迟节点不参与选举,故障不影响可用性。slaveDelay=3600 表示延迟节点落后主节点 1 小时,误操作后有约 1 小时的恢复窗口。
三、硬件选型:内存、存储与 CPU
MongoDB 对内存最敏感。WiredTiger 默认使用约 50% 物理内存作为缓存,工作集应尽量装入内存。经验上,若热数据集为 200GB,单节点内存建议不低于 64GB,并预留系统与连接开销。存储优先选择本地 NVMe SSD,避免网络存储带来的写延迟抖动;oplog 与数据文件同盘时,需按写入量预留空间。
CPU 方面,副本集节点需处理查询、复制和选举,建议每节点 8 核以上;若承担聚合或索引构建,可提升到 16 核。网络建议万兆内网,跨机房复制链路延迟控制在 5ms 以内,否则延迟节点与选举超时参数需要重新评估。
| 节点角色 | CPU | 内存 | 存储 | 网络 |
|---|---|---|---|---|
| Primary/Secondary | 16 核 | 64GB | 2TB NVMe SSD | 万兆内网 |
| Hidden(备份) | 8 核 | 32GB | 4TB SSD | 万兆内网 |
| Delayed | 8 核 | 32GB | 4TB SSD | 万兆内网 |
表中参数为示例假设值,实际应按数据规模、写入速率和恢复时间目标(RTO/RPO)调整。例如日增数据 50GB、保留 90 天,则单节点至少需要 4.5TB 可用空间,并预留 30% 余量。
四、服务器与网络配置要点
操作系统层面,建议关闭透明大页(THP),设置 vm.swappiness=1,避免内存换页导致延迟尖刺。文件系统使用 XFS 或 ext4,挂载时启用 noatime。副本集各节点必须能通过主机名互相解析,/etc/hosts 或 DNS 中统一使用 rs 配置里的 host 名称,否则 rs.initiate 后会出现节点无法互连。
# 示例:Linux 基础调优(需 root)
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
sysctl -w vm.swappiness=1
# 挂载示例
# /dev/nvme0n1p1 /data xfs defaults,noatime 0 0
网络配置需保证:节点间 27017 端口互通;跨机房链路带宽满足 oplog 复制峰值;防火墙放行副本集内部通信。若使用 TLS,还需统一证书与 CA。完成配置后,通过 rs.status() 检查各节点 stateStr、health 与 optime 是否正常,确认延迟节点 lag 稳定在设定值附近。