找回密码
 立即注册
首页 业界区 业界 mongo db集群故障选举分析

mongo db集群故障选举分析

锦惺 4 天前
转载请注明出处:
一、MongoDB集群基础架构

1. 副本集(Replica Set)核心原理


  • 节点角色

    • Primary:唯一可写节点,处理所有写操作和默认读请求
    • Secondary:异步复制Primary数据,可配置为只读节点
    • Arbiter(可选):不存储数据,仅参与投票

  • 选举机制

    • 基于Raft协议,需多数节点存活(N/2 +1)才能选出Primary
    • 每个节点有1票,Arbiter无数据但有投票权

  • 数据同步

    • 通过Oplog(操作日志)实现异步复制
    • 写操作需满足writeConcern级别才返回成功

2. 三节点典型部署
  1. Node1: Primary (投票权=1)
  2. Node2: Secondary (投票权=1)
  3. Node3: Secondary/Arbiter (投票权=1)
  4. 多数票数(majority)=2
复制代码
二、单节点故障场景分析

1.集群状态变化:


  • 剩余节点:2个节点存活(1主1从或2从)。
  • 选举能力

    • 三节点集群的多数(majority)= 2。
    • 剩余2个节点仍能形成多数,触发自动选举。

  • 读写能力

    • 新主节点继续处理写操作(需满足w: majority)。
    • 读操作可正常进行(从新主或剩余从节点)。

  • 数据安全

    • 若宕机节点是主节点:已确认的写操作(w: majority)不会丢失。
    • 若宕机节点是从节点:主节点继续服务,数据同步暂停直至节点恢复。

  • 恢复流程

    • 自动故障转移(通常30秒内完成)。
    • 宕机节点恢复后自动同步增量数据。

  • 选举日志:
    1.png

2. 故障节点类型

故障节点集群行为影响范围Primary剩余2个Secondary触发选举,30秒内选出新Primary写入中断 last event time[/code]</ul></ul>四、核心机制深度解析

1. 选举触发条件
  1. db.products.insert(
  2.   { item: "card", qty: 15 },
  3.   { writeConcern: { w: "majority", j: true } }  // j=true表示持久化到磁盘
  4. )
复制代码
2. 数据同步流程


  • Primary将写操作记录到local.oplog.rs集合
  • Secondary定期拉取(fetch) Primary的oplog
  • 应用oplog到本地数据集(异步过程)
3. 故障恢复时序
  1. // 在Primary上查看oplog时间窗口
  2. rs.printReplicationInfo()
  3. // 输出示例:oplog first event time -> last event time
复制代码
五、生产环境建议

1. 部署优化


  • 跨机房容灾
    1.   A[节点检测Primary无响应] --> B[发起选举请求]
    2.     B --> C{获票数≥majority?}
    3.     C -->|Yes| D[成为新Primary]
    4.     C -->|No| E[等待重试]
    复制代码
  • 优先级配置
    1. 故障检测(10s) → 选举阶段(30s) → 数据同步(依赖网络带宽)
    复制代码
    以下是一个集群配置下的 : rs.conf() 配置:
    1. 机房A: Primary + Secondary
    2. 机房B: Secondary
    复制代码
2. 监控关键指标


  • 选举相关
    1. // 确保特定节点优先成为Primary
    2. cfg = rs.conf()
    3. cfg.members[0].priority = 2
    4. cfg.members[1].priority = 1
    5. rs.reconfig(cfg)
    复制代码
  • 复制延迟
    1. rs0:PRIMARY> rs.conf()
    2. {
    3.         "_id" : "rs0",
    4.         "version" : 222935,
    5.         "protocolVersion" : NumberLong(1),
    6.         "writeConcernMajorityJournalDefault" : true,
    7.         "members" : [
    8.                 {
    9.                         "_id" : 0,
    10.                         "host" : "mongo1:27017",
    11.                         "arbiterOnly" : false,
    12.                         "buildIndexes" : true,
    13.                         "hidden" : false,
    14.                         "priority" : 2,
    15.                         "tags" : {
    16.                         },
    17.                         "slaveDelay" : NumberLong(0),
    18.                         "votes" : 1
    19.                 },
    20.                 {
    21.                         "_id" : 1,
    22.                         "host" : "mongo2:27017",
    23.                         "arbiterOnly" : false,
    24.                         "buildIndexes" : true,
    25.                         "hidden" : false,
    26.                         "priority" : 2,
    27.                         "tags" : {
    28.                         },
    29.                         "slaveDelay" : NumberLong(0),
    30.                         "votes" : 1
    31.                 },
    32.                 {
    33.                         "_id" : 2,
    34.                         "host" : "mongo3:27017",
    35.                         "arbiterOnly" : false,
    36.                         "buildIndexes" : true,
    37.                         "hidden" : false,
    38.                         "priority" : 2,
    39.                         "tags" : {
    40.                         },
    41.                         "slaveDelay" : NumberLong(0),
    42.                         "votes" : 1
    43.                 }
    44.         ],
    45.         "settings" : {
    46.                 "chainingAllowed" : true,
    47.                 "heartbeatIntervalMillis" : 2000,
    48.                 "heartbeatTimeoutSecs" : 10,
    49.                 "electionTimeoutMillis" : 10000,
    50.                 "catchUpTimeoutMillis" : -1,
    51.                 "catchUpTakeoverDelayMillis" : 30000,
    52.                 "getLastErrorModes" : {
    53.                 },
    54.                 "getLastErrorDefaults" : {
    55.                         "w" : 1,
    56.                         "wtimeout" : 0
    57.                 },
    58.                 "replicaSetId" : ObjectId("67d7f53d2d42a33b47b36ff2")
    59.         }
    60. }
    61. rs0:PRIMARY>
    复制代码
3. 灾难恢复方案


  • 强制恢复单节点集群(极端情况):
    1. mongostat -e "repl_set_name,election_date,term"  # 监控选举事件
    复制代码
六、与传统数据库对比

[table]特性MongoDB副本集MySQL主从复制故障切换自动选举(秒级)需手动提升从库数据一致性最终一致性+可调强度依赖半同步复制配置读写分离原生支持readPreference需中间件实现网络分区容忍优先保证可用性(AP)优先保证一致性(CP)  

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册