Kubernetes缩容后MongoDB副本集失效的恢复求助
解决MongoDB副本集缩容后状态无效的问题
核心原因
K8s缩容时直接删除Pod,但副本集配置未同步移除对应成员,导致存活节点无法识别有效副本集,且处于REMOVED状态无法执行常规重配置操作。
解决方案步骤
方法一:强制重配置副本集(优先尝试)
- 进入存活的MongoDB Pod,启动Mongo Shell:
kubectl exec -it mongors-0 -- mongo - 获取并修改当前副本集配置:
// 加载现有配置 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; - 执行强制重配置(跳过主节点校验限制):
rs.reconfig(cfg, {force: true}); - 验证副本集状态:
正常情况下会返回rs.status();ok: 1,副本集状态恢复有效。
方法二:重置副本集(方法一失效时使用)
如果强制重配置无效,需清除本地副本集元数据后重新初始化:
- 进入存活Pod,停止MongoDB进程:
kubectl exec -it mongors-0 -- bash kill -SIGTERM $(pidof mongod) - 删除本地副本集配置文件(仅清除副本集元数据,不影响业务数据):
rm -rf /data/db/replSetStartupLog.bson rm -rf /data/db/local.* - 退出Pod并让K8s自动重启实例:
exit kubectl delete pod mongors-0 - 重启后重新连接Mongo Shell,初始化单节点副本集:
kubectl exec -it mongors-0 -- mongovar cfg = { "_id": "rs0", "version": 1, "members": [ { "_id": 0, "host": "mongors-0.mongors-service.hes-all.svc:27017" } ] }; rs.initiate(cfg); - 验证状态:
rs.status();
后续预防措施
后续缩容MongoDB副本集时,需遵循先移除副本集成员、再缩容Pod的流程:
- 连接到副本集主节点,移除待删除的成员:
rs.remove("mongors-1.mongors-service.hes-all.svc:27017"); - 再执行K8s缩容命令:
kubectl scale statefulset mongors --replicas=1
内容的提问来源于stack exchange,提问作者Jordi
相关产品推荐
相关产品推荐

