转载请注明出处:

一、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.集群状态变化:

  1. 剩余节点:2个节点存活(1主1从或2从)。

  2. 选举能力

    • 三节点集群的多数(majority)= 2。

    • 剩余2个节点仍能形成多数,触发自动选举。

  3. 读写能力

    • 新主节点继续处理写操作(需满足w: majority)。

    • 读操作可正常进行(从新主或剩余从节点)。

  4. 数据安全

    • 若宕机节点是主节点:已确认的写操作(w: majority)不会丢失。

    • 若宕机节点是从节点:主节点继续服务,数据同步暂停直至节点恢复。

  5. 恢复流程

    • 自动故障转移(通常30秒内完成)。

    • 宕机节点恢复后自动同步增量数据。

  6. 选举日志:

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. 剩余节点:1个节点存活。

  2. 选举能力

    • 无法满足多数(2/3),无法选举新主

    • 原主节点若存活则继续服务,否则集群无主。

  3. 读写能力

    • 写操作:完全不可用(无主节点)。

    • 读操作

      • 若存活节点是主节点:可读(需客户端直连该节点)。

      • 若存活节点是从节点:需设置readPreference=secondary

  4. 数据风险

    • 若原主节点宕机且未持久化最新数据:可能丢失未复制到从节点的写操作。

  5. 恢复选项

    • 自动恢复:需至少一个节点恢复形成多数。

    • 强制恢复(高风险)

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. 数据同步流程

  1. Primary将写操作记录到local.oplog.rs集合

  2. Secondary定期拉取(fetch) Primary的oplog

  3. 应用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集群故障选举分析的更多相关文章

  1. sql审核-避免离线sql导致的db集群故障

    关键词: sql审核.sql审批.sql检查.sql检测.sql执行 离线sql可能会导致的问题 首先,什么是离线sql呢?就是说手动触发执行的这种sql:相对的还有在线sql,位于我们的程序代码中, ...

  2. ElasticSearch集群故障案例分析: 警惕通配符查询

    最近ElasticSearch集群出现了 https://elasticsearch.cn/article/171 文章中描述的情况,现在转载全文警示下自己. 许多有RDBMS/SQL背景的开发者,在 ...

  3. mongodb集群故障转移实践

    简介 NOSQL有这些优势: 大数据量,可以通过廉价服务器存储大量的数据,轻松摆脱传统mysql单表存储量级限制. 高扩展性,Nosql去掉了关系数据库的关系型特性,很容易横向扩展,摆脱了以往老是纵向 ...

  4. 【Redis】集群故障转移

    集群故障转移 节点下线 在集群定时任务clusterCron中,会遍历集群中的节点,对每个节点进行检查,判断节点是否下线.与节点下线相关的状态有两个,分别为CLUSTER_NODE_PFAIL和CLU ...

  5. Redis源码阅读(六)集群-故障迁移(下)

    Redis源码阅读(六)集群-故障迁移(下) 最近私人的事情比较多,没有抽出时间来整理博客.书接上文,上一篇里总结了Redis故障迁移的几个关键点,以及Redis中故障检测的实现.本篇主要介绍集群检测 ...

  6. Redis源码阅读(五)集群-故障迁移(上)

    Redis源码阅读(五)集群-故障迁移(上) 故障迁移是集群非常重要的功能:直白的说就是在集群中部分节点失效时,能将失效节点负责的键值对迁移到其他节点上,从而保证整个集群系统在部分节点失效后没有丢失数 ...

  7. Mongo服务器集群配置【转】

    http://www.cnblogs.com/wly923/tag/MongoDB/ 当前标签: MongoDB   Mongo服务器集群配置学习三——分片 风行影者 2013-04-14 22:35 ...

  8. 云计算之路-阿里云上:docker swarm 集群故障与异常

    在上次遭遇 docker swarm 集群故障后,我们将 docker 由 17.10.0-ce 升级为最新稳定版 docker 17.12.0-ce . 前天晚上22:00之后集群中的2个节点突然出 ...

  9. 云计算之路-阿里云上:部分服务器未及时续费造成docker swarm集群故障

    非常非常抱歉,由于我们的疏忽 —— docker swarm 集群中的 2 台服务器没有及时续费,造成在夜里0点被自动关机,从而引发整个 docker swarm 集群故障,造成今天凌晨 0:30 ~ ...

  10. Storm集群启动流程分析

    Storm集群启动流程分析 程序员 1.客户端运行storm nimbus时,会调用storm的python脚本,该脚本中为每个命令编写了一个方法,每个方法都可以生成一条相应的Java命令. 命令格式 ...

随机推荐

  1. MQ---消息队列概念和使用场景

    消息队列概念和使用场景 声明:本文转自:MQ入门总结(一)消息队列概念和使用场景 写的很好,都不用自己在整理了,非常感谢该作者的用心. 一.什么是消息队列  消息即是信息的载体.为了让消息发送者和消息 ...

  2. Svelte 最新中文文档翻译(5)—— 基础标记

    前言 Svelte,一个非常"有趣".用起来"很爽"的前端框架.从 Svelte 诞生之初,就备受开发者的喜爱,根据统计,从 2019 年到 2024 年,连续 ...

  3. Q:bash: fork: 无法分配内存,ssh无法连接新会话

    老版本系统的内核pid参数比较小(默认设置的是32768) 原因分析,– 内存不足或进程数超出限制– 系统内部的总进程数达到pid_max的上限,创建新进程看到以上提示 查看最大进程数 sysctl ...

  4. 《Vue2 框架入门第一课:基础概念与环境搭建》

    前端宇宙的新钥匙 --Vue2 在前端开发的广袤宇宙中,Vue2 框架宛如一把闪耀的钥匙,为开发者们开启了一扇通往高效.灵活构建用户界面的大门.随着互联网技术的飞速发展,前端开发的复杂性与日俱增,对开 ...

  5. FreeSql学习笔记——0.FreeSql启动!

    FreeSql FreeSql是功能强大的 .NET ORM,支持 .NetFramework 4.0+..NetCore 2.1+.Xamarin等支持 NetStandard 所有运行平台.支持  ...

  6. 【BUUCTF】Ping Ping Ping

    [BUUCTF]Ping Ping Ping (命令执行绕过总结) 题目来源 收录于:BUUCTF GXYCTF2019 题目描述 提示较为明确,get方法传参127.0.0.1后结果如下 比较容易想 ...

  7. git安装教程以及生成git ssh key

    问题 GitHub拉取代码需要SSH,总是忘记命令,现网百度.记录下来,以后靠自己的博文 第一步 安装git 地址: https://git-scm.com/download/win 安装它 第二步 ...

  8. linux服务器CPU占用100%,宝塔负载100%情况问题排查处理记录(CentOS 8.1系统)

    问题描述:linux服务器cpu占比达到100%,站点无法正常访问,宝塔面板进入后卡顿,负载显示也是持续100%(下方测试系统为CentOS 8.1) 排查可能:1.使用netstat命令查看目前的链 ...

  9. rust学习笔记(3)

    变量 变量默认是不可变的 不能使用没有初始化的变量 作用域 变量离开作用域之后会直接释放, 无法再次使用; 在内部代码块中定义的变量会导致外部的变量被遮蔽 类型转换 部分类型可以隐式转换, 部分类型需 ...

  10. IvorySQL 增量备份与合并增量备份功能解析

    1. 概述 IvorySQL v4 引入了块级增量备份和增量备份合并功能,旨在优化数据库备份与恢复流程.通过 pg_basebackup 工具支持增量备份,显著降低了存储需求和备份时间.同时,pg_c ...