复制集
MongoDB Replica Set 是官方推荐的高可用部署方式。自 6.x/7.x 起,复制集新增了改进的选举算法、同步机制、Retryable Writes、故障转移观测工具等能力。本节在原有讲义基础上修正术语并补充现代化运维建议。
为什么需要复制集
- 高可用:主节点发生故障时自动选出新的主节点,客户端在启用
retryWrites=true
时可自动重试 - 读写分离:可将读取负载(
readPreference: secondary
)分担给从节点;结合hedged reads
降低延迟 - 灾备与数据分发:跨地域部署隐藏节点(hidden)/延迟节点(delayed)提升容灾能力
- 维护便利:支持滚动升级、在线索引构建、Backup Snapshot 等运维操作
复制集结构
- 推荐至少 3 个具有投票权的节点:
- PRIMARY:接受写入与投票
- SECONDARY:复制 PRIMARY 的 oplog,可配置优先级/隐藏/延迟
- 选举需半数以上投票节点存活;最多 7 个投票节点,最多 50 个成员
- 不再建议使用 Arbiter,除非受限于硬件成本且能接受风险
数据复制机制
- PRIMARY 将所有写操作记录到
oplog.rs
- SECONDARY 通过
tailable cursor
持续拉取 oplog 并重放,保持数据一致 - oplog 默认存储在 local 库,可按磁盘容量调整
oplogSizeMB
故障转移与选举
- 节点之间每 2 秒发送心跳,5 次未响应视作失联
- 选举使用改进的 Raft 算法(PV0/PV1),需满足:
- 候选节点与大多数节点保持通信
- 拥有最新的 oplog term/ts
- 具有最高
priority
- 复制集配置示例:
rs.initiate({
_id: 'rs0',
members: [
{ _id: 0, host: 'mongo1:27017', priority: 2 },
{ _id: 1, host: 'mongo2:27017', priority: 1 },
{ _id: 2, host: 'mongo3:27017', priority: 0, hidden: true, votes: 0, secondaryDelaySecs: 3600 }
]
});
js
priority: 0
节点不会成为 PRIMARY,常用于只读/延迟节点hidden: true
节点对客户端不可见,适合作为备份或分析节点
常用运维命令
rs.status(); // 查看复制集状态
rs.printReplicationInfo();
rs.printSecondaryReplicationInfo();
rs.stepDown(60); // 主动让出主节点(维护时使用)
rs.freeze(120); // 暂停节点参与选举
rs.config(); // 查看配置
js
写关注与读偏好
- 写入建议使用
w: 'majority'
,配合j: true
提升可靠性 - 读取可选择:
primary
(默认,强一致)primaryPreferred
secondary
secondaryPreferred
nearest
(配合maxStalenessSeconds
控制可接受延迟)
- Atlas 可启用
hedged reads
减少跨区域延迟
复制集配置选项
参数 | 说明 |
---|---|
votes | 是否参与投票(0/1) |
priority | 选举优先级,0 表示永不当选 PRIMARY |
hidden | 是否对客户端隐藏 |
secondaryDelaySecs | 延迟复制秒数,用于灾备 |
buildIndexes | 是否在 secondary 上构建索引(默认 true) |
tags | 与读偏好策略结合,实现地域感知 |
注意事项
- 硬件规格应保持一致,避免性能瓶颈导致选举波动
- 为避免单点故障,节点应分布在不同机架/可用区
- 副本集节点需使用相同的 MongoDB 版本与参数
- 扩容节点不会提升写性能(PRIMARY 仍为写入入口),更多用于读负载与容灾
- 开启
replication.enableMajorityReadConcern
(默认开启),保障在网络分区时的读一致性
复制集监控
mongosh
:db.serverStatus().metrics.repl
、db.printSecondaryReplicationInfo()
Atlas
:Replica Set 层级指标、自动告警、Performance Advisor- 自建:结合 Prometheus Exporter、Grafana 或 Percona Monitoring and Management (PMM)
进阶:跨集群同步与全局集群
- Cluster-to-Cluster Sync(6.0+):用于跨环境灾备、蓝绿发布
- Global Clusters(Atlas):按地域路由流量,副本集成员可分布在多个云区域
- Change Streams:基于 oplog 实现事件驱动,可替代手写 CDC 服务
若业务需要进一步水平扩展,可在复制集基础上启用 Sharding(分片),由 Router (
mongos
) 负责转发请求。复制集仍是每个分片的最小单元。
↑