一聚教程网:一个值得你收藏的教程网站

热门教程

MongoDB副本集为何无法识别新增成员_检查网络连通性与端口放行

时间:2026-07-03 10:54:46 编辑:袖梨 来源:一聚教程网

新增成员长期显示“DOWN”或“health”: 0,基本确定是网络层阻断;需用telnet或nc双向实测27017端口连通性,检查防火墙、安全组、bindIp配置(不能仅设127.0.0.1)、/etc/hosts双向解析、replSetName与keyFile严格一致。

新增成员在 rs.status() 中长期显示为 "stateStr": "DOWN""health": 0,基本可以确定是网络层阻断,而非配置语法错误或服务未启动。

用 telnet 或 nc 实测节点间 27017 端口连通性

别信 ping,也别只连自己;必须从「新增成员」所在机器,向「主节点」IP+端口发起连接测试,再反向测试一次:

  • telnet 192.168.86.11 27017(从新节点连主节点)
  • nc -zv 192.168.86.11 27017(Linux 下更准,不依赖 telnet 包)
  • 若失败,先临时关防火墙:sudo ufw disable(Ubuntu)或 sudo systemctl stop firewalld(CentOS)
  • 云服务器必须额外检查安全组——本地防火墙开了,安全组没放行,照样不通

确认 bindIp 配置是否允许跨节点访问

新增成员的 /etc/mongod.confnet.bindIp 若仍为默认的 127.0.0.1,它只会响应本机请求,其他节点发来的握手包直接被内核丢弃:

  • 正确写法是显式列出通信 IP:bindIp: 192.168.86.12,127.0.0.1(假设该节点内网 IP 是 192.168.86.12)
  • 0.0.0.0 虽能通,但必须配合防火墙严格限制来源 IP,生产环境不推荐
  • 改完必须重启服务:systemctl restart mongod,重载配置(systemctl reload)无效

检查 /etc/hosts 是否完成双向静态映射

如果副本集配置里写的是主机名(如 mongo2.example.com),而新增成员无法解析该名,rs.add() 或心跳就会卡在 STARTUP2 并报 HostNotFound

  • 在新增成员上执行:getent hosts mongo2.example.com,应返回真实内网 IP(非 127.0.0.1
  • 所有节点的 /etc/hosts 都要包含彼此的映射,例如:192.168.86.11 mongo1.example.com mongo1
  • 特别注意:新增成员自己的 hostname -f 输出,必须和它在 rs.conf() 中声明的 host 字段完全一致(大小写、无空格)

验证 keyFile 和 replSetName 是否完全一致

即使网络通了,新增成员也会因身份校验失败被拒之门外:

  • 所有成员的 replication.replSetName 必须完全相同(大小写敏感),且与 rs.initiate() 中的 _id 一致
  • 启用访问控制时,security.keyFile 文件内容必须字节级一致,权限必须是 600
  • 查日志确认:tail -f /var/log/mongodb/mongod.log | grep -i "key|repl|auth",常见报错如 Unable to load key file: Invalid argument

真正卡住的地方往往不是某一个点,而是多个条件叠加:比如 bindIp 没放开 + /etc/hosts 少写了一行 + 安全组没配。每次只改一项,然后立刻用 telnetrs.status() 验证,比一次性调一堆配置更可靠。

热门栏目