Nacos 故障排查
下面是一份 真正生产可用的 Nacos 故障排查指南(最全版)。
覆盖:注册中心问题、配置中心问题、集群问题、MySQL 问题、gRPC 通信、端口、客户端问题、性能瓶颈、日志定位。
这是 运维、后端、架构师都能直接拿来用的实战手册。
Nacos 故障 -> 80% 按下面 5 步就能定位:
- 看端口(8848、9848、7848 是否正常)
- 看 MySQL(连接、慢 SQL、连接池,是否 down)
- 看节点状态 /nacos/v1/ns/operator/servers
- 看日志(naming、config、core,几乎全部能看到)
- 看客户端错误(gRPC 连不通、心跳失败、没有推送)
这些就是 80% 的根因。
🔍 常见原因
- 心跳失败 -> 临时实例被自动下线
- Pod 健康检查太严格
- 网络抖动
- 客户端时间和 Nacos 差太大
- gRPC(9848)不通
① 放宽心跳参数(客户端)
spring.cloud.nacos.discovery.heart-beat-interval=5000
spring.cloud.nacos.discovery.heart-beat-timeout=20000
spring.cloud.nacos.discovery.ip-delete-timeout=30000
② Kubernetes 健康检查调整
livenessProbe:
periodSeconds: 30
readinessProbe:
periodSeconds: 30
③ 检查客户端 -> Nacos gRPC 通道
telnet nacos-ip 9848
🔍 常见原因
- 使用 Nginx 代理导致 gRPC 断开
- 跨机房延迟过高
- Nacos 节点时间不一致
- Nacos cluster 节点不可达
✅ 检查 gRPC(必须要通)
telnet ${nacos-ip} 9848
✅ 检查节点状态
访问任意节点:
/nacos/v1/ns/operator/servers
如果有节点 DOWN -> 说明集群通信 7848 失败。
这是 3 节点集群里最“坑”的问题。
🔍 常见原因
- 管理员让客户端连接“单节点”而不是 LB
- Nacos 本身 gRPC 集群同步延迟(2.x 经常出现)
- MySQL 慢 SQL 导致数据更新不一致
✅ 必须让客户端连 LB(重要)
正确:
http://nacos-lb:8848
错误:
http://nacos-node1:8848
✅ 检查 gRPC 同步(Naming log)
logs/naming-server.log
🔍 原因
- 客户端通过 LB,但来自不同节点
- 客户端防火墙阻断 9848
- 配置格式问题(YAML 缩进)
- Spring @RefreshScope 没生效
- DataID 不一致
✅ 排查步骤(按顺序)
1)客户端日志检查:
Refresh config error
Listener receive error
2)测试长轮询(Config 2.x 用 gRPC)
telnet nacos-ip 9848
3)检查 DataId 是否正确
web 控制台查看实际 DataId / Group。
4)检查 @RefreshScope 是否加在对应类上。
原因
- 集群节点卡住(CPU / GC)
- MySQL 压力大
- 客户端长轮询阻塞
解决
- 增加 JVM:Xms4g - Xmx4g
- 优化 MySQL:连接池 / redo log
- 扩容 Nacos 节点
原因
- 7848 集群通信端口不通
- docker/k8s 容器 NAT 问题
- 集群 IP 配错(cluster.conf)
解决
telnet 192.168.X.X 7848
检查 cluster.conf:
192.168.10.11:8848
必须使用内网 IP,不要写 127.0.0.1。
原因
- 不要部署 2 节点
- MySQL 写入失败
- 网络分区(机房隔离)
解决
- 必须 3 节点以上
- 节点间使用专线或同内网
- MySQL 监控 IOPS
原因
- 第一个节点没连上 MySQL
- 另一个节点从空数据库启动 -> 数据错乱
解决
- 确保 MySQL 先启动
- 首次启动按顺序:Node1 -> Node2 -> Node3
Nacos 80% 故障都是 MySQL 连接问题。
查看 logs/nacos.log:
java.sql.SQLNonTransientConnectionException
Communications link failure
排查
mysql -h192.168.x.x -unacos -p
Nacos 常见慢 SQL:
SELECT * FROM config_info WHERE data_id = ? AND group_id = ?
排查:
SHOW PROCESSLIST;
解决:
- 给 config_info 加索引
- MySQL 调大 innodb_buffer_pool_size
日志:
HikariPool-1 - Connection is not available
解决:
db.pool.config.connectionTimeout=3000
db.pool.config.maximumPoolSize=50
表现:
Full GC (Allocation Failure)
解决:
-Xms4g -Xmx4g -XX:+UseG1GC
原因:
- 配置推送过多
- 客户端实例数量过大(>10k)
- MySQL 慢
解决:
- 分环境拆 namespace
- 分服务 Group
- 扩容节点(>5)
日志:
grpc connect timeout
原因:
- gRPC 端口 9848 未开
- 客户端连的是单节点 IP
解决:
spring.cloud.nacos.server-addr=http://nacos-lb:8848
排查:
Listener receive error
根因:
- gRPC 通道断开 -> 9848
| 日志文件 | 用途 |
|---|---|
| naming-server.log | 服务注册、心跳、健康检查 |
| config-server.log | 配置推送、监听、diff |
| core-auth.log | 鉴权、登录失败 |
| start.out | 启动过程问题 |
| nacos.log | 统一日志(部分异常) |
| 问题 | 根因 | 解决方法 |
|---|---|---|
| 服务上下线频繁 | 心跳丢失 / gRPC 不通 | 调心跳,开 9848 |
| 配置不刷新 | YAML 错 / gRPC 错 | 修 YAML;开 9848 |
| 节点 DOWN | 7848 不通 | 打通节点通信端口 |
| 服务列表不一致 | 客户端连单节点 | 一律走 LB |
| 集群节点不互通 | cluster.conf 配错 | 改成内网 IP |
| MySQL 连接失败 | 用户密码/防火墙 | 修权限 |
| MySQL 慢导致卡顿 | 无索引 | 加索引优化 |
| 高 CPU | 推送量大/GC | 扩容/调 JVM |
| 脑裂 | 双节点/网络隔离 | 3 节点以上 |
| gRPC 超时 | 防火墙拦截 | telnet 9848 |