mongo db集群故障选举分析
转载请注明出处:
一、MongoDB集群基础架构
1. 副本集(Replica Set)核心原理
节点角色:
Primary:唯一可写节点,处理所有写操作和默认读请求
Secondary:异步复制Primary数据,可配置为只读节点
Arbiter(可选):不存储数据,仅参与投票
选举机制:
基于Raft协议,需多数节点存活(N/2 +1)才能选出Primary
每个节点有1票,Arbiter无数据但有投票权
数据同步:
通过Oplog(操作日志)实现异步复制
写操作需满足
writeConcern级别才返回成功
2. 三节点典型部署
Node1: Primary (投票权=1)
Node2: Secondary (投票权=1)
Node3: Secondary/Arbiter (投票权=1)
多数票数(majority)=2
二、单节点故障场景分析
1.集群状态变化:
剩余节点:2个节点存活(1主1从或2从)。
选举能力:
三节点集群的多数(majority)= 2。
剩余2个节点仍能形成多数,触发自动选举。
读写能力:
新主节点继续处理写操作(需满足
w: majority)。读操作可正常进行(从新主或剩余从节点)。
数据安全:
若宕机节点是主节点:已确认的写操作(
w: majority)不会丢失。若宕机节点是从节点:主节点继续服务,数据同步暂停直至节点恢复。
恢复流程:
自动故障转移(通常30秒内完成)。
宕机节点恢复后自动同步增量数据。
- 选举日志:

