You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kubernetes缩容后MongoDB副本集失效的恢复求助

解决MongoDB副本集缩容后状态无效的问题

核心原因

K8s缩容时直接删除Pod,但副本集配置未同步移除对应成员,导致存活节点无法识别有效副本集,且处于REMOVED状态无法执行常规重配置操作。

解决方案步骤

方法一:强制重配置副本集(优先尝试)

  1. 进入存活的MongoDB Pod,启动Mongo Shell:
    kubectl exec -it mongors-0 -- mongo
    
  2. 获取并修改当前副本集配置:
    // 加载现有配置
    var cfg = rs.config();
    // 仅保留存活节点(示例中保留mongors-0,删除其他成员)
    cfg.members = cfg.members.filter(member => member.host === "mongors-0.mongors-service.hes-all.svc:27017");
    // 配置版本号必须递增,否则重配置会失败
    cfg.version += 1;
    
  3. 执行强制重配置(跳过主节点校验限制):
    rs.reconfig(cfg, {force: true});
    
  4. 验证副本集状态:
    rs.status();
    
    正常情况下会返回ok: 1,副本集状态恢复有效。

方法二:重置副本集(方法一失效时使用)

如果强制重配置无效,需清除本地副本集元数据后重新初始化:

  1. 进入存活Pod,停止MongoDB进程:
    kubectl exec -it mongors-0 -- bash
    kill -SIGTERM $(pidof mongod)
    
  2. 删除本地副本集配置文件(仅清除副本集元数据,不影响业务数据):
    rm -rf /data/db/replSetStartupLog.bson
    rm -rf /data/db/local.*
    
  3. 退出Pod并让K8s自动重启实例:
    exit
    kubectl delete pod mongors-0
    
  4. 重启后重新连接Mongo Shell,初始化单节点副本集:
    kubectl exec -it mongors-0 -- mongo
    
    var cfg = {
      "_id": "rs0",
      "version": 1,
      "members": [
        {
          "_id": 0,
          "host": "mongors-0.mongors-service.hes-all.svc:27017"
        }
      ]
    };
    rs.initiate(cfg);
    
  5. 验证状态:
    rs.status();
    

后续预防措施

后续缩容MongoDB副本集时,需遵循先移除副本集成员、再缩容Pod的流程:

  1. 连接到副本集主节点,移除待删除的成员:
    rs.remove("mongors-1.mongors-service.hes-all.svc:27017");
    
  2. 再执行K8s缩容命令:
    kubectl scale statefulset mongors --replicas=1
    

内容的提问来源于stack exchange,提问作者Jordi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 09:20:29