克隆MongoDB副本集需严格同步keyFile(chmod 400)、主节点创建root用户、清空dbPath、正确配置auth参数及足够oplogSize,否则初始同步失败。

直接克隆 MongoDB 数据库不能靠 mongodump + mongorestore 简单“复制粘贴”完事——尤其当目标是带认证的副本集时,权限、oplog 同步状态、keyFile 一致性、用户角色继承这几个环节一错,整个同步就卡在初始化阶段或后续认证失败。
副本集初始同步前必须确保 keyFile 完全一致且权限严格
所有节点(包括主、从、仲裁)必须使用同一份 mongo.keyfile,且文件权限必须为 400(即只读,属主可读)。600 都会报错:permissions on /path/to/mongo.keyfile are too open。常见错误是:生成后用 scp 拷贝到其他节点时,目标机上 umask 导致权限变宽;或者用 chmod 600 后没再检查实际权限(比如 SELinux 上下文干扰)。
- 生成命令必须用
openssl rand -base64 90 -out /mongo/mongo.keyfile(长度够、无换行) - 拷贝后立刻在每台节点执行:
chmod 400 /mongo/mongo.keyfile && chown mongod:mongod /mongo/mongo.keyfile - 配置文件中指定路径必须与实际路径完全一致,且
mongod进程用户(如mongod)要有读取权限
认证用户必须在主节点 admin 库创建,且角色为 root 或含 clusterAdmin
副本集内用户数据不自动同步——但 admin 库中的用户元数据会通过 oplog 复制到所有节点。所以你只能在主节点上执行 db.createUser(),且必须赋予能管理集群的角色,否则从节点无法参与选举或执行 rs.status() 等操作。
- 不要在
test或其他业务库建管理员账号;use admin后再操作 - 角色至少包含
{"role": "root", "db": "admin"};仅readWrite不足以完成初始同步 - 创建后立即用
db.auth("user", "pwd")测试,失败说明用户未生效或密码错
启动新节点前,必须关闭旧节点并清空 dbPath 目录
如果目标节点之前运行过 MongoDB(哪怕只是试跑),其 local 数据库里可能残留旧的 oplog 或 replica set 元数据,导致新加入时拒绝同步,报错类似:node is not in the same replica set as this node 或 Our replica set ID differs from the one in the config。
- 停掉该节点的
mongod进程:sudo systemctl stop mongod或kill -2 $(cat /var/run/mongodb/mongod.pid) - 彻底清空
dbPath(如/var/lib/mongodb),保留目录结构但删光里面所有文件和子目录 - 确保
oplogSizeMB在配置中设得足够大(建议 ≥10240),否则初始同步中途因 oplog 回滚而失败
连接新节点时,认证参数顺序和数据库名不能错
用 mongo shell 连接带认证的副本集节点时,--authenticationDatabase 必须指定为 admin,且必须放在用户名/密码参数之后;否则即使账号正确,也会提示 Authentication failed。
- 正确写法:
mongo --host rs0.example.com:27017 -u "myroot" -p "123456" --authenticationDatabase "admin" - 错误写法:
mongo -u "myroot" --authenticationDatabase "admin" -p "123456" --host ...(部分版本会忽略--authenticationDatabase) - 若用连接字符串,格式应为:
mongodb://myroot:123456@rs0.example.com:27017/?authSource=admin
最易被忽略的是:初始同步期间,目标节点的 local.oplog.rs 会被截断重建,这意味着如果你在同步中途重启该节点,它不会“续传”,而是从头开始——所以务必保证网络稳定、磁盘 I/O 不阻塞、oplog 足够大。同步完成后,再通过 rs.status() 确认状态为 "stateStr" : "SECONDARY" 且 "optimeDate" 接近当前时间,才算真正就位。