2. 故障节点类型
| 故障节点 | 集群行为 | 影响范围 |
|---|---|---|
| Primary | 剩余2个Secondary触发选举,30秒内选出新Primary | 写入中断<30秒,读操作可继续(若客户端配置readPreference=secondaryPreferred) |
| Secondary | Primary继续服务,集群标记该节点为RECOVERING,恢复后自动同步增量数据 |
无写入中断,读能力降级(少一个读节点) |
3. 数据一致性保障
写关注(Write Concern):
若写操作配置
w: majority,即使故障节点未确认,数据也不会丢失示例安全写入命令:
db.products.insert(
{ item: "card", qty: 15 },
{ writeConcern: { w: "majority", j: true } } // j=true表示持久化到磁盘
)
三、双节点故障场景分析
1.集群状态变化:
剩余节点:1个节点存活。
选举能力:
无法满足多数(2/3),无法选举新主。
原主节点若存活则继续服务,否则集群无主。
读写能力:
写操作:完全不可用(无主节点)。
读操作:
若存活节点是主节点:可读(需客户端直连该节点)。
若存活节点是从节点:需设置
readPreference=secondary。
数据风险:
若原主节点宕机且未持久化最新数据:可能丢失未复制到从节点的写操作。
恢复选项:
自动恢复:需至少一个节点恢复形成多数。
强制恢复(高风险)
2. 剩余节点状态
| 存活节点 | 集群状态 | 恢复方案 |
|---|---|---|
| 仅Primary | 失去majority,Primary自动降级为Secondary,集群进入只读模式 | 需手动干预: 1. 重启一个故障节点 2. 或强制重组副本集(rs.reconfig()) |
| 仅Secondary | 无Primary,所有写入操作失败,读操作需显式指定readPreference=secondary |
需至少恢复1个节点以形成majority |
3. 数据风险窗口
潜在丢失数据:
故障前写入未达到
w: majority的数据可能丢失可通过
oplog检查未复制的操作:// 在Primary上查看oplog时间窗口
rs.printReplicationInfo()
// 输出示例:oplog first event time -> last event time
四、核心机制深度解析
1. 选举触发条件
A[节点检测Primary无响应] --> B[发起选举请求]
B --> C{获票数≥majority?}
C -->|Yes| D[成为新Primary]
C -->|No| E[等待重试]
2. 数据同步流程
Primary将写操作记录到
local.oplog.rs集合Secondary定期拉取(
fetch) Primary的oplog应用oplog到本地数据集(异步过程)
3. 故障恢复时序
故障检测(10s) → 选举阶段(30s) → 数据同步(依赖网络带宽)
五、生产环境建议
1. 部署优化
跨机房容灾:
机房A: Primary + Secondary
机房B: Secondary- 优先级配置:
// 确保特定节点优先成为Primary
cfg = rs.conf()
cfg.members[0].priority = 2
cfg.members[1].priority = 1
rs.reconfig(cfg)以下是一个集群配置下的 : rs.conf() 配置:
rs0:PRIMARY> rs.conf()
{
"_id" : "rs0",
"version" : 222935,
"protocolVersion" : NumberLong(1),
"writeConcernMajorityJournalDefault" : true,
"members" : [
{
"_id" : 0,
"host" : "mongo1:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 2,
"tags" : { },
"slaveDelay" : NumberLong(0),
"votes" : 1
},
{
"_id" : 1,
"host" : "mongo2:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 2,
"tags" : { },
"slaveDelay" : NumberLong(0),
"votes" : 1
},
{
"_id" : 2,
"host" : "mongo3:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 2,
"tags" : { },
"slaveDelay" : NumberLong(0),
"votes" : 1
}
],
"settings" : {
"chainingAllowed" : true,
"heartbeatIntervalMillis" : 2000,
"heartbeatTimeoutSecs" : 10,
"electionTimeoutMillis" : 10000,
"catchUpTimeoutMillis" : -1,
"catchUpTakeoverDelayMillis" : 30000,
"getLastErrorModes" : { },
"getLastErrorDefaults" : {
"w" : 1,
"wtimeout" : 0
},
"replicaSetId" : ObjectId("67d7f53d2d42a33b47b36ff2")
}
}
rs0:PRIMARY>
2. 监控关键指标
选举相关:
mongostat -e "repl_set_name,election_date,term" # 监控选举事件
- 复制延迟:
db.adminCommand({ replSetGetStatus: 1 }).members.map(m => m.optimeDate)
3. 灾难恢复方案
强制恢复单节点集群(极端情况):
// 在唯一存活的Secondary上执行
rs.reconfig({_id:"rs0", version:2, members:[{_id:1, host:"single-node:27017"}]}, {force:true})
六、与传统数据库对比
| 特性 | MongoDB副本集 | MySQL主从复制 |
|---|---|---|
| 故障切换 | 自动选举(秒级) | 需手动提升从库 |
| 数据一致性 | 最终一致性+可调强度 | 依赖半同步复制配置 |
| 读写分离 | 原生支持readPreference |
需中间件实现 |
| 网络分区容忍 | 优先保证可用性(AP) | 优先保证一致性(CP) |
mongo db集群故障选举分析的更多相关文章
- sql审核-避免离线sql导致的db集群故障
关键词: sql审核.sql审批.sql检查.sql检测.sql执行 离线sql可能会导致的问题 首先,什么是离线sql呢?就是说手动触发执行的这种sql:相对的还有在线sql,位于我们的程序代码中, ...
- ElasticSearch集群故障案例分析: 警惕通配符查询
最近ElasticSearch集群出现了 https://elasticsearch.cn/article/171 文章中描述的情况,现在转载全文警示下自己. 许多有RDBMS/SQL背景的开发者,在 ...
- mongodb集群故障转移实践
简介 NOSQL有这些优势: 大数据量,可以通过廉价服务器存储大量的数据,轻松摆脱传统mysql单表存储量级限制. 高扩展性,Nosql去掉了关系数据库的关系型特性,很容易横向扩展,摆脱了以往老是纵向 ...
- 【Redis】集群故障转移
集群故障转移 节点下线 在集群定时任务clusterCron中,会遍历集群中的节点,对每个节点进行检查,判断节点是否下线.与节点下线相关的状态有两个,分别为CLUSTER_NODE_PFAIL和CLU ...
- Redis源码阅读(六)集群-故障迁移(下)
Redis源码阅读(六)集群-故障迁移(下) 最近私人的事情比较多,没有抽出时间来整理博客.书接上文,上一篇里总结了Redis故障迁移的几个关键点,以及Redis中故障检测的实现.本篇主要介绍集群检测 ...
- Redis源码阅读(五)集群-故障迁移(上)
Redis源码阅读(五)集群-故障迁移(上) 故障迁移是集群非常重要的功能:直白的说就是在集群中部分节点失效时,能将失效节点负责的键值对迁移到其他节点上,从而保证整个集群系统在部分节点失效后没有丢失数 ...
- Mongo服务器集群配置【转】
http://www.cnblogs.com/wly923/tag/MongoDB/ 当前标签: MongoDB Mongo服务器集群配置学习三——分片 风行影者 2013-04-14 22:35 ...
- 云计算之路-阿里云上:docker swarm 集群故障与异常
在上次遭遇 docker swarm 集群故障后,我们将 docker 由 17.10.0-ce 升级为最新稳定版 docker 17.12.0-ce . 前天晚上22:00之后集群中的2个节点突然出 ...
- 云计算之路-阿里云上:部分服务器未及时续费造成docker swarm集群故障
非常非常抱歉,由于我们的疏忽 —— docker swarm 集群中的 2 台服务器没有及时续费,造成在夜里0点被自动关机,从而引发整个 docker swarm 集群故障,造成今天凌晨 0:30 ~ ...
- Storm集群启动流程分析
Storm集群启动流程分析 程序员 1.客户端运行storm nimbus时,会调用storm的python脚本,该脚本中为每个命令编写了一个方法,每个方法都可以生成一条相应的Java命令. 命令格式 ...
随机推荐
- superset 1.3版本WIN10安装实录
首先说下,为什么要这么做,因为二开需要,二开要有源码,然后对源码修改,编译,所以不能通过类似https://zhuanlan.zhihu.com/p/271695878这种方式,直接安装: 1.去Gi ...
- DPDK简介和原理
本文分享自天翼云开发者社区<DPDK简介和原理>,作者:s****n DPDK是一种绕过内核直接在用户态收发包来解决内核性能的瓶颈技术. 什么是中断 了解DPDK之前,首先需要先了解什么是 ...
- ZOS对象存储跨域资源访问的实现和使用
本文分享自天翼云开发者社区<ZOS对象存储跨域资源访问的实现和使用>,作者:对象存储二三事 跨域的定义 跨域指的是从一个域名去请求另外一个域名的资源,即跨域名请求.跨域时,浏览器不能执行其 ...
- StarUML画类图
1.Classes说明 [1]Class 类 [2]Interface 接口 [8]Generalization A与B的泛化关系,A继承B.继承非抽象类 [9]Interface Realizat ...
- HT-018 Div3 构造 题解 [ 黄 ] [ 数学 ] [ 结论 ]
构造:结论题,gcy数竞大佬tql%%%orz. 结论 先放结论:如果 \(x \bmod 4=2\) ,那么 \(x\) 无法被表示为 \(a^2-b^2\) 的形式:除此之外的其他数都可以. 证明 ...
- flutter-解决长按TextField出现英文(复制粘贴)问题
第一步 引入依赖 dependencies: flutter: sdk: flutter flutter_localizations: sdk: flutter 第二步 在main.dart中添加代码 ...
- 小程序开发实战案例五 | 小程序如何嵌入H5页面
在接入小程序过程中会遇到需要将 H5 页面集成到小程序中情况,今天我们就来聊一聊怎么把 H5 页面塞到小程序中. 本篇文章将会从下面这几个方面来介绍: 小程序承载页面的前期准备 小程序如何承载 H5 ...
- 【VMware vSphere】扩容或缩减 vCenter Server 的磁盘空间大小。
我们在部署 vCenter Server 时,根据不同环境的情况,可以选择不同的部署选项,比如环境中的主机可能运行了 100 个,或者虚拟机运行了 1000 个,此时按照官方推荐的选择"小型 ...
- 聊聊 FocusSearch/focus_mcp_sql:Text2SQL 的新玩法
最近在 GitHub 上逛的时候,发现了一个挺有意思的项目--FocusSearch/focus_mcp_sql.作为一个对 Text2SQL 有点小研究的前端码农,我忍不住想和大家聊聊这个工具.它不 ...
- [HAOI2018] 染色 题解
第一眼肯定想到容斥.设 \(G(k)\) 表示至少有 \(k\) 种颜色符合要求,\(F(k)\) 表示恰好有 \(k\) 种颜色符合要求.显然 \(k\) 的上界 \(t=\min(m,\lfloo ...