必须实测端口连通性而非仅依赖ping,因mongodb心跳与movechunk依赖tcp连接;需用nc/telnet验证各分片primary及config server端口(如27017/27019),结合mtr定位丢包跳点、确保/etc/hosts正反向解析一致,并排查tls/认证耗时对超时的影响。

直接测端口连通性,别只ping
ping通不代表MongoDB能通信,因为心跳和moveChunk走的是TCP连接,不是ICMP。很多运维卡在“ping得通但moveChunk失败”上,本质是端口被防火墙拦截、安全组没开、或mongod进程没监听正确地址。
必须用nc -zv或telnet实测目标分片primary的监听端口(如27017):
- 从
mongos机器执行:nc -zv shard1-primary-host 27017 - 从每个分片primary反向测其他分片primary和config server:
nc -zv config1 27019 - 若
nc超时或拒绝连接,优先查iptables、云平台安全组、以及mongod是否绑定了0.0.0.0而非127.0.0.1
用mtr定位丢包跳点,不是traceroute
traceroute只能看路径,mtr能持续打点并统计每跳丢包率和延迟,对云环境特别关键。MongoDB分片间通信敏感度高,平均延迟>50ms或丢包率>1%就足以触发moveChunk超时或replSetHeartbeat失败。
执行:mtr --report-cycles 10 --interval 1 shard2-primary-host
- 重点关注第3–6跳:云厂商内网网关、NAT设备、跨可用区通道
- 若最后一跳丢包率高但
telnet能通,说明目标主机禁ICMP但端口正常——这不是MongoDB问题,是网络策略限制 - 避免长期运行
mtr -r,某些云平台会限速甚至封IP
/etc/hosts正反向解析必须一致
看似无关的DNS问题,实际常导致副本集成员握手失败、rs.status()卡在STARTUP2、或not master错误反复出现。MongoDB分片通信依赖主机名解析,且要求正向(host→IP)和反向(IP→host)都成功。
- 所有分片节点、config server、mongos的
/etc/hosts里,必须互相写明完整主机名+对应IP -
mongos启动参数--configdb里的地址,必须和config server实际绑定的hostname完全一致;若config server监听0.0.0.0:27019,但--configdb写的是config1:27019,而config1解析到一个不可达内网IP,就会静默失败 - Kubernetes环境尤其注意Service DNS和Pod hostname是否对齐,别依赖默认ClusterIP解析
别忽略TLS握手和认证耗时
启用TLS或SCRAM认证后,心跳和moveChunk建立连接要多走几步:TCP三次握手 → TLS协商 → 认证校验。任意一环慢,都会吃掉默认10秒心跳超时或60秒moveChunk超时的余量。
- 用
openssl s_client -connect shard1-primary-host:27017 -tls1_2测TLS握手耗时,超过1秒就要警惕 - 确认所有节点使用相同CA、证书有效期未过、且
sslAllowConnectionsWithoutCertificates没被误开 - 若用LDAP或Kerberos,检查域控响应时间;延迟高时,考虑本地缓存凭证或降级为本地SCRAM
nc通了但TLS握手卡顿,mtr最后一跳不丢包但中间跳点延迟毛刺明显,或者/etc/hosts里少了一行反向解析。这些点不显眼,却能让整个分片集群在半夜开始报Location51008。











