根本原因是local.system.replset表硬编码旧域名,必须确保所有节点对新域名的正反向解析一致且能telnet通;rs.reconfig()需在PRIMARY执行、version递增、host全部可解析,否则报“NodeNotFound”或“not master”。

rs.status() 显示旧域名但连接失败
这是最典型的误判信号:你改了 DNS 或 /etc/hosts,rs.status() 仍显示老域名,mongo --host old-name:27017 却连不上——说明副本集配置没更新,不是 DNS 问题,是 local.system.replset 表里还存着旧地址。
- 执行
rs.conf()查看当前配置中每个成员的host字段,确认是否已更新为新域名 - 若未更新,必须调用
rs.reconfig(),但注意:version必须比当前rs.conf().version大 1,否则直接拒绝 - 不能从
SECONDARY节点发起rs.reconfig(),必须连到当前PRIMARY再操作 - 所有新域名必须能在每个节点上执行
nslookup new-node.example.com和telnet new-node.example.com 27017成功
telnet 域名端口通但 rs.initiate() 后卡在 STARTUP2
这说明网络层通了,但 MongoDB 内部校验失败。常见于:主节点自己无法反向解析新成员的域名,或解析结果与配置中写的不一致(比如配置写 node1.example.com,但主节点 nslookup node1.example.com 返回 127.0.0.1)。
- 在主节点上执行
nslookup和ping验证每个成员域名,确保返回的是真实 IP(非 127.0.0.1) - 检查所有节点的
/etc/hosts是否统一,避免 A 节点写192.168.10.11 node1.example.com,B 节点却写127.0.0.1 node1.example.com - 确认 mongod 启动时绑定的
bindIp包含该域名对应的真实网卡 IP,而非仅127.0.0.1 - MongoDB 5.0+ 强制要求副本集成员必须用域名,禁用纯 IP;若你混用了 IP 和域名,集群无法达成法定人数(quorum)
rs.reconfig() 报 “NodeNotFound” 或 “not master”
这两个错误看似不同,根源高度重合:要么你没连对主节点,要么新配置里某个 host 值在当前节点本地根本无法解析。
-
not master:说明你正在SECONDARY上执行rs.reconfig();先rs.stepDown()或换连到PRIMARY -
NodeNotFound:mongod 在加载新配置前会逐个尝试解析每个host,只要有一个失败(DNS NXDOMAIN、超时、或返回 127.0.0.1),就立刻报错退出,不会继续校验后续项 - 检查日志:
grep "hostname" /var/log/mongodb/mongod.log,通常紧挨着报错行会有类似Failed to resolve hostname 'node2.example.com'的提示 - 临时方案:在所有节点的
/etc/hosts中显式绑定新域名到正确 IP,比依赖 DNS 更可靠
nslookup 验证,就可能让集群在半夜降级。


















