如何在Kubernetes部署的MongoDB副本集中恢复备份?
如何将本地MongoDB备份恢复到Kubernetes中的MongoDB副本集
两种可行方案(无需强制进入Pod Shell)
你提到的进入Pod Shell是可选方案,但更高效的方式是直接本地远程连接恢复,以下是两种方案的详细操作:
方案一:本地直接远程连接副本集恢复(推荐)
MongoDB副本集只需要连接到**主节点(Primary)**执行恢复,主节点会自动将数据同步到所有副本节点(Secondary),无需逐个操作。
操作步骤:
- 获取副本集的连接信息:可以是K8s集群内部的Service地址(如果本地能打通集群网络),或者外部暴露的LoadBalancer/NodePort地址。
- 执行
mongorestore命令,指定副本集连接字符串:
mongorestore -u adminUser --authenticationDatabase admin --gzip --archive=/tmp/file.gz \ --uri="mongodb://adminUser:<你的密码>@<主节点IP>:27017,<副本节点IP>:27017/?authSource=admin&replicaSet=<副本集名称>"
注意:连接字符串中可以包含多个节点,MongoDB客户端会自动识别并连接到主节点;如果备份时指定了
--db <dbname>,恢复时可以在URI末尾加上<dbname>来指定目标库。
方案二:进入Pod内部执行恢复(适合网络隔离场景)
如果本地无法直接访问K8s集群内的MongoDB,可通过kubectl将备份文件传入Pod后执行恢复:
- 把本地备份文件传到目标Pod:
kubectl cp /tmp/file.gz <目标Pod名称>:/tmp/file.gz -n mongodb
- 进入Pod的Shell环境:
kubectl exec -it <目标Pod名称> -n mongodb -- bash
- 在Pod内执行恢复命令(官方MongoDB镜像默认自带
mongorestore工具):
mongorestore -u adminUser --authenticationDatabase admin --gzip --archive=/tmp/file.gz
注意:尽量选择主节点Pod执行恢复,避免因副本节点只读权限导致操作失败;恢复完成后,副本集会自动同步数据到其他节点。
副本集恢复的关键注意事项
- 优先连接主节点:副本节点默认是只读状态,无法执行恢复操作,必须确保连接到主节点。
- 可选:暂停故障转移:恢复前可在主节点执行
rs.stepDown(600)(暂停600秒故障转移),避免恢复过程中主节点切换导致中断。 - 权限验证:确保
adminUser拥有restore和readWrite权限,否则会报错。
内容的提问来源于stack exchange,提问作者user3142695
相关产品推荐
相关产品推荐

