MongoDB副本集初始化后添加Secondary节点失败求助
MongoDB副本集添加Secondary节点失败排查与解决
咱们先梳理下你遇到的核心问题:执行添加节点的脚本时终端卡住,日志显示等待配置传播到多数节点,secondary节点完全没同步(同步时间停在1970年),虽然telnet能通端口,但节点之间的通信或认证肯定出了问题。下面一步步拆解解决:
一、优先排查KeyFile一致性问题
这是副本集节点间认证最常见的坑:
- 所有副本集节点的
keyFile内容必须完全一模一样,并且文件权限必须是600(只有所有者能读写,其他用户无权限)。如果keyFile不一致,节点之间无法通过认证,心跳会失败,配置自然传不过去。 - 你可以在每个节点上执行以下命令检查:
# 查看keyFile内容 cat /etc/zzzzzkey.key # 查看文件权限 ls -l /etc/zzzzzkey.key
- 如果发现内容不一致,把primary节点的keyFile复制到所有secondary节点,然后重启每个节点的mongod服务:
systemctl restart mongod
二、统一副本集成员的地址格式(主机名/IP)
从你的日志能看到,primary节点的标识是MongoD-1:27017(主机名),但你添加secondary用的是IP,这会导致节点间解析或通信异常:
- 解决方案二选一:
- 全用主机名:在所有节点的
/etc/hosts里添加所有节点的主机名-IP映射:
然后修改你的添加脚本用主机名:10.0.1.170 MongoD-1 10.0.2.157 MongoD-2 10.0.3.88 MongoD-3rs.add( { host: "MongoD-2:27017" } ) rs.add( { host: "MongoD-3:27017" } ) - 全用IP:重新初始化primary节点的副本集配置(注意:如果已经有数据,先备份!),用IP代替主机名:
之后再用IP添加secondary节点。// 登录primary的mongo shell后执行 rs.initiate( { _id : "Shard_0", members: [ { _id : 0, host : "10.0.1.170:27017" } ] } )
- 全用主机名:在所有节点的
三、分步添加节点,避免一次性操作
不要一次性添加两个节点,这样容易因为某个节点异常导致整个操作卡住:
- 登录primary的mongo shell,先添加第一个节点:
rs.add("10.0.2.157:27017") - 执行
rs.status()检查节点状态,等待它从STARTUP变为SECONDARY(这个过程可能需要几分钟,取决于数据量)。 - 确认第一个节点正常后,再添加第二个节点:
rs.add("10.0.3.88:27017")
四、检查Secondary节点的同步状态
当前面的问题解决后,同步到1970年的问题会自动修复。你可以用官方推荐的新命令查看同步状态:
rs.printSecondaryReplicationInfo()
如果还是异常,登录secondary节点查看mongod日志,看是否有authentication failed或connection refused之类的错误,针对性解决。
关于日志里的Sharding警告
日志里的ShardingStateNotInitialized是因为你把节点配置成了shardsvr但还没加入分片集群,这个不影响副本集的正常运行,后续如果要搭建分片集群再处理即可。
内容的提问来源于stack exchange,提问作者JPNagarajan




