mongodump带--oplog通过k8s Headless Service备份MongoDB报错如何解决
错误根因
你使用的Kubernetes Headless Service会将请求随机负载到MongoDB副本集的所有节点(主节点+从节点),当请求路由到从节点时,MongoDB默认禁止从从节点读取数据,且mongodump默认未配置从节点读取权限,因此触发not master and slaveOk=false报错。你直接进入主节点Pod执行命令时默认连接本地主实例,因此可以正常运行。
可行解决方案
可任选以下任意一种方案解决问题:
方案1:修改连接URI,新增读偏好参数
调整URI为如下格式,优先路由到主节点执行备份:mongodump --uri="mongodb://mongo.database.svc:27017/?replicaSet=rs0&readPreference=primaryPreferred" --oplog --out=/mnt/k8sMount/mongodb-dump/如需强制只走主节点备份,可将
readPreference的值改为primary,和直接在主节点Pod执行的效果完全一致。方案2:为mongodump命令新增读偏好参数
无需修改URI,直接在命令中加--readPreference参数即可:mongodump --uri="mongodb://mongo.database.svc:27017/?replicaSet=rs0" --oplog --readPreference=primaryPreferred --out=/mnt/k8sMount/mongodb-dump/
注意事项
- 4.x版本MongoDB的
readPreference参数配置生效后会自动开启slaveOk权限,无需额外单独配置 - 使用
--oplog参数时,无论走主节点还是从节点备份,都可以保证备份数据的时间点一致性 - 备份完成后可执行
mongorestore --dry-run /mnt/k8sMount/mongodb-dump/验证备份文件的完整性
内容的提问来源于stack exchange,提问作者rakesh kotian
相关产品推荐
相关产品推荐

