MongoDB 4.4副本集跨AWS账号AMI迁移后认证失败无法连接
环境信息
- 操作系统:Ubuntu 18.04
- MongoDB版本:MongoDB shell version v4.4.14
故障现象
基于3节点MongoDB副本集的源EC2实例制作AMI镜像,跨AWS账号启动新实例后,mongod服务进程可正常启动,但所有身份认证操作失败,无法连接MongoDB服务:
- 源环境可正常使用的连接命令:
mongo -u "adminuser" -p "adminpass" --authenticationDatabase "admin"
- 新实例执行上述命令返回
Authentication failed,进程退出码为1。 - 查看MongoDB运行日志核心信息:
SCRAM-SHA-256、SCRAM-SHA-1机制认证失败,错误为
UserNotFound: Could not find user "srrclusteradmin" for db "admin";同时提示Replication has not yet been configured、config.system.sessions does not exist;WiredTiger存储引擎检查点相关日志无异常。 - 已排查确认配置项:
- mongod配置中keyFile路径、副本集名称
mongors配置正确 - systemd服务启动参数已添加
--auth标识 - bindIp、数据存储目录、日志路径与源环境完全一致
- 本地直连mongo shell切换至admin库,执行
db.auth("adminuser", passwordPrompt())输入正确密码仍认证失败 - 执行
show dbs返回NotPrimaryNoSecondaryOk错误 - 源环境可用的所有管理员账号密码在新实例全部失效,无法访问存量业务数据
- mongod配置中keyFile路径、副本集名称
故障根因
- 跨账号通过AMI启动单实例时,原3节点副本集的配置仍保存在节点local库中,但当前仅启动单个节点,无法满足副本集投票多数要求,节点无法自动选举为主,处于副本集不可用状态,因此执行查询等操作会返回
NotPrimaryNoSecondaryOk错误。 - 开启
--auth与keyFile认证的MongoDB副本集,在未完成主节点选举、集群状态未正常收敛时,无法读取admin库下的系统用户集合,会抛出UserNotFound的假报错,并非用户数据丢失、密码错误。 - 日志中
config.system.sessions does not exist为副本集单节点首次启动时的正常提示,主节点选举完成后会自动生成该集合,不影响存量业务数据完整性。
解决步骤
- 停止当前运行的mongod服务
systemctl stop mongod
- 临时以无认证、仅本地监听的方式启动mongod,必须保留原副本集名称配置,不要修改原数据目录,避免公网暴露无认证的数据库服务:
mongod --dbpath /var/lib/mongodb --logpath /var/log/mongodb/mongod.log --bind_ip 127.0.0.1 --port 27017 --replSet mongors --fork
如果数据目录、日志路径、副本集名称与示例不一致,替换为实际环境的对应值即可。
3. 本地直连mongo shell:
mongo
- 清理旧副本集配置,强制将当前节点重配置为单节点副本集成员:
// 切换到local库删除旧的3节点副本集配置 use local db.system.replset.deleteMany({}) // 切换到admin库执行强制重配置 use admin rs.reconfig( { _id: "mongors", members: [ // 如果后续仅需单节点访问填localhost:27017,需要扩展多节点则填当前实例内网IP:27017 {_id: 0, host: "localhost:27017"} ] }, {force: true} )
- 等待10-20秒,执行
rs.status()确认当前节点状态变为PRIMARY。 - 验证用户认证与数据访问是否恢复正常:
use admin // 认证成功将返回1 db.auth("adminuser", "adminpass") // 正常返回所有数据库列表即代表数据访问恢复 show dbs
- 验证完成后,停止临时启动的mongod进程:
ps aux | grep mongod | grep -v grep kill <上述命令输出的mongod进程PID>
- 恢复mongod配置文件中
security.authorization: enabled、security.keyFile的原有认证配置,通过systemd正常启动mongod服务:
systemctl start mongod
- 服务启动完成后,使用原有连接命令即可正常认证、访问所有业务数据。如果后续需要恢复3节点副本集,在当前单节点为主的状态下通过
rs.add()添加其他节点即可,无需重建用户或重新导入数据。
内容的提问来源于stack exchange,提问作者Chetan Sachdev
相关产品推荐
相关产品推荐

