MongoDB副本集的核心机制
一、同步(Replication Synchronization)
同步是副本集保持数据一致性的基础机制,确保从节点(Secondary)与主节点(Primary)的数据保持一致。
1. 同步类型
| 类型 | 说明 |
|---|---|
| 初始同步 | 新加入副本集的节点进行的全量数据同步 |
| 增量同步(复制) | 节点加入后持续从主节点(或其他节点)同步操作日志 |
2. 初始同步流程
- 节点加入副本集
- 从源节点(通常为主节点)克隆所有数据文件(全量数据)
- 建立索引
- 开始应用增量操作日志(oplog)
3. 增量同步
- 通过读取主节点的 oplog 实现
- 每个从节点维护自己的数据状态,不断追赶主节点
- 使用
rs.status()可查看同步进度(optime)
4. 同步源选择
- 从节点可选择其他从节点作为同步源(链式复制),以减轻主节点压力
- MongoDB 自动选择延迟较低、数据较新的节点作为同步源
二、心跳(Heartbeat)
心跳用于节点之间感知彼此存活状态,是故障检测和副本集健康检查的基础。
1. 心跳机制
- 每个节点每隔 2秒 向其他节点发送一次心跳请求
- 心跳用于检测节点是否存活、角色是否变化、optime 是否更新等
2. 心跳的作用
- 检测节点 宕机
- 判断主节点是否失效
- 触发 选举 流程
- 更新节点状态(
UP/DOWN)
3. 心跳配置
| 参数 | 说明 |
|---|---|
heartbeatIntervalMillis |
心跳间隔(默认2000ms) |
heartbeatTimeoutSecs |
心跳超时时间(默认10秒),超过则判定节点不可达 |
4. 心跳与选举
- 若超过半数节点无法联系主节点,则会触发新一轮选举
- 心跳信息中包含节点的
priority、optime、state等,用于选举决策
三、选举(Election)
选举是副本集在主节点故障或不可用时自动选举新主节点的过程,保障高可用。
1. 触发选举的条件
- 主节点宕机或不可达(心跳超时)
- 主节点降级(如
stepDown命令) - 副本集初始化
- 节点优先级发生变化
- 节点重配置
2. 选举机制
- 使用 Bully 算法 的变种
- 节点通过 投票 选举新主节点
- 每个节点有一票(或根据
votes配置)
3. 选举流程
- 节点检测到主节点不可达
- 发起选举请求(
elect) - 其他节点根据以下条件决定是否投票:
- 自身是否可到达
- 候选节点的 optime 是否足够新(数据完整性)
- 候选节点优先级是否高于自己
- 若候选节点获得 半数以上 投票,则成为新主节点
4. 选举相关配置
| 参数 | 说明 |
|---|---|
priority |
优先级(0-1000),优先级越高越容易被选为主节点 |
votes |
是否拥有投票权 |
electionTimeoutMillis |
选举超时时间(默认10秒) |
5. 选举中的常见问题
- 脑裂:通过多数派机制避免,确保只有一个主节点
- 投票僵局:节点数不足时无法选举(如副本集仅2个节点)
- 仲裁节点(Arbiter):仅参与投票,不存储数据,用于打破平局
四、回滚(Rollback)
回滚发生在主节点故障恢复后,其数据与当前主节点不一致时,MongoDB 会回滚该节点上未被复制的写入操作。
1. 回滚的触发场景
- 原主节点在宕机期间接收了写入,但这些写入未被复制到其他节点
- 原主节点恢复后,其 oplog 与当前主节点出现"分支"
2. 回滚过程
- 原主节点以从节点身份重新加入副本集
- 检测到 oplog 不一致
- 自动将本地未复制的操作写入
rollback目录 - 回滚到与当前主节点一致的 oplog 位置
- 恢复为从节点,继续同步
3. 回滚的影响
- 数据丢失:回滚过程中,未复制的写入操作会被丢弃
- 写入记录 :被回滚的操作会保存在
rollback目录下的.bson文件中,供管理员手动恢复
4. 减少回滚的策略
-
使用 写关注(write concern):
javascriptdb.collection.insert({...}, { writeConcern: { w: "majority" } }) -
确保写入操作被多数节点确认,减少未同步数据
-
避免使用低投票数或单节点副本集
总结
| 机制 | 作用 | 关键点 |
|---|---|---|
| 同步 | 保持数据一致 | oplog、初始同步、增量同步、同步源选择 |
| 心跳 | 检测节点健康 | 2秒间隔、超时判定、触发选举 |
| 选举 | 实现高可用 | 多数派、优先级、optime、投票机制 |
| 回滚 | 处理数据冲突 | 未复制写入、rollback目录、写关注 |
这些机制共同构成了 MongoDB 副本集的高可用、高一致性和自动故障恢复能力。理解它们是掌握 MongoDB 集群运维和架构设计的核心基础。